建議52:推薦使用String直接量指派
一、建議
String對象的生成方式有兩種:
1.通過new關鍵字生成,String str3 = new String(“中國”);
2.直接聲明,如:Str str = "a"。
對于String對象來說,極力推薦使用直接聲明的方式。
二、分析
Java為了避免在一個系統中大量産生String對象,于是就設計了一個字元串池(也有叫做字元串常量池String Pool或String Constant Pool或String Literal Pool),在字元串池中所容納的都是String字元串對象。
String建立規則:建立一個字元串時,首先沒有檢查池中是否有字面值相等的字元串。
如果有,則不再建立,直接傳回池中該對象的引用。
如果沒有則建立之,然後放到池中,并傳回建立對象的引用。
三、場景
執行個體程式:
運作結果:
建立str1時,字元串池中沒有對象,則建立"中國"字元串放到池中,待再建立str2時,池中已經存在對象,則傳回該對象的引用。則str1==str2為真。
建立str3時,直接聲明一個String對象是不檢查字元串池的,也不會把對象放到池中,是以str3==str1為假。
建立str4時,intern會檢查目前對象在對象池是否有字面值相同的引用對象,如果有則傳回對象,如果沒有則放置到對象池中,并傳回目前對象。是以str1==str4為真。
利用對象池,可以提高效率,同時也減少了記憶體空間.
對象放到池中會不會産生線程安全問題?
Java已經考慮到了,String類是一個不可變Immutable對象,其實有兩層意思:
一是String類是final類,不可繼承,不可能産生一個String的子類.
二是在String類提供的所有方法中,如果有String傳回值,就會建立一個String對象,不對原對象進行修改,這也就保證了原對象是不可變的.
放到池中是不是需要考慮垃圾回收問題?
不用考慮,雖然Java的每個對象都儲存在了堆記憶體中,但是字元串池非常特殊,它在編譯期已經決定了其存在JVM的常量池Constant Pool,垃圾回收器是不會對它進行回收.
通過上面:
Java在字元串的建立方面确實提供了非常好的機制,利用對象池不進可以提高效率,同時也減少了記憶體空間占用,建議大家在開發中使用直接量指派的方式,除非确有必要才建立立一個String對象.
<col>
作者:SummerChill