Java String 文字(Literal)和 对象(Object)初始化

当我们创建 String 对象的时候,如果使用 new() 的方式来创建一个 String 对象,JVM 将会每次都会在 heap 内存中为我们创建的 String 对象开辟一个存储空间来进行存储。

 

但是,如果我们使用赋值方式创建 String 对象的话,JVM 首先将会对我们赋的值到 String Pool 中进行查找,如果找到的话,就返回已经存在这个值的引用。

如果没有找到,就创建一个新的 String 对象并且返回这个创建对象的引用。

例如,我们如果使用赋值方式将值 “HoneyMoose” 创建的话,我们有可能会得到的是已经存在值的内存地址让我们能够来重新利用已经划分的内存,也有可能是一个全新的内存地址。

简单来说,这 2 种方式创建的 String 字符串都是 String 对象,唯一不同的是 new 操作每次都会给出新的地址,另外的操作则不能每次都是新的内存地址。

要解释这种情况,我们可以用一个数据基本面试问题的题目来进行解释,就是为什么使用 == 进行字符串比较的时候有时候会得到 False 的值。

因为,我们都知道 == 比较的是地址,而不是 String 中存储的值。

考察下面的代码:

String first = "HoneyMoose"; 
String second = "HoneyMoose"; 
System.out.println(first == second); // True

在上面的初始化后比较中,我们会得到 True 的值,因为上面 2 个 String 的地址是相同的。

下面,我们再使用 *new* 关键字来创建 2 个新的 String 对象,然后再来比较 String 对象的引用:

String third = new String("HoneyMoose");
String fourth = new String("HoneyMoose"); 
System.out.println(third == fourth); // False

相同的,我们使用 new 的方式来创建对象,我们可以看到上面创建的 String 的地址是不相同的。

因此使用 == 计算的结果是 False

String fifth = "HoneyMoose";
String sixth = new String("HoneyMoose");
System.out.println(fifth == sixth); // False

通常来说,我们建议对 String 对象初始化的时候,使用文字方式对 String 对象初始化,这样的话我们能够让 JVM 有机会对 String 初始化之前进行判断来完成内存优化而不需要重复创建相同的对象。

Java 中的 String Pool 简介 - Java - OSSEZicon-default.png?t=M5H6https://www.ossez.com/t/java-string-pool/14017

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HoneyMoose

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值