天天看點

[改善Java代碼]推薦使用String直接量指派

建議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