Java学习第33天-String类型的内存模型
常量池
对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。在程序执行的时候,常量池会储存在Method Area,而不是堆中。常量池中保存着很多String对象; 并且可以被共享使用,因此它提高了效率
使用String不一定创建对象
举例
打印结果
main方法中的S1,在对中创建“abc”,并放到常量池中,s2会现在常量池中查找有没有“abc",
如果有则直接指向。没有则创建。所以s1==s2;
使用new String,一定创建对象
举例
打印结果
String s3 = new String("abc"); //↑ 创建了两个对象,一个存放在字符串池中,一个存在与堆区中; //↑ 还有一个对象引用s3存放在栈中
String s4 = new String("abc"); //↑ 字符串池中已经存在“abc”对象,所以只在堆中创建了一个对象
System.out.println("s3 == s4 : "+(s3==s4)); //↑false s3和s4栈区的地址不同,指向堆区的不同地址;
内存模型
举例
打印结果
内存模型
1、i和j 都是指向常量池中的abc,所以i==j;
2、k 执行 堆中的 abc,i指向常量池中的abc ,i == k 返回false;
3、i、k的值都是”abc“,所以i.equals(k) 返回true;