Java 关于 equals与操作符==的区别
2017-08-01 20:24
573 查看
在java语言中,经常容易引起大家疑惑的一个部分就是 equals 与 ==的区别,到底他们都有哪些区别呢?
我们首先来追本溯源,看看equals到底是从哪里来的?它最原本的机制是什么样子的?
在java中所有对象的都有一个父类就是Object,既然针对每个对象都可以调用equals,那么自然这个equals也是父类应该有的方法。
(实在不知道这个注释怎么粘贴,凑合看吧)
大致意思就是,equals方法是用来被设计成非空对象之间用来判定是否是同一个对象的方法。任何对象的equals方法必须符合五个标准
自反性
对称性
传递性
一致性
任何非空 x.equlas(null) 应该返回为false
需要特别注意的是如果要复写equals方法的话,大部分都要复写hashCode()用于保证相对的对象一定要hash值一致。
可以看到它的方法体,也是用到了==操作符,所以默认情况下,二者是相同的。
我们经常看到的不同,原因就是String这个类复写了equals()方法,那么我们具体看一下String的equals怎么实现的
同样复写了hashCode
如上我们在源码中看到的,在String这个类中,只要对象的值相等就可以认为是equals。
所以总体来说就是,如果两个对象满足==,那么一定满足equals,相反则不一定成立。
当然复写equals方法的类很多 例如AbstractList,它则判断list集合中的内容,以及顺序是相同则认为是equals。Integer等。
我们首先来追本溯源,看看equals到底是从哪里来的?它最原本的机制是什么样子的?
在java中所有对象的都有一个父类就是Object,既然针对每个对象都可以调用equals,那么自然这个equals也是父类应该有的方法。
(实在不知道这个注释怎么粘贴,凑合看吧)
public boolean equals(Object obj) { return (this == obj); }
大致意思就是,equals方法是用来被设计成非空对象之间用来判定是否是同一个对象的方法。任何对象的equals方法必须符合五个标准
自反性
对称性
传递性
一致性
任何非空 x.equlas(null) 应该返回为false
需要特别注意的是如果要复写equals方法的话,大部分都要复写hashCode()用于保证相对的对象一定要hash值一致。
可以看到它的方法体,也是用到了==操作符,所以默认情况下,二者是相同的。
我们经常看到的不同,原因就是String这个类复写了equals()方法,那么我们具体看一下String的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; }
同样复写了hashCode
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
如上我们在源码中看到的,在String这个类中,只要对象的值相等就可以认为是equals。
所以总体来说就是,如果两个对象满足==,那么一定满足equals,相反则不一定成立。
当然复写equals方法的类很多 例如AbstractList,它则判断list集合中的内容,以及顺序是相同则认为是equals。Integer等。
相关文章推荐
- 关于Java中的==和.equals()区别
- Java学习笔记之五——关于"equals"和“==”的区别
- Java中关于==和equal的区别以及equals()方法重写
- 【Java】整理关于java的String类,equals函数和比较操作符的区别
- java关于equals与==号的区别以及与hashCode的关系
- [转]整理关于java的String 类,equals函数和比较操作符的区别
- Java 字符串比较操作符 == 与 equals 的区别
- Java中==操作符与equals方法的区别
- [转]整理关于java的String 类,equals函数和比较操作符的区别
- [转]整理关于java的String 类,equals函数和比较操作符的区别
- 在Java 中,关于String的 compareTo()、equals()和== 的区别
- 黑马程序员——关于java中equals和==的区别
- java中关于“==”和“equals()”方法的区别
- Java中关于==和equal的区别 以及equals()方法重写
- 关于java中equals与==的区别的小实验
- 关于==和equals的区别
- JAVA中的equals和==的区别
- 关于java中JDK5的打包,拆包以及"=="和equals的问题
- Java中==与equals的区别
- Java equals 和== 区别