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

解决方案

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

时间: 2024-12-25 09:15:45

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

php数组判断键值是否存在示例

PHP 检测数组是否存在某个键值 判断数组索引是否存在 array_key_exists(); bool array_key_exists ( mixed key, array search )  代码如下 复制代码 <?php /*   array_key_exists() 在给定的 key 存在于数组中时返回 TRUE.key 可以是任何能作为数组索引的值.   */   $search_array = array("first" => 1, "second&

Java中对HashMap的深度分析

在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题.找遍了大大小小的论坛,也把<Java 虚拟机规范>,<apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector>,和<Thinking in Java>翻了也找不到很好的答案,于是一气之下把JDK的 src 解压出来研究,扩然开朗,遂写此文,跟大家分享感

Java中对HashMap的深度分析与比较

比较 在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题.找遍了大大小小的论坛,也把<Java 虚拟机规范>,<apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector>,和<Thinking in Java>翻了也找不到很好的答案,于是一气之下把JDK的 src 解压出来研究,扩然开朗,遂写此文,跟大家

HashMap源码分析(jdk1.8)

HashMap源码前前后后看了好几次,也和同事分享过好几次,每次都有新的收获. 分享也是一种提高! 本文首写于个人云笔记(点击访问),经多次修改,短期内不会有重大修改了,现发于此,有任何问题欢迎交流指正.     本文最初借鉴于http://www.cnblogs.com/hzmark/archive/2012/12/24/HashMap.html,其基于jdk1.6,自己分析jdk1.8后,发现有很大的不同,遂记录于此.     Java最基本的数据结构有数组和链表.数组的特点是空间连续(大小

Java中对HashMap的深度分析_JSP编程

在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键.由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题.找遍了大大小小的论坛,也把<Java 虚拟机规范>,<apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector>,和<Thinking in Java>翻了也找不到很好的答案,于是一气之下把JDK的 src 解压出来研究,扩然开朗,遂写此文,跟大家分享感

Java的HashMap源码实现分析教程

1.简介 通过上面的一篇随笔我们知道了HashSet的底层是采用Map实现的,那么Map是什么?它的底层又是如何实现的呢?这下我们来分析下源码,看看具体的结构与实现.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值.Map.Entry是其的内部类,描述Map中的按键/数值对.需要指出的是 Map,允许null的键也允许null的值.它的实现主要有HashMap和sortedMap,其中SortedMap扩展了Map使按键保持升序排列,下面我

Java Core系列之HashMap实现

最近在看Guava中的Cache的源码,它的实现基于ConcurrentHashMap,前段时间组里招人,据说很多看起来很牛掰的简历,一个HashMap就能刷掉很多,所以顺便把HashMap和ConcurrentHashMap的源码复习一遍.先从HashMap开始(另:Hashtable是HashMap的线程安全版本,它的实现和HashMap实现基本一致,除了它不能包含null值的key和value,并且它在计算hash值和数组索引值的方式要稍微简单一些.对于线程安全的实现,Hashtable简

hashmap查找与hashcode

问题描述 Map map=new HashMap();String s1=new String("AA");String s3=new String("AA");String s4="AA";String s6="AA";map.put(s1,"Value");String s2=(String)map.get(s3);String s5=(String)map.get(s4);s1==s3 false s

java-基础-TreeMap和HashMap

HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体现在两个方面: 1.多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized.如ArrayList和Vector,HashMa