往HashSet集合中存储Person对象,如果姓名和年龄相同,视为同一人同一元素:
import java.util.HashSet;
import java.util.Iterator;
class Person{
String name;
int age;
public Person(){
super();
}
public Person(String name,int age){
super();
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 class HashSetDemo{
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("lisi4",24));
hs.add(new Person("lisi7",27));
hs.add(new Person("lisi1",21));
hs.add(new Person("lisi9",29));
hs.add(new Person("lisi7",27));
Iterator it=hs.iterator();
while(it.hasNext()){
Person p=(Person)it.next(); //强制转换
System.out.println(p.getName()+":"+p.getAge());
}
}
}
运行结果:
结果虽然是无序的,但是结果中却出现的相同的元素。
HashSet集合数据结构是哈希表,所以存储元素时,使用的是元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同。
要通过复写hashCode方法和equals方法:
import java.util.HashSet;
import java.util.Iterator;
class Person{
String name;
int age;
public Person(){
super();
}
public Person(String name,int age){
super();
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 int hashCode(){ //复写hashCode()
return name.hashCode()+age;
}
public boolean equals(Object obj){ //复写equals
if(this==obj) return true;
if(!(obj instanceof Person)) //instanceof运算符是用来在运行时指出对象是否是特定类的一个实例,返回值是一个布尔类型。这里是判断obj对象是否是Person类的一个实例。
throw new ClassCastException("类型错误"); //输入类型错误
Person p = (Person)obj;//强制转换
return this.name.equals(p.name) && this.age==p.age; //说明姓名和年龄相同则为同一元素
}
}
public class HashSetDemo{
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("lisi4",24));
hs.add(new Person("lisi7",27));
hs.add(new Person("lisi1",21));
hs.add(new Person("lisi9",29));
hs.add(new Person("lisi7",27));
Iterator it=hs.iterator();
while(it.hasNext()){
Person p=(Person)it.next(); //强制转换
System.out.println(p.getName()+":"+p.getAge());
}
}
}
运行结果: