## 关于java String ==

**

关于java String ==

先直接看如下的例子,你可以先分别思考一下下面的结果是什么。
在这里插入图片描述
首先我们要知道 == 比较的是两个对象的引用是否相同 ,或者说这两个对象是否是占用同一块内存堆区的。
有了上面的了解我们就可以开始思考这些输出是什么了。
s1s2 按照上面的理解 创建了两个对象 那么他们的肯定是不相等的。这样的理解是没有问题,但是jvm有一块分区叫做String缓冲池,他用来存放String的值,当我们 String s1=“nihao”的时候,它会先去缓冲池中寻找有没有“nihao”,那根据上图 答案是没有,那么此时就会创建一个“nihao”,然后让s1去指向它。当String s2="nihao"时,由于已经存在了nihao对象,s2直接指向它,所以s1和s2地址相同,因此 s1s2输出True;

s2s3 继续根据上面说的 ,去缓冲池寻找"nihao" 找到有,OK,不用在缓冲池创建新对象,但是 s3这个语句 创建了一个对象在jvm堆区,因此s3的意思是 在缓冲区创建“nihao”,然后把这个值赋值给在堆区的s3,因此其实s3和s2的地址不同,s2s3返回False;

s3s4 同上理,因为他们的语句之前就先创建好了不同的对象,要做的后面只是赋值,因此s3s4返回False

s1s5 其实s5的创建方式对于系统来说就相当于S1的方式,因此s1s5 返回True
s5s6 s6 也同样的先创建了一个对象在堆区,赋值“hao”,然后进行字符串拼接,因此两者的内存地址不同,返回Flase
s3
s5 同 s2s3 不多说了
s7
s1 有人可能会疑惑,这s7和s5的创建方式不是很像吗,实则不是。原来两个字符串a, b的拼接首先会调用 String.valueOf(obj),这个Obj为a,而String.valueOf(Obj)中的实现是return obj == null ? “null” : obj.toString(), 然后产生StringBuilder, 调用的StringBuilder(str1)构造方法,这个StringBuilder是在堆区创建的,因此,s7==s1也返回 False。

结果图如下。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值