说说Java里的equals(上)

作者: 清浅池塘V | 来源:发表于2017-09-15 23:24 被阅读25次

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了。

如果喜欢本系列文章,请为我点赞或顺手分享,您的支持是我继续下去的动力,您也可以在评论区留言想了解的内容,有机会本专栏会做讲解,最后别忘了关注一下我。

转载无限欢迎,但请注明「作者」和「原文地址」。转载请在文中保留此段,感谢您对作者版权的尊重。

上一篇:Java字符串那些事儿 - Java那些事儿

下一篇:Java中的数组 - Java那些事儿

相关文章

  • 说说Java里的equals(上)

    在Java字符串那些事儿一文发表后,朋友给我留言说:比较字符串用equals不就完了呗,干嘛要用"==",吃饱了撑...

  • 说说Java里的equals(上)

    在Java字符串那些事儿一文发表后,朋友给我留言说:比较字符串用equals不就完了呗,干嘛要用"==",吃饱了撑...

  • Java中的数组

    在说说Java里有equals(上) - Java那些事儿这篇文章里,文末我们提到了String底层是char数组...

  • 说说Java里的equals

    在Java字符串那些事儿一文发表后,朋友给我留言说:比较字符串用equals不就完了呗,干嘛要用"==",吃饱了撑...

  • Java中的数组

    在说说Java里有equals(上)这篇文章里,文末我们提到了String底层是char数组来实现的,好多人当年上...

  • java-equals方法

    equals equals 方法是 java.lang.Object 类的方法。java默认的equals方法是比...

  • Java 比较相等

    Java Equals() 特性 Equals() 和 == 的区别 重写Equals方法 重写HashCode方法

  • equals和==的区别,小白也能懂!

    走进 equals & == 的世界! 就让我来先讲讲 equals 吧! equals 会点JAVA的同学应...

  • Kotlin ==,===,equals

    == 比较值(类似于java中的 equals)=== 比较地址 equals ...

  • 重写equals 方法的注意事项

    java.lang.Object 中的equals方法如下 什么时候需要重写equals方法 使用equals方法...

网友评论

  • 大炮对着虫子:兄弟,我觉得你这个解释的很底层,一般人看不懂呐。
    如果是我来解释这道题,我会这样说:
    除了string是重写了equals函数,比较的是两个字符串的值外,没有重写默认比较的是他们的引用。
    第二个引用的类型不等,第三个的引用值不等,所以后面两个就是false。
    值得注意的是,int a=3; float b=0.3f ; syso(a==b) //返回false;
    沟通想法,互相学习

本文标题:说说Java里的equals(上)

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