x86timesxx 2011-01-18 00:07
浏览 250
已采纳

hashmap 判断键的相等依据是什么?equals()?hashcode()?==?

package collection;

import java.util.HashMap;

import java.util.Map;

public class Test2 {

 /** 
  * @param args 
  */  
 public static void main(String[] args) {  
     // TODO Auto-generated method stub  
     Map map=new HashMap();  
     map.put(new PhoneNumber(020,1234567),"xx");  
     System.out.println(map.get(new PhoneNumber(020,1234567)));  
}  

 private static class PhoneNumber{  
     /** 
      * @param areaCode 
      * @param extension 
      */  
     public PhoneNumber(int areaCode, int extension) {  
         this.areaCode =(short) areaCode;  
         this.extension = (short)extension;  
     }  

     private short areaCode;  
     private short extension;  

     public boolean equals(Object o){  

         if(o==this){  
             return true;  
         }  
         if(!(o instanceof PhoneNumber)){  
             return false;  
         }  
     PhoneNumber pn=(PhoneNumber)o;  
     return pn.extension==extension && pn.areaCode==areaCode;  
     }  
     //result就是我们得到的散列值,,计算过程有多种,这里只是个例子  
     public int hashCode(){  
         int result=17;  
         result=37*result+areaCode;  
         result=37*result+extension;  
         return result;  
     }  

 }  

} [color=red] [size=xx-large]//结果是xx,就是查处了这个对象[/size][/color]

[color=blue][size=xx-large]======================================================================

======================================================================[/size][/color]
[color=red][size=x-large]上述的这段代码中,判断hashmap的键相等,使用了equals方法,但是equals方法又重写了,使用的是==判断。
我的问题是
1----hashcode()方法在hashmap中哪里有调用?或者用处是什么???
2---- "=="是判断栈中的引用是不是指向同一个堆中的对象,但map.get方法中是new了一个键值对象,就是说,指向的不是同一个键值对象,结果居然查到了,就是说,它们指向同一个对象!!!为什么??????
3----是不是所有hash有关的类,要比较相等,都要重写hashcode方法???
4----总结下我的问题,其实就是hashmap中 equals() hashcode() == 这三者用处各是什么,哪里用的到?????????[/size][/color]

  • 写回答

1条回答 默认 最新

  • lanrenjun 2011-01-18 00:56
    关注

    回答如下
    1.hashcode这个方法是用来鉴定2个对象是否相等的,在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来讲,hashcode相当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。举个例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。
    2.你 new 出来的PhoneNumber对象是做为map的key 根据上面的1可以得到你获取的就是刚刚保存的key的值 这仅仅是在map对象中 ,实际中他们是不同的对象
    3.根据1,可以自己判断
    4.==号是值的比较 对于原始类型就是值的比较,对于引用类型就是引用地址的直接比较,‘==’在map中 没啥用 map只会调用equals方法比较

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗