当使用Hashset时,hashCode方法就会得到调用,判断已经存储在集合中的对象的hashcode值是否与增加的对象的hashcode值一致;如果不一致,直接加进去,如果一致,再进行equals方法的比较,equals方法如果返回true表示对象已经加入了,就不会增加新的对象,否则加进去
同名的人不要增加到HashSet中
HashSet set = new HashSet();
set.add(new Person("zhangsan"));
set.add(new Person("zhangsan"));
class Person {
private String name;
Person(String name){
this.name = name;
}
public String getName(){
return name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
HashSet的源码(HashSet的底层是HashMap实现)
public HashSet() {
map = new HashMap<E,Object>();
}
/*
当时有add的方法将对象加到Set中时,实际上是将该对象为底层所维护的map对象的key,而value则是同一个对象(该对象没有起什么作用)
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}