A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ﹏゛心被伱牵 中级黑马   /  2012-10-23 08:39  /  1732 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

HashSet中的判断和删除的依据是先比较hashcode,如果不一样再比较equals方法,可是我找不到方法证明这个结论?求助啊

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

3 个回复

正序浏览
  1. package com.itcast.practise;

  2. import java.util.*;
  3. class PersonPractise{
  4.         private String name;
  5.         private int age;
  6.         PersonPractise(String name,int age){
  7.                 this.name = name;
  8.                 this.age = age;
  9.                  
  10.         }
  11.         public String getName(){
  12.                 return name;
  13.         }
  14.         public int getAge(){
  15.                 return age;
  16.         }
  17.         public void setName(String name){
  18.                 this.name = name;
  19.                
  20.         }
  21.         public void setAge(int age){
  22.                 this.age = age;
  23.                
  24.         }
  25.         //如果把hashCode方法注释掉可以看出如果对象不同,hashCode就不一样,只比较了hashCode没调用equals方法
  26.         //如果把hashCode方法不注释掉并且让它返回一个整数。那么PersonPractise的每个实例对象的hashCode都一样,
  27.         //根据结果显示,使用HashSet的add方法时调用了equals方法。
  28.         public int hashCode(){
  29.                 return 100;
  30.                
  31.         }
  32.         public boolean equals(Object obj){
  33.                 PersonPractise p =(PersonPractise)obj;
  34.                 //打印是怎么比较的
  35.                 System.out.println(this.name +"  equals  "+p.name);
  36.                 int num = this.name.compareTo(p.name);
  37.                 if(num >0)
  38.                         return false;
  39.                 else if(num<0)
  40.                         return false;
  41.                 else if(this.age>p.age)
  42.                         return false;
  43.                 else if(this.age<p.age)
  44.                         return false;
  45.                 else return true;
  46.                
  47.         }

  48.        
  49. }

  50. public class HashSetDemo {

  51.         /**
  52.          * @param args
  53.          */
  54.         public static void main(String[] args) {
  55.                 // TODO Auto-generated method stub
  56.                
  57.                 HashSet hs = new HashSet();
  58.                 PersonPractise lisi = new PersonPractise("lisi",25);
  59.                 PersonPractise aaa = new PersonPractise("aaa",21);
  60.                 PersonPractise zhangsan = new PersonPractise("zhangsan",25);
  61.                 hs.add(lisi);
  62.                 hs.add(aaa);
  63.                 hs.add(lisi);
  64.                 hs.add(zhangsan);
  65.                 //调用removeHashSet没有再次调用equals方法,说明调用add方法时就记录下了比较结果,lz只能看源码了。。。。
  66.                 hs.remove(zhangsan);
  67.                 sop(hs);

  68.         }
  69.         public static void sop(HashSet hs){
  70.                 Iterator it = hs.iterator();
  71.                 while(it.hasNext()){
  72.                         PersonPractise p =(PersonPractise)it.next();
  73.                         System.out.println(p.getName()+"-----"+p.getAge());
  74.                        
  75.                 }
  76.                        
  77.                
  78.         }

  79. }
复制代码
回复 使用道具 举报
本帖最后由 陈德基 于 2012-10-23 09:11 编辑

HashCode()和equals()方法都根据是HashSet集合的底层数据结构调用的,这个就要清楚的了解哈希表的原理了,也就是说当你把对象地址存储到集合中的时候会自动的先后调用这两个方法。如果要查原理的话,可能就要去查看源码了。
还有你说的有一点错误,HashSet集合中对象的比较是先比较哈希地址值是否相同,相同的才会再次通过equals()方法来对比其内容是否相同。如果哈希地址值都不相同的,那么就没有必要再进行对象内容的比较了。这就是为什么要复写hashCode()方法的原因,这样可以减少比较的次数提高效率。
回复 使用道具 举报
陈琦 来自手机 中级黑马 2012-10-23 08:59:21
沙发
你重写一下hashcode方法,然后方法体直接返回一个1,就能证明了。来自: Android客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马