java 的String

1. java里的new 一个String对象时都会在堆内存里产生一个对象。

String str = new String("abc") 首先检查String Pool里有没有值为abc的对象,如果没有会先在String Pool里产生一个值为abc的对象,然后再在堆内存里拷贝一个值为abc的对象,然后把堆内存里的对象的地址赋值给str,如果String  Pool里有一个值为abc的对象,则直接从String Pool里的值拷贝一份值为abc的对象到堆内存,然后把堆内存里的对象的地址赋值给str.

String str = "abc' 这种方式创建的字符串,会首先看String Pool里有没有值为abc的对象,如果有,则直接把String Pool里abc对象的内存地址复制给str即可,如果没有则在String Pool里创建一个值为abc的对象,然后把创建的新的对象的内存地址赋值给str即可

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里相同值的对象的地址。

所以:

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里创建一个新的对象。

如果+号两面有一个不是字面常量的话,则会在堆里创建一个新的对象。

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  
    }  
    
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章