建立了幾個String物件?

劍握在手發表於2017-03-08
String str = "a";

1個,在常量池中建立了一個字串物件。

 

String str = new String("a");

2個,在常量池中建立了一個字串物件"a",在堆中開闢了一個空間又放了一個"a"。

 

String str = "a"+"b";

1個,在編譯期,jvm將"a"+"b"自動識別成"ab",因此只建立了一個物件,放在常量池中。

 

String a="a";//建立一個
String b="b";//建立一個
String ab1 = a+b;//建立一個
String ab2= a+b;//建立一個

4個,第三和第四行,各建立了一個物件,因為對於編譯器來說,建立ab1和ab2時候,a和b的值被當做是不確定的,所以各自開闢空間建立物件

 

final String a="a";//建立一個放常量池
final String b="b";//建立一個放常量池
String ab0=a+b;//建立一個放常量池
String ab1=a+"b";//不再建立
String ab2 = "ab";//不再建立

3個,在String前邊加個final,後邊再用這個物件的時候,對編譯器來說a的值是確定的,和"a"是一個東西都是“字面常量字串”。

 

以下轉自:http://blog.csdn.net/s1491695565/article/details/51833579

 

//此時str1與str2相當於變數,而不是常,因為塊是在執行時才能確定,在編譯時不能確定  
final static String str1;    
    final static String str2;    
    static {    
        str1 ="aaa";    
        str2 ="bbb";    
    }  
    public static void main(String[] args){    
        String str3 = str1 + str2;  
        String str4 ="aaabbb";    
        System.out.println(str3==str4);   //輸出為false  
    }    
String str=" ";與String str=new String();  
str=" "會放入池中,但new String()不會放入池中。 

 

String的intern()方法 
“當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(該物件由 equals(Object) 方法確定),則返回池中的字串;否則,將此 String 物件新增到池中,並且返回此 String 物件的引用。它遵循對於任何兩個字串 s 和 t,當且僅當 s.equals(t) 為 true 時,s.intern() == t.intern() 才為 true”,這是jdk文件原文註解。

 

相關文章