HashSet集合中元素的是否相同,是通过判断元素的hashCode()方法和equals()方法,来区分的。因为,所存储元素的类型不同,所以,通常都会覆写hashCode()和equals()方法,如在存储自定义对象时,不仅要覆写hashCode(),也要覆写equals();方法。因为对象的equals()方法,比较的是对象在内存中的地址值,如果对象的hashCode值相同,地址不同,就会造成元素重覆,所以通过覆写equals()方法,使之比较的是对象的内容,就能解决些问题。
(ArrayLsit集合中元素是否相同,只通过equals()方法判断。)
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
/**
* @param args
*/
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add(new Person("LISI",22));
hs.add(new Person("LISI",23));
hs.add(new Person("LISI",24));
hs.add(new Person("LISI",25));
hs.add(new Person("LISI",25));
Iterator it=hs.iterator();
while(it.hasNext()){
Person p=(Person)it.next();
System.out.println(p.getName()+"--"+p.getAge());
}
}
}
class Person {
@Override
public boolean equals(Object obj) {//覆写Object 中的equals方法
if (this==obj){
return true;
}
if(!(obj instanceof Person)){
return false;
}
System.out.println(this+".......equals........."+obj);
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
@Override
public int hashCode() {//覆写hashCode方法,同时可以提高效率。(只要hashCode不同,就不需再调用equals方法。)
System.out.println(this+"......hashCode()");
return name.hashCode()+age*23;
}
private String name;
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) {
super();
this.name = name;
this.age = age;
}
public String toString(){
return name+":"+age;
}
}
/*显示结果:
LISI:22......hashCode()
LISI:23......hashCode()
LISI:24......hashCode()
LISI:25......hashCode()
LISI:25......hashCode()//这里先调用覆写的hashCode()方法,比较。
LISI:25.......equals......LISI:25//当前对象调用覆写的equals()方法与前一个对象比较内容。
LISI--23
LISI--25
LISI--24
LISI--22
*/
|