近日小编学习了《深入理解java虚拟机》,其中对于java中String的内存分配自己的一些理解,话不多说上代码。
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str3==str4);
System.out.println(str2==str4);
出现上面的结果其实我们并不意外,因为在java在String内存模型中我们的String没有用对象new出来的hello都是放于常量池的,也就出现了str1==str2的情况,而java中的对象都是置于java堆中的,每当要用一个对象就new一个,每次引用的对象是不一样的,所以我们的str3==str4为false的情况也就是这样。对于常量池里的值和新建对象的值也是不一样的,也就是我们的str1==str3为false的情况。
在这里如果有学习高并发的可能会有所了解这里有一个点就是有时候可能会同时锁住常量池中的一个值,这个时候会造成死锁,使用在高并发编程里面对于String的应用还是要多加注意。