1. 程式人生 > >Java String 和 new String()的區別

Java String 和 new String()的區別

棧區存引用和基本型別,不能存物件,而堆區存物件。==是比較地址,equals()比較物件內容。

String str1 = "abcd"的實現過程:首先棧區建立str引用,然後在String池(獨立於棧和堆而存在,儲存不可變數)中尋找其指向的內容為"abcd"的物件,如果String池中沒有,則建立一個,然後str指向String池中的物件,如果有,則直接將str1指向"abcd"";如果後來又定義了字串變數 str2 = "abcd",則直接將str2引用指向String池中已經存在的“abcd”,不再重新建立物件;當str1進行了賦值(str1=“abc”),則str1將不再指向"abcd",而是重新指String池中的"abc",此時如果定義String str3 = "abc",進行str1 == str3操作,返回值為true,因為他們的值一樣,地址一樣,但是如果內容為"abc"的str1進行了字串的+連線str1 = str1+"d";此時str1指向的是在堆中新建的內容為"abcd"的物件,即此時進行str1==str2,返回值false,因為地址不一樣。

String str3 = new String("abcd")的實現過程:直接在堆中建立物件。如果後來又有String str4 = new String("abcd"),str4不會指向之前的物件,而是重新建立一個物件並指向它,所以如果此時進行str3==str4返回值是false,因為兩個物件的地址不一樣,如果是str3.equals(str4),返回true,因為內容相同。

不多說,直接上程式碼:

String str1 = "abcd";
String str2 = "abcd";
String str3 = new String("abcd");
String str4 = new String("abcd");
System.out.println(str1==str2);//true地址一樣
System.out.println(str3==str4);//false,但地址不一樣
System.out.println(str3.equals(str3));//true,值一樣
System.out.println(str2.equals(str3));//true,值一樣
System.out.println((str1+"a")==(str2+"a"));//false;進行了+連線地址不一樣