問題:如何理解
String str=new String("x");
和
String str="x";
在計算機的內存中有堆和棧兩塊空間,其中棧中存放所有對象、函數、變量等的飲用;而堆中存放對象、值等。
不管是new出的對象還是用類似String str = "x";這類的對象,都是放在堆中的。
舉一個簡單的例子:
String str1 = "x" ;
String str2 = "x" ;
String str3 = new String("x") ;
表面上看這三句回實例化3個String對象,實際上是兩個。在java中有一個叫“字符數據池”的內存管理機制,在對str2賦值之前,會檢查池中有沒有相同的數據,如果有,則直接引用;若沒有,系統會實例化這個String的對象;而執行到String str3 = new String("x") ;系統會直接實例化該對象,而不會在池中查找。也不會將這個對象放在池中。
你可能會問,如果改動str1或str2時會不會改動另外一個引用的值。答案是不會。系統會首先在池中查找有沒有相同的對象,如果沒有,會實例化這個對象。
補充一:
注意,對于new出來的對象則要小心。
如
String str3 = new String("x") ;
String str4 = new String("x") ;
System.out.println(str4==str3);
它的打印結果肯定是false;因為此時new出來的對象并不在一個位置,并不用去檢查字符數據池。所以為false。
只有在執行:
System.out.println(str3.equals(str4));時其值才為true。