使用HashSet并不能保证存入的对象不一样。虽然Set集合表示一种无序,不能重复的对象序列。在HashSet内部,通过哈希表来存储对象。判断两个对象是否相同的方法是HashCode方法与equals方法。如果HashCode相同,才判断调用equals判断。事实上,两个对象的HashCode是可以一样的,这个被叫做哈希冲突,哈希冲突不能被避免,只能减少。
public class Person {
private String name;
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public class Tets02 {
/**
* @param args
*/
public static void main(String[] args) {
HashSet hashSet=new HashSet();
hashSet.add(new Person("zhangsan", 25));
hashSet.add(new Person("sunqi", 22));
hashSet.add(new Person("zhaoliu", 25));
hashSet.add(new Person("lisi", 29));
hashSet.add(new Person("wangwu", 20));
hashSet.add(new Person("zhoujiu", 57));
hashSet.add(new Person("zhangsan", 25));
Iterator it=hashSet.iterator();
while(it.hasNext()){
System.out.println(it.next().toString());
}
}
}
假设对象中名字相同,年龄相同就是一个人,那么hashset是无法区分的。调用系统的HashCode方法与equals无法区分。只有重写hashcode与
equals方法才能区分。
public class Person {
private String name;
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)){
return false;
}
Person person=(Person)obj;
if(this==obj)
return true;//用户可能直接添加了同一个对象。
return this.getName().equals(person.getName())&&this.getAge()==person.getAge();
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.getName().hashCode()+this.getAge();
}
}