总结:
//HashSet存储自定义对象
/*
* HashSet是如何保证元素唯一性的呢?
* 是通过元素的两个方法,hasCode和equals来完成的
* 如果元素的hashCode值相同,才会判断equals是否为true。
* 如果元素的hashCode值不同,不会调用equals。
*/
package Collection; import java.util.*; public class SetDemo { public static void main(String[] args) { HashSet hs=new HashSet(); hs.add(new Person("lisi01",22)); hs.add(new Person("lisi01",22)); hs.add(new Person("lisi03",22)); hs.add(new Person("lisi04",22)); Iterator it=hs.iterator(); while(it.hasNext()){ Person p=(Person)it.next(); System.out.println(p.getName()+"..."+p.getAge()); } } } class Person{ private String name; private int age; Person(String name,int age){ this.name=name; this.age=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 boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p=(Person)obj; return (this.name.equals(p.name)&&(this.age==p.age)); } }
结果如下:
HashSet不是元素不可重复吗?
原因:重复元素指是地址相同且内容也相同,而上述代码中的对象都是new开辟空间建立的,他们只是内容相同,而地址是不同的,所以HashSet把他们视为不同对象。
package Collection; import java.util.*; public class SetDemo { public static void main(String[] args) { HashSet hs=new HashSet(); hs.add(new Person("lisi01",22)); hs.add(new Person("lisi01",22)); hs.add(new Person("lisi03",22)); hs.add(new Person("lisi04",22)); Iterator it=hs.iterator(); while(it.hasNext()){ Person p=(Person)it.next(); System.out.println(p.getName()+"..."+p.getAge()); } } } class Person{ private String name; private int age; Person(String name,int age){ this.name=name; this.age=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 boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p=(Person)obj; //System.out.println(this.name+"....equals..."+p.name); return (this.name.equals(p.name)&&(this.age==p.age)); } //通过重写hashCode函数来解决出现相同元素问题 public int hashCode(){ //System.out.println(name+"...."); return (name.hashCode()+age*37); } }
结果: