<PRE class=java name=code><FONT size=>class StringTest
{
public static void main(String[] args){
String str = new String(abc);//此句代碼產生後在內存中會產生幾個對象?
/*
*分析首先Java會根據abc在String Pool(字符串池)中查找abc如果沒有該
*字符串則在String Pool中創建一個對象然後在通過new關鍵字在Java內存堆棧中創建
*一個abc對象並且由s變量指向它
*/
String str = abc;//此句代碼產生後在內存中會產生幾個對象?
/*
*分析在執行第二句代碼時Java會依據上面的順序首先在String Pool中查找abc如果
*找到有此項則變量str指向String Pool中的abc
*/
Systemoutprintln(str == str); //等號較的是內存地址 false
Systemoutprintln(strequals(str));//比較的是值得內容 true
String str = abc;
Systemoutprintln(str == str);
String str = new String(abc);//此句代碼產生後在內存中會產生幾個對象?
/*
*在執行第三句代碼時Java首先也會在String Pool中查找abc對象然後在內存堆棧
*中創建一個新的對象abc並且str變量指向它
*/
Systemoutprintln(str == str); //flalse
Systemoutprintln(strequals(str)); //true
/*
public String intern()返回字符串對象的規范化表示形式
一個初始時為空的字符串池它由類 String 私有地維護
當調用 intern 方法時如果池已經包含一個等於此 String 對象的字符串
(該對象由 equals(Object) 方法確定)則返回池中的字符串
否則將此 String 對象添加到池中並且返回此 String 對象的引用
*/
Systemoutprintln(str == strintern()); //false
Systemoutprintln(str == strintern()); //true
Systemoutprintln(********************);
String hello = hello;
String hel = hel;
String lo = lo;
//在+兩邊都是常量字符串則將兩個字符串合並並且在String Pool中查找hello
//並返回在String Pool中的內存地址正好也是hello變量的內存地址所以第一句代碼會輸出true
Systemoutprintln(hello == hel + lo);//true
Systemoutprintln(hello == hel + lo);//true
//如果在+兩邊有一邊是引用類型變量Java會將合並成一個字符串並且在堆棧中創建一個
//新的對象並且返回內存地址所以這句代碼是輸出false
Systemoutprintln(hello == hel + lo); //false
Systemoutprintln(hello == hel+lo); //false
}
}</FONT></PRE>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28641.html