關於JAVA中string直接初始化賦值和new的區別,是否可以聯系到int[]的情況


 1 String str1 = "ABC"; 

 1 String str2 = new String("ABC"); 

String str1 = “ABC”;可能創建一個或者不創建對象,如果”ABC”這個字符串在java String池里不存在,會在java String池里創建一個創建一個String對象(“ABC”),然后str1指向這個內存地址,無論以后用這種方式創建多少個值為”ABC”的字符串對象,始終只有一個內存地址被分配,之后的都是String的拷貝,Java中稱為“字符串駐留”,所有的字符串常量都會在編譯之后自動地駐留。

String str2 = new String(“ABC”);至少創建一個對象,也可能兩個。因為用到new關鍵字,肯定會在heap中創建一個str2的String對象,它的value是“ABC”。同時如果這個字符串再java String池里不存在,會在java池里創建這個String對象“ABC”。

在JVM里,考慮到垃圾回收(Garbage Collection)的方便,將heap(堆)划分為三部分:young generation(新生代)、tenured generation (old generation)(舊生代)、permanent generation(永生代)。

字符串為了解決字符串重復問題,生命周期長,存於pergmen中。

JVM中,相應的類被加載運行后,常量池對應的映射到JVM運行時的常量池中。

考慮下面的問題:

1 String str1 = new String("ABC");
2 String str2 = new String("ABC");
3 
4 str1 == str2    //false
1 String str3 = "ABC";
2 String str4 = "ABC";
3 String str5 =  "AB" + "C";
4 
5 str3 == str4       //true
6 str3 == str5      // true

 

1 String a  = "ABC";
2 String b = "AB";
3 String c = b + "C";
4 
5 a == c    //false

a、b在編譯時就已經被確定了,而c是引用變量,不會在編譯時就被確定。

 

應用的情況:建議在平時的使用中,盡量使用String = “abcd”;這種方式來創建字符串,而不是String = new String(“abcd”);這種形式,因為使用new構造器創建字符串對象一定會開辟一個新的heap空間,而雙引號則是采用了String interning(字符串駐留)進行了優化,效率比構造器高。

 

再問,int[]的初始化在倆種情況下有區別么?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM