前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java String 文字(Literal)和 对象(Object)初始化

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

作者头像
HoneyMoose
发布2022-06-30 14:22:08
3780
发布2022-06-30 14:22:08
举报
文章被收录于专栏:CWIKIUS

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

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

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

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

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

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

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

考察下面的代码:

代码语言:javascript
复制
String first = "HoneyMoose"; 
String second = "HoneyMoose"; 
System.out.println(first == second); // True

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

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

代码语言:javascript
复制
String third = new String("HoneyMoose");
String fourth = new String("HoneyMoose"); 
System.out.println(third == fourth); // False

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

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

代码语言:javascript
复制
String fifth = "HoneyMoose";
String sixth = new String("HoneyMoose");
System.out.println(fifth == sixth); // False

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

https://www.ossez.com/t/java-string-pool/14017

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档