關於JAVA中string直接初始化賦值和new的區別,是否能夠聯繫到int[]的狀況

 1 String str1 = "ABC"; java

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

String str1 = 「ABC」;可能建立一個或者不建立對象,若是」ABC」這個字符串在java String池裏不存在,會在java String池裏建立一個建立一個String對象(「ABC」),而後str1指向這個內存地址,不管之後用這種方式建立多少個值爲」ABC」的字符串對象,始終只有一個內存地址被分配,以後的都是String的拷貝,Java中稱爲「字符串駐留」,全部的字符串常量都會在編譯以後自動地駐留。spa

String str2 = new String(「ABC」);至少建立一個對象,也可能兩個。由於用到new關鍵字,確定會在heap中建立一個str2的String對象,它的value是「ABC」。同時若是這個字符串再java String池裏不存在,會在java池裏建立這個String對象「ABC」。code

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

字符串爲了解決字符串重複問題,生命週期長,存於pergmen中。blog

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(字符串駐留)進行了優化,效率比構造器高。io

 

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

相關文章
相關標籤/搜索