Java 中 String str = new String(“abc”) & String str = “abc” 區別

兩者的內存分配:

String是一個特殊的包裝類數據,可以用:
String str = new String(“abc”);
String str = “abc”;
兩種形式來創建,第一種是用new()來創建對象的,它會存放在堆中,每調用一次就會創建一個新的對象;而第二種是先在棧中創建一個對String類的對象引用變量str ,然後查找棧中有沒有存放”abc”,如果沒有,則將”abc”存放進棧,並令str 指向”abc”,如果已經有”abc”,則直接令str 指向”abc”。

簡單代碼解說:

比較類裏面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用 == ,下面用例子說明上面的理論。
String str1 = “abc”;
String str2 = “abc”;
System.out.println(str1 == str2); // true
可以看出str1 和str2 指向同一個對象

String str1 = new String(“abc”);
String str2 = new String(“abc”);
System.out.println(str1 == str2); // false
用new的方式是生成不同的對象,每一次調用都生成一個新的對象。

因此用第二種方式(String str = “abc”;)創建多個”abc”字符串,在內存中其實只存放一個對象而已。這種寫法有利於節省內存空間,同時它可以在一定程度上提高程序的運行速度,因爲jvm(java virtual machine)會自動根據棧中數據的實際情況來決定是否有必要創建新的對象。而對於String str = new String(“abc”); 的代碼,則一概在堆中創建新對象,而不管其字符串值是否相等,是否有必要創建新的對象,從而加重了程序的負擔。

溫馨提示:

我們在使用諸如String str = “abc”;的格式創建對象時,總是想當然地認爲創建了String類的對象str,小心陷阱,對象可能並沒有被創建!而可能只是指向一個先前已經創建好的對象。只有通過new()方法才能保證每次都創建一個新的對象。由於String類的不可變(immutable)性質,當String變量需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章