HashSet存储自定义对象如何保证唯一性

使用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();
}









}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值