浅谈equals与"=="

    之前在群里看到大家在讨论这个问题,想起自己在初学的时候也曾为这些问题绞尽脑汁的想过,在这里也谈谈自己的理解。

首先,我们知道String并不是基本数据类型而是引用类型,但是他可以当成一个对象来用,也可以看做是一个基本数据类型来用。"==",这种比较是针对两个String类型的变量的引用,也就是说如果两个String类型的变量,如果它们所引用同一个String对象(即指向同一块内存堆),那么比较的结果就是true。用Object对象的equals()方法来比较,String对象继承自Object,并且对equals()方法进行了重写。两个String对象通过equals()方法来进行比较时,其实就是对String对象所封装的字符串内容进行比较,也就是说如果两个String对象所封装的字符串内容相同(包括大小写相同),则equals()方法将返回true。首先要明白string对象的存储方式。大家可以参考这篇文章:http://www.oschina.net/question/1590027_167988

 

    上面的结果显而易见,false、true。这个比较好理解。a1和b1都通过new关键字分别创建了一个新的String对象,这个new关键字为创建的每个对象在堆中分配一块新的、独立的内存,==比较堆中的内存地址,因此结果返回的是false。而通过equals()方法来比较时,则返回true,因为这两个对象所封装的字符串内容是完全相同的。

 

   上面的这段代码的结果是,true,true。在此,string作为一个基本数据类型来使用。a1和b1没有通过关键字new来创建,虚拟机不会为这两个String对象分配新的内存堆,而是到String缓冲池中来寻找。首先为s1寻找String缓冲池内是否有与"123"相同值的String对象存在,此时String缓冲池内是空的,没有相同值的String对象存在,所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String("123");。然后把此String对象的引用赋值给a1。首先为a1寻找String缓冲池内是否有与"123"相同值的String对象存在,此时String缓冲池内是空的,没有相同值的String对象存在,所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String("123");。然后把此String对象的引用赋值给a1。接着为b1寻找String缓冲池内是否有与"123"相同值的String对象存在,此时虚拟机找到了一个与其相同值的String对象,这个String对象其实就是为a1所创建的String对象。既然找到了一个相同值的对象,那么虚拟机就不在为此创建一个新的String对象,而是直接把存在的String对象的引用赋值给b1。所以a1和b1引用的是堆中的同一个string对象,所有上面两个比较的结果都是true。

 

 

   上面的代码其实和第二张图很相似。只是b1直接在堆内存中创建了一个对象,并赋值为123,a1在缓冲池中没找到123,也会去创建自己的一个对象。因此上面的结果是false、true。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值