javalangString類對大家來說最熟悉不過了我們寫java程序很少能不用String的本文講述如何正確的使用String內容主要涉及初始化串聯和比較等操作
首先我們必須清楚的一點是String類是final類型的因此你不可以繼承這個類不能修改這個類我們使用String的時候非常簡單通常都是String s = hello但是Java API中同時提供了一個構造函數為String(String s)因此你也可以這樣使用String s = new String(hello)對於後面這樣初始化一個String的方式是不推薦的因為new操作符意味著將會在heap上生成一個新的對象如果這樣的操作發生在一個循環中那麼代價是慘重的比如
Java代碼
for(int i = ;i<;i++)
{
String s = new String(hello);
}
這將會創建個String類型的對象由於String類是final的因此這樣的操作事實上是每次都生成了一個新的String對象的如果你使用String s = hello;那麼就可以實現復用了為什麼可以復用呢下面會有解釋
當我們使用+實現串聯操作的時候比如String s = hello+world;其實是通過StringBuffer類的append()方法實現的最後返回String給s如果有興趣的話你可以寫一個簡?在使用串聯的時候我們同樣應該注意String是final類如果你需要多次串聯比如
Java代碼
String sql = xxx;
sql = xxxx;
sql = ssssss;
那麼為了提高效率節省空間我們應該自己用StringBuffer來替代+;
通常對String的比較有兩種情況一個是使用==另一個是使用equals()方法注意==是對對象的地址進行比較的而String中的equals()方法是覆蓋了Object類的方法並且實現為對String對象的內容的比較所以String s = new String(hello);String s = new String(hello)我們對s和s進行上述比較的時候前者應該返回false因為使用new生成的是兩個不同的對象後者應該返回true因為他們的內容是一樣的都是hello那麼如果我們還有一個String s = hello;他和s的比較應該是什麼樣子的呢答案是s==s為falseequals的比較位true事實上String類是維持著一個String池的這個池初始化為空的當我們String x = hello的時候hello就會被放入這個池中當我們再次String y = hello的時候他首先去檢查池中是否存在一個和hello內容一樣的對象如果存在的話就會把這個引用返回給y如果不存在的話就會創建一個並放入到池中這樣就實現了復用在String有一個方法intern()他可以把String的對象放入到池沖並返回池中的對象如果我們對s(String s = new String(hello))調用interns = sintern()這時候我們再把s和s進行==的判斷你會發現結果返回true!
看下面的例子
Java代碼
public class StringTest
{
public static void main(String[] args)
{
String s = hello;
String s = new String(hello);
String s = new String(hello);
testString(sss);
s = sintern();
Systemoutprintln(after sintern);
testString(sss);
}
private static void testString(String sString sString s)
{
Systemoutprintln(s = s is +(s==s));
Systemoutprintln(s = s is +(s==s));
Systemoutprintln(sequals(s) is +sequals(s));
Systemoutprintln(sequals(s) is +sequals(s));
}
}
輸出結果為
s = s is false
s = s is false
sequals(s) is true
sequals(s) is true
after sintern
s = s is true
s = s is false
sequals(s) is true
sequals(s) is true
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28846.html