1.String對象賦值的方法:
String對象賦值有兩種方法,第一種方法是直接對變量進行賦值,例如:String str="abc";這種方法非常簡單。第二種方法是使用new函數進行賦值,例如:String str=new String("abc");這種方法將產生兩個String對象,因為"abc"本身就是一個字符串,這個對象是一個匿名對象,進行new函數又產生一個新的String對象,它在內存中的存儲方式如下圖所示:

這個程序在堆內存中開辟了兩塊空間,每塊空間的內容都是字符串"abc"。
這種賦值方法非常浪費內存,如果對象很多的時候那么程序的可行性非常差,所以不提倡使用這種方法進行賦值。
2.Sring對象的共享特性:
如果在一個程序中聲明了兩個String變量,采用直接賦值的方法將同一個字符串付給這兩個變量,那么這兩個變量將同時指向這個變量,在
堆內存中為這兩個變量只分配一塊內存空間,例如:String str1="abc";String str2="abc";它的內存存儲形式如下圖所示:
這個程序在堆內存中只開辟了一塊內存空間,空間的內容是"abc"。
3.String對象內容的不變性:
如果聲明一個String變量并未這個變量賦值,那么就會在堆內存中為這個對象開辟一塊內存空間來存放對象的值,之后無論怎樣改變這個對
象的值都不會改變,但是可以改變對象的指向。例如:
String str="abc";
str+="def";執行
System.out.println(str);
將輸出:
abcdef
這個程序在內存中的存儲過程如圖所示:
執行第一條語句在堆內存中開辟了一塊內存空間,內容是字符串"abc",執行第二條語句:因為字符串"def"本身就是一個String對象,所以
先在堆內存空間中開辟另一塊內存空間,空間內容是字符串"def",然后再開辟一塊內存空間是兩個字符串的和,也就是字符串"abcdef",
其次將str與字符串"abc"的指向斷開,將str指向字符串"abcdef"。