`
chenzan2010
  • 浏览: 17817 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java中HashCode的作用和Map的实现结构

阅读更多

核心提示:Map 是一种数据结构,用来实现key和value 的映射。通过Key可以找到Value。实现类包括 HashMap,LinkedHashMap,TreeMap /** * Applies a supplemental hash function to a given hashCode, which * defends against poor quality hash functions. This is cr

 

 

Map 是一种数据结构,用来实现key和value 的映射。通过Key可以找到Value。实现类包括

HashMap,LinkedHashMap,TreeMap

  1. /**  
  2.  * Applies a supplemental hash function to a given hashCode, which  
  3.  * defends against poor quality hash functions.  This is critical  
  4.  * because HashMap uses power-of-two length hash tables, that  
  5.  * otherwise encounter collisions for hashCodes that do not differ  
  6.  * in lower bits. Note: Null keys always map to hash 0, thus index 0.  
  7.  */  
  8. static int hash(int h) {   
  9.     // This function ensures that hashCodes that differ only by   
  10.     // constant multiples at each bit position have a bounded   
  11.     // number of collisions (approximately 8 at default load factor).   
  12.     h ^= (h >>> 20) ^ (h >>> 12);   
  13.     return h ^ (h >>> 7) ^ (h >>> 4);   
  14. }   
  15.   
  16. /**  
  17.  * Returns index for hash code h.  
  18.  */  
  19. static int indexFor(int h, int length) {   
  20.     return h & (length-1);   
  21. }   
  22.   
  23. /**  
  24.  * Associates the specified value with the specified key in this map.  
  25.  * If the map previously contained a mapping for the key, the old  
  26.  * value is replaced.  
  27.  *  
  28.  * @param key key with which the specified value is to be associated  
  29.  * @param value value to be associated with the specified key  
  30.  * @return the previous value associated with <tt>key</tt>, or  
  31.  *         <tt>null</tt> if there was no mapping for <tt>key</tt>.  
  32.  *         (A <tt>null</tt> return can also indicate that the map  
  33.  *         previously associated <tt>null</tt> with <tt>key</tt>.)  
  34.  */  
  35. public V put(K key, V value) {   
  36.     if (key == null)   
  37.         return putForNullKey(value);   
  38.     int hash = hash(key.hashCode());   
  39.     int i = indexFor(hash, table.length);   
  40.     for (Entry<K,V> e = table[i]; e != null; e = e.next) {   
  41.         Object k;   
  42.         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {   
  43.             V oldValue = e.value;   
  44.             e.value = value;   
  45.             e.recordAccess(this);   
  46.             return oldValue;   
  47.         }   
  48.     }   
  49.   
  50.     modCount++;   
  51.     addEntry(hash, key, value, i);   
  52.     return null;   
  53. }   

HashMap 是以数组的结构,用哈希函数值跟数组的长度做位与运算,获取对应数组的索引。浏览key值时,不保证顺序。
LinkedHashMap 是以双向列表的结构做实现的,浏览key值时候,可以保证顺序。LinkedHashMap继承HashMap ,不同的是数据存储结构。

TreeMap 是以二叉树实现的Map接口。Map中的key值按照从小到大的顺序排列。key要实现comparable。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java集合知识-map、set等

    记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...

    AIC的Java课程1-6章

     弄清构造函数和终结方法在继承层次结构中的调用顺序,强调子类必须调用超类的构造函数分配空间和初始化超类数据。  掌握方法重写(override)的基本要求。  理解和使用关键字final。  理解包的...

    实验05 Java集合.doc

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

    廖雪峰 Java 教程.doc

    Java程序基本结构 变量和数据类型 整数运算 浮点数运算 布尔运算 字符和字符串 数组类型 流程控制 输入和输出 if判断 switch多重选择 while循环 do while循环 for循环 break和continue 数组操作 遍...

    JAVA基础课程讲义

    JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...

    Java基础知识点总结.docx

    equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下...

    疯狂JAVA讲义

    学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度...

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

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

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

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    新版java教程 全套javase零基础到高级视频教程小白自学编程下载地址

    ·玩转集合框架迭代器和HashCode和Equals重新排序 实战 ·实战teratori迭代器和自定义Comparable:排序接口 ·玩转ava操作文件File类常用操作 ·案例实战IO流Input、Output Stream流 ·详细常见Object、Math、String...

    Java容器.xmind

    container Collection 标记: 顶级接口 List 标记: interface ArrayList 标记: class ...底层数组实现,查询快,增删慢 ...底层数组实现,线程安全,...LinkedBlockingQueue 链表结构实现,无界队列(默认上限Integer.MAX_VALUE)

    java培训机构内部预习文档

    集合框架 Collection、List、Set、Map的接口及其实现类、迭代、Hash 算法与 hashCode 方法、comparable、泛型 chp12.异常 概念、分类、产生、传递、处理、自定义异常 chp13.线程 概念、创建、状态转换、数据共享、...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    易语言-HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    1、此HashMap类采用java jdk中HashMap的实现方式 2、相比网站上发布过的hashtable之类的源码: 此HashMap寻址方法是拉链法.比开放寻址法对连续内存要求更低 哈希函数用的是java中String.hashCode()算法(经实际验证其...

    sesvc.exe 阿萨德

    Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    jdk-8u202-linux-x64.tar

    在jdk1.8中对hashMap等map集合的数据结构优化。hashMap数据结构的优化,原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode...

Global site tag (gtag.js) - Google Analytics