1. 程式人生 > >JAVA之String直接賦值和使用new賦值的區別

JAVA之String直接賦值和使用new賦值的區別

String str1 = "ABC";
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執行時的常量池中。

String str1 = new String("ABC");
String str2 = new String("ABC");
str1 == str2   //false

String str3 = "ABC";
String str4 = "ABC";
String str5 =  "AB" + "C";
str3 == str4   //true
str3 == str5  // true

String a  = "ABC";
String b = "AB";
String c = b + "C";
System.out.println( a == c );//false

注意:

1、b是引用變數,當字串為引用變數相加時,首先開闢一個記憶體空間,然後再進行拼接,因此記憶體地址改變即a==c為false。

2、str5是兩個常量相加,此時先進行相加,在常量池中尋找是否含有ABC有就返回其地址,否則建立再返回地址。系統在編譯時會將str5自動優化成ABC,因此str5==str3為true。

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

 

文章源地址:https://www.cnblogs.com/qiaoyanlin/p/6877628.html