0 0

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

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; 
         } 
          
     } 
      
} //结果是xx,就是查处了这个对象
======================================================================
======================================================================
======================================================================

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

1个答案 按时间排序 按投票排序

0 0

采纳的答案

回答如下
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方法比较

2011年1月18日 00:56

相关推荐

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    解析Java对象的equals()和hashCode()的使用

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...

    关于重写equals,hashcode以及compareTo方法!

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

    大厂真题之阿里云-Java实习生

    HashSet 是如何保证不重复的 向 HashSet 中 add ()元素时...重复( HashMap 比较key是否相等是先比较 hashcode 在比较 equals )。 HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程 环境下不安全)?

    sesvc.exe 阿萨德

    如果桶是一个链表则需要遍历判断里面的 hashcode、key 是否和传入 key 相等,如果相等则进行覆盖,并返回原来的值。 如果桶是空的,说明当前位置没有数据存入;新增一个 Entry 对象写入当前位置。 void addEntry(int...

    HashTable和HashMap的区别_动力节点Java学院整理

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...

    实验05 Java集合.doc

    注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...

    Java面试经典题,对JAVA面试很有帮助

    17.有没有可能两个不相等的对象有相同的hashcode 18.深拷贝和浅拷贝的区别是什么 19.final有哪些用法 20.static都有哪些用法 21.3*0.1 == 0.3返回值是什么 22.a=a+b与a+=b有什么区别吗 23.try catch finally,try里...

    java中级面试题(自己汇总)

    * HashSet如何元素不重复:先用HashCode判断地址是否相等,如相等再用equals方法比较。 HashMap、HashTable、ConcurrentHashMap * HashMap线程不安全的,HashTable线程安全的任一时间只有一个线程能写Hashtable,...

    HashSet和HashMap的区别_动力节点Java学院整理

    HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有...

    大厂真题之阿里云-Java实习生.pdf

    HashMap比较key是否相等是先比较hashCode再比较equals。 HashMap是否线程安全 HashMap不是线程安全的。如果有两个线程A和B,都进行插入数据,刚好这两条不同的数据经过哈希计算后得到的哈希码是一样的,且该位置还...

    java 集合----Map、Collection

    HashSet 的 add() 方法添加集合元素时实际上转变为调用 HashMap ...HashMap 的 put() 方法.hashCode() 判断返回值相等,如果返回值相等则再通过 equals 比较也返回 true,最终认为key对象是相等的已经在HashMap中存在。

    达内 coreJava 习题答案

    7、求 a+aa+aaa+.......+aaaaaaaaa=? 其中a为1至9之中的一个数,项数也要可以指定。 import java.util.Scanner; class Multinomial{ public static void main(String[] args){ int a; //定义输入的 a int ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.2.3 判断两个字符串是否相等 223 9.2.4 判断字符串的开头和结尾 225 9.2.5 分割字符串 225 9.2.6 在字符串中查找子字符串或字符 226 9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.2.3 判断两个字符串是否相等 223 9.2.4 判断字符串的开头和结尾 225 9.2.5 分割字符串 225 9.2.6 在字符串中查找子字符串或字符 226 9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 ...

Global site tag (gtag.js) - Google Analytics