说说Java里的equals(上)
来源:互联网 发布:黑马程序员视频教程 编辑:程序博客网 时间:2024/05/26 17:44
在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了。
注:本专栏所有示例代码已上传至公众号:saysayJava
作者:清浅池塘
链接:https://juejin.im/post/59c99cb051882531b21f0a02
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 说说Java里的equals(上)
- 说说Java里的equals(上)
- 说说equals() (上)
- 说说JAVA的equals()和hashCode()
- 对java里equals的一些理解!
- java 里的equals()和hashcode()
- java里equals和hashCode的关系
- 说说民生银行的对外投资(上)
- 说说 Objective-C 里的 @()
- 说说Android里的SQLiteOpenHelper
- 说说 Objective-C 里的 @()
- 说说 Objective-C 里的 @()
- Java里String 的equals和==
- 在Java语言里 ==和equals的区别
- Java里String 的equals和==
- java 实用方法系列 Arrays, Objects 里的equals方法
- HashMap里的equals实现
- 说说equals() (中)
- 进程、线程、轻量级进程(LWP)
- 巧用心理学,高效优化网站转化率
- 独家 | 清华黄民烈:人机对话的典型技术、面临挑战和发展方向
- numpy diff函数
- js中setTimeout()与setInterval()
- 说说Java里的equals(上)
- 在java中如何跳出当前的多重嵌套循环?
- HttpClientUtil工具
- linux部署项目常用命令汇总
- Linux sed工具详解
- “通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败“常见问题的解决方案
- 网站细分分析的十个要点
- 简析JavaScript的this
- android监听键盘弹出