1、关于Object类的equals方法的特点
a) 自反性: x.equals(x) 应该返回true
b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true
c) 传递性: x.equals(y)为true,并且y.equals(z) 为true, 那么x.equals(z) 也为true
d) 一致性 x.equals(y) 第一次调用为true,那么在没有修改x和y时, 第二次,第n次调用也应该为true。
2、关于Object类的hashcode()方法
a) 在Java应用的一次执行过程中,对同一个对象的hasCode方法的多次调用,他们应该返回同样的值(前提示该对象的信息没有变化)
b)对应两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的。
c)对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode值不一定是相同的。如果不同,可以提高应用的性能。
d) 对于Object类来说,不同的Object对象的hashCode值是不同的。(Object类的hashCode值表示对象的地址)
3、当使用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]
4、如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。
5、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]]
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!