黑马程序员技术交流社区
标题:
HashSet中的判断和删除
[打印本页]
作者:
﹏゛心被伱牵
时间:
2012-10-23 08:39
标题:
HashSet中的判断和删除
HashSet中的判断和删除的依据是先比较hashcode,如果不一样再比较equals方法,可是我找不到方法证明这个结论?求助啊
作者:
陈琦
时间:
2012-10-23 08:59
你重写一下hashcode方法,然后方法体直接返回一个1,就能证明了。
作者:
怪盗急得
时间:
2012-10-23 09:06
本帖最后由 陈德基 于 2012-10-23 09:11 编辑
HashCode()和equals()方法都根据是HashSet集合的底层数据结构调用的,这个就要清楚的了解哈希表的原理了,也就是说当你把对象地址存储到集合中的时候会自动的先后调用这两个方法。如果要查原理的话,可能就要去查看源码了。
还有你说的有一点错误,HashSet集合中对象的比较是先比较哈希地址值是否相同,相同的才会再次通过equals()方法来对比其内容是否相同。如果哈希地址值都不相同的,那么就没有必要再进行对象内容的比较了。这就是为什么要复写hashCode()方法的原因,这样可以减少比较的次数提高效率。
作者:
杜正华
时间:
2012-10-23 10:51
package com.itcast.practise;
import java.util.*;
class PersonPractise{
private String name;
private int age;
PersonPractise(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
//如果把hashCode方法注释掉可以看出如果对象不同,hashCode就不一样,只比较了hashCode没调用equals方法
//如果把hashCode方法不注释掉并且让它返回一个整数。那么PersonPractise的每个实例对象的hashCode都一样,
//根据结果显示,使用HashSet的add方法时调用了equals方法。
public int hashCode(){
return 100;
}
public boolean equals(Object obj){
PersonPractise p =(PersonPractise)obj;
//打印是怎么比较的
System.out.println(this.name +" equals "+p.name);
int num = this.name.compareTo(p.name);
if(num >0)
return false;
else if(num<0)
return false;
else if(this.age>p.age)
return false;
else if(this.age<p.age)
return false;
else return true;
}
}
public class HashSetDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet hs = new HashSet();
PersonPractise lisi = new PersonPractise("lisi",25);
PersonPractise aaa = new PersonPractise("aaa",21);
PersonPractise zhangsan = new PersonPractise("zhangsan",25);
hs.add(lisi);
hs.add(aaa);
hs.add(lisi);
hs.add(zhangsan);
//调用removeHashSet没有再次调用equals方法,说明调用add方法时就记录下了比较结果,lz只能看源码了。。。。
hs.remove(zhangsan);
sop(hs);
}
public static void sop(HashSet hs){
Iterator it = hs.iterator();
while(it.hasNext()){
PersonPractise p =(PersonPractise)it.next();
System.out.println(p.getName()+"-----"+p.getAge());
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2