java 的String

1. java裏的new 一個String對象時都會在堆內存裏產生一個對象。java

String str = new String("abc") 首先檢查String Pool裏有沒有值爲abc的對象,若是沒有會先在String Pool裏產生一個值爲abc的對象,而後再在堆內存裏拷貝一個值爲abc的對象,而後把堆內存裏的對象的地址賦值給str,若是String  Pool裏有一個值爲abc的對象,則直接從String Pool裏的值拷貝一份值爲abc的對象到堆內存,而後把堆內存裏的對象的地址賦值給str.ide

String str = "abc' 這種方式建立的字符串,會首先看String Pool裏有沒有值爲abc的對象,若是有,則直接把String Pool裏abc對象的內存地址複製給str便可,若是沒有則在String Pool裏建立一個值爲abc的對象,而後把建立的新的對象的內存地址賦值給str便可spa

java 代碼
public class Test {  
                      
    public static void main(String[] args) {  
        String str1 = new String("abc");  
        String str2 = "abc";  
        String str3 = new String("abc");  
                               
        System.out.println(str1 == str2);  
        System.out.println(str1 == str3);  
        System.out.println(str2 == str3);  
    }  
                      
}  
                      
輸出結果;  
false 
false 
false


2. String.intern() ,返回的是String Pool裏相同值的對象的地址。code

因此:對象

java 代碼
public class Test {  
               
    public static void main(String[] args) {  
        String str1 = new String("abc");  
        String str2 = "abc";  
        String str3 = new String("abc");  
                        
        System.out.println(str1 == str1.intern());//false  
        System.out.println(str2 == str2.intern());//true  
        System.out.println(str1.intern() == str3.intern());//true  
    }  
               
}



3  字符串用+號鏈接內存

若是+號兩邊都是字面常量的話,都會先去String Pool裏找值相等的對象.若是沒有找到則會在String Pool裏建立一個新的對象。字符串

若是+號兩面有一個不是字面常量的話,則會在堆裏建立一個新的對象。it

java 代碼
public class Test {  
    
    public static void main(String[] args) {  
        String hello = "hello";  
        String lo = "lo";  
             
        System.out.println(hello == "hel" + "lo");//+號兩邊都是字面常量,會在String Pool裏建立,因此返回true  
        System.out.println(hello == "hel" + lo);//+號右邊不是字面常量,則會在堆內存裏建立,因此返回false  
    }  
    
}
相關文章
相關標籤/搜索