在Set或者Map存数据的时候:咱们先经过 hashcode来判断两个对象是否在一个链表上,但这个链表上可能有不少元素之,那么咱们就须要再经过 equals 来判断时候存在相同的值,以便进行对该数据进行存储或者覆盖。【因此当咱们重写equal()方法,就必须先重写hashCode()方法】this
实例:.net
- public class HashTest {
- private int i;
-
- public int getI() {
- return i;
- }
-
- public void setI(int i) {
- this.i = i;
- }
-
- public int hashCode() {
- return i % 10;
- }
-
- public final static void main(String[] args) {
- HashTest a = new HashTest();
- HashTest b = new HashTest();
- a.setI(1);
- b.setI(1);
- Set<HashTest> set = new HashSet<HashTest>();
- set.add(a);
- set.add(b);
- System.out.println(a.hashCode() == b.hashCode());
- System.out.println(a.equals(b));
- System.out.println(set);
- }
- }
这个输出的结果:code
- true
- false
- [com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]
以上这个示例,咱们只是重写了hashCode方法,从上面的结果能够看出,虽然两个对象的hashCode相等,可是实际上两个对象并非相等;,咱们没有重写equals方法,那么就会调用object默认的equals方法,【是比较两个对象的引用是否是相同,显示这是两个不一样的对象,两个对象的引用确定是不定的】。这里咱们将生成的对象放到了HashSet中,而HashSet中只可以存放惟一的对象,也就是相同的(适用于equals方法)的对象只会存放一个,可是这里其实是两个对象a,b都被放到了HashSet中,这样HashSet就失去了他自己的意义了。对象
此时咱们把equals方法给加上:get
- public class HashTest {
- private int i;
-
- public int getI() {
- return i;
- }
-
- public void setI(int i) {
- this.i = i;
- }
-
- public boolean equals(Object object) {
- if (object == null) {
- return false;
- }
- if (object == this) {
- return true;
- }
- if (!(object instanceof HashTest)) {
- return false;
- }
- HashTest other = (HashTest) object;
- if (other.getI() == this.getI()) {
- return true;
- }
- return false;
- }
-
- public int hashCode() {
- return i % 10;
- }
-
- public final static void main(String[] args) {
- HashTest a = new HashTest();
- HashTest b = new HashTest();
- a.setI(1);
- b.setI(1);
- Set<HashTest> set = new HashSet<HashTest>();
- set.add(a);
- set.add(b);
- System.out.println(a.hashCode() == b.hashCode());
- System.out.println(a.equals(b));
- System.out.println(set);
- }
- }
此时获得的结果就会以下:hash
- true
- true
- [com.ubs.sae.test.HashTest@1]