说说Java里的equals(上)

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

那么,咱们今天来讲说equels,话很少说,上代码:数组

执行一下,结果以下:post

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


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

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

因此代码person1.equals(person2)等同于person1 == person2,固然打印出来的结果是false。咱们再来看看Integer这个类, equals的实现以下:对象

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

最后是咱们String的实现继承

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

注:本专栏全部示例代码已上传至公众号:saysayJava

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

转载无限欢迎,但请注明「做者」和「原文地址」。转载请在文中保留此段,感谢您对做者版权的尊重。如需商业转载或刊登,请联系做者得到受权。


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

下一篇:Java中的数组

相关文章
相关标签/搜索