「JDK」解析 String str=““与 new String()
2023-02-18 15:47:09 时间
一、基础概念
为了讲清楚他们的差异,这里先介绍几个概念。
1.1 常量池
所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。
1.2 字符串常量池
在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。
当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。
1.3 在编译期间创建的常量和运行期间创建的常量保存的地址是不一样的
对象的引用都是存放在栈中
- 编译期间创建的常量保存在常量池中;
- 运行期间通过new创建时,会直接创建一个新字符串常量并会存储在堆中。
所以我们可以发现,在堆中,可以有很多重复相同的字符串,而在常量池中,不会出现重复的值。
1.4equals()与==
- ==
- 如果是基本类型,==表示判断它们值是否相等;
- 如果是引用对象,==表示判断两个对象指向的内存地址是否相同。
- equals()
- equals()方法未被重写时(Object时),比较的是内存地址;
- equals()方法被String、Integer、Date等类重写时,其比较的是两个内容是否相同。
二、String str=""与new String()的区别
2.1String str=""
例如:
String str = "风尘博客";
- 先在栈区创建str引用,然后关于创建对象。
这个表达式,可能会创建一个对象,也可能不会创建对象。
- 如果常量池中没有“风尘博客”这个字符串,就需要创建;
- 常量池中存在“风尘博客"这个字符串,就直接拿来用。
- 最后str指向常量池中的对象。
注意!这里就是上面说的,从常量池中直接取用,所以,两者引用地址应该也相同,即 == 比较为true。
2.2String str=new String()
String str=new String(“风尘博客”)
- 同样的,先在栈区创建str引用;
这个表达式,可能会创建一个对象,也可能创建两个对象。
- 然后会直接创建一个字符串存放在堆中;
- 其次,同样的:如果常量池中没有“风尘博客”这个字符串,就需要创建;常量池中存在“风尘博客"这个字符串,就直接拿来用。
- 最后str指向常量池中的对象。
注意!这里这里和上面不一样,这里直接在堆里创建对象,每新建一个都会创建一个,所以,两者引用地址肯定不相同,即 == 比较为false。
相关文章
- 经常被老板 PUA,怎么办?
- 现代化个人博客系统ModStartBlog最新版源码
- 不要乱介绍项目经验!小心被喷
- Joe主题再续前缘版 - 本站同款
- 网站SEO优化步骤超详细完整版教程
- Diffusion Model的演进 NeurIPS 2022最佳论文:Imagen
- 本站同款Joe主题美化代码
- 这玩意 会不会让程序员失业.....
- 网站添加Loading加载动画
- 【源码】一款开源的liunx运行Windows系统应用程序的软件
- 一款拥有漂亮外表的Typecho简洁主题-Scarfskin
- 搞了个线上故障,被老板骂了....
- 个人笔记(路由、网络相关)
- 个人笔记(vue篇)
- 怎么去水印不伤原图?这个去水印方法值得收藏!
- 羊了个羊,通关秘籍!
- 实用 | 盘点抓包修改响应结果的 2 种方式!
- 小技巧 | Chrome 插件如何完成剪切板的操作!
- DDOS攻击讲堂
- 思科交换机简单配置