一、关于Object类的equals方法的特色java
a) 自反性: x.equals(x) 应该返回trueide
b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true性能
c) 传递性: x.equals(y)为true,而且y.equals(z) 为true, 那么x.equals(z) 也为truethis
d) 一致性 x.equals(y) 第一次调用为true,那么在没有修改x和y时, 第二次,第n次调用也应该为true。code
二、关于Object类的hashcode()方法对象
a) 在Java应用的一次执行过程当中,对同一个对象的hasCode方法的屡次调用,他们应该返回一样的值(前提示该对象的信息没有变化)blog
b)对应两个对象来讲,若是使用equals方法比较返回true,那么这两个对象的hashCode值必定是相同的。hash
c)对于两个对象来讲,若是使用equals方法比较返回false,那么这两个对象的hashCode值不必定是相同的。若是不一样,能够提升应用的性能。io
d) 对于Object类来讲,不一样的Object对象的hashCode值是不一样的。(Object类的hashCode值表示对象的地址)class
三、当使用HashSet的add方法时,hashCode方法就会获得调用,判断已经存储在集合中的全部对象的hash code值是否与增长的对象的hash code值一致;若是不一致,直接加进去;若是一致,再进行equals方法的比较,equals方法若是返回true,表示对象已经加进去了,就不会再增长新的对象,不然加进去。
1)demo1
public static void main(String[] args) { HashSet set = new HashSet(); set.add(new People("Tom")); set.add(new People("Nick")); set.add(new People("Nick")); System.out.println(set); }
返回
[com.example.collectiondemo.People@7852e922, com.example.collectiondemo.People@15db9742, com.example.collectiondemo.People@6d06d69c]
2)、demo2
public static void main(String[] args) { HashSet set = new HashSet(); People lisi = new People("Lisi"); set.add(lisi); set.add(lisi); System.out.println(set); }
返回
[com.example.collectiondemo.People@15db9742]
3)demo3
public static void main(String[] args) { HashSet set = new HashSet(); String s1 = new String("a"); String s2 = new String("a"); set.add(s1); set.add(s2); System.out.println(set); }
返回
[a]
四、若是咱们重写equals方法,那么也要重写hashCode方法,反之亦然。
五、Demo: 建立一个Student对象,若是名字同样,就不添加到Set集合中。
public class SetTest3 { public static void main(String[] args) { HashSet set = new HashSet(); Student s1 = new Student("Tom"); Student s2 = new Student("Tom"); set.add(s1); set.add(s2); System.out.println(set); } } class Student{ String name; public Student(String name) { this.name = name; } @Override public int hashCode() { return this.name.hashCode(); } @Override public boolean equals(Object obj) { if(this == obj){ return true; } if(null != obj && obj instanceof Student){ Student s = (Student)obj; if(name.equals(s.name)){ return true; } } return false; } @Override public String toString() { return "Student [name=" + name + "]"; } }
打印
[Student [name=Tom]]