今天寫(xiě)代碼涉及到大量的String操作,突然間想起一些關(guān)于String與其它c(diǎn)lass的不同之處,我是我以前在一篇文章上看到的,具體出處實(shí)在記不得了,現(xiàn)在加上一點(diǎn)兒自己的理解記錄下來(lái),以作備忘。
String的特殊之處就是它可以像int等簡(jiǎn)單類(lèi)型一樣,使用“=”來(lái)生成一個(gè)Object,而不必用new這個(gè)關(guān)鍵字,為什么呢?先來(lái)看下面的代碼:
import junit.framework.TestCase;


public class TestStringPool extends TestCase
{

private String string1;
private String string2;


protected void setUp()
{
string1 = "abc";
string2 = "abc";
}


public void testStringPool()
{
assertTrue(string1 == string2);
}


public void testNewString()
{
string1 = new String("abc");
string2 = new String("abc");
assertFalse("The objects don't use the
string pool", string1 == string2);
}
}
String的特殊之處就是它可以像int等簡(jiǎn)單類(lèi)型一樣,使用“=”來(lái)生成一個(gè)Object,而不必用new這個(gè)關(guān)鍵字,為什么呢?先來(lái)看下面的代碼:































這里用到了JUnit,用來(lái)測(cè)試String pool。
第一個(gè)測(cè)試,說(shuō)明兩個(gè)String是同一個(gè)Object,(==就是用來(lái)比較object的reference)。而第二個(gè)測(cè)試則說(shuō)明兩個(gè)String Object不同。
眾所周知,Java的String是不可改變的字符串對(duì)象。為了提高效率,Java為String類(lèi)提供了串池(String pool)。正如大家所看到的那樣,在第一個(gè)test中就使用了串池。當(dāng)你重新聲明一個(gè)String型變量為abc時(shí),將使用串池里原來(lái)的那個(gè)abc,而不重新分配內(nèi)存,也就是說(shuō),string2與string1將會(huì)指向同一塊內(nèi)存。所以結(jié)果為true。在第二個(gè)test case中使用了普通對(duì)象的聲明方式,系統(tǒng)將會(huì)為string1和string2各分配一塊內(nèi)存。所以結(jié)果為false。
結(jié)論:我們比較兩個(gè)String的值,最好用equals()方法,而最好不要使用==。這就避免了一些不必要的麻煩。另外,聲明String的時(shí)候,最好用=,這樣就可以體現(xiàn)String pool的作用了。