



































關于 Java字符串池(String pool)
public class Sub{
String str=new String( "good "); //一個地址的傳遞,new出來的對象,在內存中已經開辟了空間
public static void main(String args[]){
Sub ex=new Sub();
ex.change(ex.str);
System.out.println(ex.str);
}
public void change(String bb){
bb= "test ok " }
問題:String str=new String( "good ") 和String str="good"的區別?
體會1:
體會2:字符串池(轉)String a = "Hello";
String b = "Hello";
String c = new String("Hello");
String d = new String("Hello");
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(d));
結果是true,false,false,true,true,true。這里就涉及到字符串池。“字符串池”,是Java為了提高內存利用率而采用的措施:
當遇到String a = "Hello"; 這樣的語句時,Java會先在字符串池中尋找是否已經存在"Hello"這個字符串,如果沒有,則建立字符串"Hello"對象,然后變量 a 指向這個地址;然后遇到語句String b = "Hello",這時字符串池中已經有 "Hello"了,所以直接讓變量b也指向這個地址,省去了重新分配的麻煩。而在Java中,操作符“==”對于兩個基本型來說,是判斷其內容是否相同,對于兩個對象來說,則是判斷其地址是否相同,所以a == b返回 true。
那么String c = new String("Hello")又如何處理呢?如果是這種寫法,則不會去訪問字符串池,而是先為變量 c 開辟空間,然后將值寫入空間。所以a == c返回false,c == d同樣返回false。
至于String的equals方法,因為它比較的不是對象的地址,而是對象的值,所以都返回true就不奇怪了。
Java虛擬機有一個字符串池,保存著幾乎所有的字符串對象。字符串表達式總是指向字符串池中的一個對象。使用new操作創建的字符串對象不指向字符串池中的對象但是可以使用intern方法使其指向字符串池中的對象.(注:如果池中已經有相同的字符串--使用equals方法確定,則直接返回池中的字符串,否則先將字符串添加到池中,再返回)。池中兩個相等的字符串如果使用“==”來比較將返回真。
總結:也就是在change這個方法中,bb已經寫入str空間。而bb在等于“test ok”的時候是運用字符串池創建了對象中了。所以不能賦值。可以這樣 bb="test ok"; this.str=bb;
理解有錯誤,希望看到的高手可以告訴我,以便我可以更好的修改,謝謝了。