以Java的字串來說,就有一些必須注意的特性:
- - -字串常量與字串池
- - -不可變動(Immutable)字串
1、字串常量與字串值
用以下程式碼片段來說明:
String name1 = "zhangsan";String name2 = "zhangsan";String name3 = new String("zhangsan");String name4 = new String("zhangsan");System.out.println(name1 == name2);System.out.println(name1 == name3);System.out.println(name3 == name4);// 程式碼片段分別顯示true,false, false的結果
分析:在Java中為了效率考慮,以“”包括的字串,即字串常量(String literal),只要內容相同(序號、大小相同),無論在程式碼中出現幾次,JVM都只會建立一個String執行個體,並在字串池(String pool)中維護。第一個結果為true,是因為建立name1的時候,JVM會建立一個String執行個體放在字串池中,並給name1參考,而第二行則是讓name2直接參考至字串池中的String執行個體。至於後面的false,因為new時建立了新對象,name3與name4都是參考至建立的String執行個體。
如果想比較對象實質內容是否相同,不要使用==,要使用equals(),同樣地,如果想比較字串實際字元內容是否相同,不要使用== ,要使用equals()。
2、不可變動字串
在Java中,字串對象一旦建立,就無法更改對象中任何內容,對象上沒有任何方法可以更改字串內容。用+實現連接字串是怎麼達到的。例如:
String name1 = “Java”;String name2 = name1 +“World”;System.out.println(name2);
上面這個程式片段會顯示JavaWorld,由於無法改變字串內容對象,所以結果不是直接在name1參考的字串對象之後添加World內容。反編譯後得到:使用+連接字串 ,會建立java.lang.StringBulider對象,使用其append()方法來進行+左右兩邊字串附加,最後再轉換為toString()返回。
總結:在重複性場合如迴圈或遞迴時盡量不要使用+連接字串,這會因為頻繁產生新對象,造成效能上的負擔。