Java中兩種字串初始化方法的區別
String str1 = new String("abc");
String str2 = "abc";
雖然兩個語句都是返回一個String對象的引用,但是jvm對兩者的處理方式是不一樣的。對於第一種,jvm會馬上在heap(堆)中建立一個String對象,然後將該對象的引用返回給使用者。對於第二種,jvm首先會在內部維護的strings pool中通過String的 equels 方法尋找是對象池中是否存放有該String對象,如果有,則返回已有的String對象給使用者,而不會在heap中重新建立一個新的String對象;如果對象池中沒有該String對象,jvm則在heap中建立新的String對象,將其引用返回給使用者,同時將該引用添加至strings
pool中。
注意:使用第一種方法建立對象時,jvm是不會主動把該對象放到strings pool裡面的,除非程式調用 String的intern方法。看下面的例子:
String str1 = new String("abc"); //jvm 在堆上建立一個String對象
String str2 = “abc”; //jvm 在strings pool中找不到值為“abc”的字串,
因此 在堆上建立一個String對象,並將該對象的引用加入至strings pool中 此時堆上有兩個String對象
if(str1 == str2){
System.out.println("str1 == str2");
}else{
System.out.println("str1 != str2");
}
//列印結果是 str1 != str2,因為它們是堆上兩個不同的對象
String str3 = "abc";
//此時,jvm發現strings pool中已有“abc”對象了,因為“abc”equels “abc”
//因此直接返回str2指向的對象給str3,也就是說str2和str3是指向同一個對象的引用
if(str2 == str3){
System.out.println("str2 == str3");
}else{
System.out.println("str2 != str3");
}
//列印結果為 str2 == str3
建立一個引用時,我們希望它同一個新對象建立串連。通常用new關鍵字達到這一目的。new的意思是:“把我變成這些對象的一種新類型”。所以在上面的例子中,可以說:
String s = new String("asdf");
它不僅指出“將我變成一個新字串”,也通過提供一個初始字串,指出了“如何產生這個新字串”。
當然,字串(String)並非我們能使用的唯一一種類型。儘管Java配套提供了數量眾多的現成類型,但對我們來講,最重要的就是記住自己能建立新類型。事實上,這應是Java程式設計的一項基本操作。