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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值