前面两位总结的挺多了,哥们这就用代码实现以下,
public class Person {
private String name;
private int age;
Person(){}
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 boolean equals(Object obj){//复写equals()方法,来判断对象的名字和年龄是否相同,如果相同,返回true,如果不同,返回false,或者这里如果你的内容不同你就多加几个
//传入来的对象和他本身相比,如果等于直接返回true
if(this == obj){
return true;
}
//传入进来的对象求证是否是这个类的
if(!(obj instanceof Person)){
return false;
}
//传入的对象要对其向下转型,因为是obj接受的
Person p = (Person)obj;
//判断对象的名字和年龄是否相同,如果相同,返回true,如果不同,返回false
return (this.name.equals(p.name)&&this.age==p.age);
}
public int hashCode(){//复写hashCode()方法来实现对两个实例对象的的判断,判断其是否是同一个,这里我用了加法在让后边的age乘以56,当然,你可以乘以任意数字都可以
return this.name.hashCode()+(56*this.age);
}
public String toString(){//这里是对toString()方法的复写,让其在打印对象的时候自动调用toString而返回名字和年龄
return name+"******"+age;
}
}
public class HashSetTest {//这个是我的实现类
/*
* HashSet的特点:元素无序,并且没有重复元素.
* 去除相同的对象,通过复写hashcode,equals,toString来完成
*/
public static void main(String[] args) {
HashSet<Person> hs = new HashSet<Person>();
Person p1 = new Person();
p1.setName("段哲");
p1.setAge(20);
Person p2 = new Person();
p2.setName("小梦");
p2.setAge(20);
Person p3 = new Person();
p3.setName("小龙龙");
p3.setAge(22);
Person p4 = new Person();
p4.setName("小梦");
p4.setAge(20);
Person p5 = new Person();
p5.setName("冰冰冰");
p5.setAge(23);
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4);
hs.add(p5);
Iterator<Person> it = hs.iterator();
while(it.hasNext()){
Person p = it.next();
System.out.println(p);
}
}
}
在这个程序下的运行结果是
冰冰冰******23
小龙龙******22
小梦******20
段哲******20
在这里可以看到,小哲和小梦是年龄相同的,而但是名字不同,在程序里的比较
可能是HashCode()这里的数字相同了,但是后面的名字和年龄的比较却是不同,或者是直接就 HashCode() 这里就没有通过
而里面有两个小梦,同时他们的年龄也相同,那么HashCode()这个方法就会通过,然后调用equals()方法,结果返回值是ture,那么就不进行存储
在这里也有可能HashCode() 值相同就是这种情况了
20+50=70;
50+20=70;
所以就在后边乘以了56,让其数值有更大的变化
|