String内存分析

2019-08-26  本文已影响0人  一如既往wfqwfq

1、了解常量池

字符串常量池中存储的就是各种字符串,在常量池中这些字符串都是唯一的。字符串常量池中存储的是在编译期就确定的,存在.class文件中的字符串常量。字符串常量池能有效地减少内存开销,毕竟程序中出现相同的字符串是很大概率的事情,如果为每个字符串都去开辟内存空间,后果可想而知。

2、内存分析

1、创建String的基本方式

String s1 = "abc";  
String s2 = new String("abc"); 
class Person{
    String name;
    public Person(String name){
        this.name = name;
    }
}
public class StringHeapTest {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s1 ==  s2);  //false,s1指向常量池,s2指向堆中,所以地址不同

        Person p1 = new Person("xiaoming");
        Person p2 = new Person("xiaoming");
        System.out.println(p1.name == p2.name);  //true,堆中地址都指向常量池中的"xiaoming"
    }
}

结论:通过String a = "a";方式创建的String对象,一般情况下栈中变量直接指向常量池(String.intern()方法可能会影响结果)。
String a = new String方式创建的String对象,栈中变量指向堆中,堆中对象中存储这该字符串在常量池中地址,由堆中在指向常量池。所以我们看到的直接字符串赋值和new String()出来的地址是不同的,堆中两个Person对象的name属性,它们的地址是相同的,都是指向常量池中"xiaoming"。

2、String拼接

String s1 = "a" ;
String s2 = "abc"
String s3 = s1 + "bc";
上一篇 下一篇

猜你喜欢

热点阅读