equals和==的本质区别
来源:互联网 发布:淘宝网卖面膜 编辑:程序博客网 时间:2024/06/05 17:27
- 记得刚出来找工作,很容易在面试或笔试中遇到问equals和==的区别,我很容易答出它们的区别是前者比较两个对象的值,后者比较两个对象的地址是否相等,很长时间我对此深信不疑,但是当你真正研究源码的时候,你会发现这个答案其实是不对的。
我们知道equals是Object的方法,那我们先看看在Object这个类中是如何定义的:
public boolean equals(Object obj) { return (this == obj);}
显然意见,在Object类中的equls方法其实也是用==来判断两个对象是否相等。
但是看下面这段代码:
@Testpublic void testEqual() { String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1 == s2); System.out.println(s1.equals(s2));}
输出结果是false和ture,这是因为在String类中对Object的equals方法实现了覆盖,源码如下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false;}
可见equals的功能其实是由我们自己决定的,如果是我们自己定义的对象又该如何判断值的相等呢?示例如下:
class MyObject{int i = 1;String str = "hello";public boolean equals(Object o){ //若是两对象地址相等,则值必相等 if(this==o){ return true; }else if(o instanceof MyObject){ MyObject myObject = (MyObject)o; //比较两对象的值是否相等 if(i==myObject.i&&str!=null&&str.equals(myObject.str)){ return true; } } return false;}}@Testpublic void test1(){ MyObject o1 = new MyObject(); MyObject o2 = new MyObject(); System.out.println(o1.equals(o2));}
输出结果为true
结论:equals和==的本质区别在于前者是方法,后者是操作符,我们可以自定义equals的行为,却无法定义==的行为,于其说equals方法是比较两个对象的值,倒不如说是我们希望它能达到这种效果而已,它所能表达的只是一种规范,具体怎么做仍然在你。
阅读全文
0 0
- equals和==的本质区别
- equals 和 equalsIgnoreCase的本质区别
- hashCode()和equals()的本质区别和联系
- 关于hashCode()和equals()的本质区别和联系
- java基础-hashCode()和equals()的本质区别和联系
- “=”和“equals()”的区别
- java ==和equals、equals和hashCode的区别
- 关于“==”和“equals”的区别
- 关于Equals 和== 的区别
- equals和==的区别
- equals 和 == 的区别
- equals 和 == 的区别
- ==和Equals的区别
- equals 和 == 的区别
- equals 和 == 的区别
- equals和==的区别
- equals 和 == 的区别
- equals和==的区别
- 学生如何提高专业英文阅读能力-施一公
- C++实现快排
- 《Java并发编程实战》学习笔记 任务执行和取消关闭
- Charles配置抓包HTTP,HTTPS
- 2、JQuery——属性与样式
- equals和==的本质区别
- 【笔记】树
- 开始写博客了
- C++常用数据类型
- BZOJ1260:[CQOI2007]涂色paint(区间DP)
- 关于java控制台的“非顺序输出”,关于控制台缓冲区。
- c语言 比较三数大小
- Jenkins基础入门-16-添加Pipeline视图
- spring mybatis之sqlSessionFactoryBean