美文网首页
说说Java里的equals

说说Java里的equals

作者: 会飞嘚蜗牛 | 来源:发表于2020-02-29 16:51 被阅读0次

    Java字符串那些事儿一文发表后,朋友给我留言说:比较字符串用equals不就完了呗,干嘛要用"==",吃饱了撑的,能不能来点实际的。其实在文章里我是想表明,Java字符串两种声明方式在堆内存中不同的体现,我们在写代码过程中,为了避免重复的创建对象,尽量使用String s1 ="123" 而不是String s1 = new String("123"),因为JVM对前者给做了优化。

    那么,我们今天来说说equels,话不多说,上代码:

    执行一下,结果如下:

    面试题中老问"=="与和equals有什么区别,甚至连百度搜索equals也会自动关联出equals和"=="的区别这一类的问题来。

    笔者一直认为,这两者之间没有必然的联系,在引用类型中,"=="是比较两个引用是否指向堆内存里的同一个地址(同一个对象),而equals是一个普通的方法,该方法返回的结果依赖于自身的实现。我们先看一下Person这个类,并没有equals方法呀,那为什么不报错呢?在Java中,如果一个类没有继承其它类,那么它默认继承Object这个类,打开Object这个类看一下,发现如下代码,Person这个类的equals方法就继承自这里

    很简单,就一句代码,判断两个引用是否指向同一个对象,两个Person对象在堆内存中的表现如下图所示:

    所以代码person1.equals(person2)等同于person1 == person2,当然打印出来的结果是false。我们再来看看Integer这个类, equals的实现如下:

    当代码执行到System.out.println(itr.equals(lon))时,会判断传入的lon这个对象是否是Integer类型,这里的lon是Long类型,所以打印出来的结果当然是false了。

    最后是我们String的实现

    当代码执行到:System.out.println(s3.equals(s4)),由于字符串底层char数组里存的都是{'1','0','0'}当然打印出来是true了。

    转载出自:https://zhuanlan.zhihu.com/p/27573287

    相关文章

      网友评论

          本文标题:说说Java里的equals

          本文链接:https://www.haomeiwen.com/subject/tcqmhhtx.html