「JDK」解析 String str=““与 new String()

1495 篇文章 10 订阅
1493 篇文章 14 订阅
"本文详细介绍了Java中的常量池、字符串常量池以及它们与内存区域的关系。讲解了`==`和`equals()`方法在比较字符串时的区别,并分析了`String str = "abc"`与`String str = new String("abc")`两种创建字符串对象的不同,强调了这两种方式在内存分配上的差异,特别是对于对象引用和字符串池的影响。"
摘要由CSDN通过智能技术生成

一、基础概念

为了讲清楚他们的差异,这里先介绍几个概念。

1.1 常量池

所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。

1.2 字符串常量池

在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。

当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。

1.3 在编译期间创建的常量和运行期间创建的常量保存的地址是不一样的

对象的引用都是存放在栈中

  1. 编译期间创建的常量保存在常量池中;
  2. 运行期间通过new创建时,会直接创建一个新字符串常量并会存储在堆中。

所以我们可以发现,在堆中,可以有很多重复相同的字符串,而在常量池中,不会出现重复的值。

1.4equals()与==

  • ==
  1. 如果是基本类型,==表示判断它们值是否相等;
  2. 如果是引用对象,==表示判断两个对象指向的内存地址是否相同。
  • equals()
  1. equals()方法未被重写时(Object时),比较的是内存地址;
  2. equals()方法被String、Integer、Date等类重写时,其比较的是两个内容是否相同。

二、String str=""与new String()的区别

2.1String str=""

例如:

String str = "风尘博客";
  • 先在栈区创建str引用,然后关于创建对象。

这个表达式,可能会创建一个对象,也可能不会创建对象。

  1. 如果常量池中没有“风尘博客”这个字符串,就需要创建;
  2. 常量池中存在“风尘博客"这个字符串,就直接拿来用。
  • 最后str指向常量池中的对象。

注意!这里就是上面说的,从常量池中直接取用,所以,两者引用地址应该也相同,即 == 比较为true。

2.2String str=new String()

String str=new String(“风尘博客”)
  • 同样的,先在栈区创建str引用;

这个表达式,可能会创建一个对象,也可能创建两个对象。

  1. 然后会直接创建一个字符串存放在堆中;
  2. 其次,同样的:如果常量池中没有“风尘博客”这个字符串,就需要创建;常量池中存在“风尘博客"这个字符串,就直接拿来用。
  • 最后str指向常量池中的对象。

注意!这里这里和上面不一样,这里直接在堆里创建对象,每新建一个都会创建一个,所以,两者引用地址肯定不相同,即 == 比较为false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值