0. HashMap(TreeMAP)、HashSet、HashTable 的关系

  • HashMap 的底层则维护着 Node<K, V>[] table; 一个一维数组用于快速访问(只在初次使用时进行初始化,当需要扩容时,When allocated, length is always a power of two.)

    static class Node<K,V> implements Map.Entry<K,V> {final int hash;          // 此处的 hash 相当于 bucketfinal K key;V value;Node<K,V> next;          // 每个节点均链接着一个链表;

    在调用 get 方法返回该 key 对应的 value 时,先根据 key 对应的 hash 找到 bucket

    if ( (tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null)
    {if (first.hash == hash && // always check first node((k = first.key) == key || (key != null && key.equals(k)))) {return first;      // 找到直接返回}// 否则遍历其链表if ( (e = first.next) != null) {do {....} while ((e = e.next) != null);}
    }
  • HashMap 在解决冲突时,采用的是冲突链表(Separate chaining with linked lists)的方式;

  • HashSet 与 HashMap 有着相同的实现,HashSet 底层维护着一个 HashMap 对象,通过适配器模式是对 HashMap 的进一步封装(限制)
  • HashMap实现了Map接口,允许放入null元素,除该类未实现同步外,其余跟Hashtable大致相同
  • 与 TreeMap 相比,TreeMap 是有序的;

1. HashMap 的实现

  • 有两个参数可以影响HashMap的性能:初始容量(inital capacity)和负载系数(load factor,也叫装填因子)。初始容量指定了初始table的大小,负载系数用来指定自动扩容的临界值。

    • 当entry的数量(size)超过capacity*load_factor时,容器将自动扩容并重新哈希。
  • hashCode() 与 equals() 方法:
    • hashCode()方法决定了对象会被放到哪个bucket里,当多个对象的哈希值冲突时,equals()方法决定了这些对象是否是“同一个对象”

2. 散列(hash)的一些细节

如果 hashCode 是负数会怎样?负索引可不是你想要的。因此,一个改进的哈希公式会移出符号位(符号为同 0 相与),然后再用取模(即 %)运算符计算剩余部分。

(123  & 0x7FFFFFFF) % 20 = 3
(456 & 0x7FFFFFFF) % 20 = 16

references

  • Java HashSet和HashMap源码剖析

HashMap(HashSet)的实现相关推荐

  1. Hash+哈希表+HashMap+HashSet

    Hash+哈希表+HashMap+HashSet 哈希算法,是一类「算法」. 哈希表(Hash Table),是一种「数据结构」. 哈希函数,是支撑哈希表的一类「函数」. Map是映射/地图的意思,在 ...

  2. HashTable HashMap HashSet区别(java) [From 爱做饭的小莹子]

    Hashtable: 1. key和value都不许有null值 2. 使用enumeration遍历 3. 同步的,每次只有一个线程能够访问 4. 在java中Hashtable是H大写,t小写,而 ...

  3. Java Review - HashMap HashSet 源码解读

    文章目录 概述 HashMap结构图 构造函数 重点方法源码解读 (1.7) put() get() remove() 1.8版本 HashMap put resize() 扩容 get HashSe ...

  4. 聊聊传说中的散列哈希Hash算法,以及Java中的HashTable,HashMap,HashSet,ConcurrentHashMap......

    建议本文结合java源码来阅读,看了之后就什么都懂了,还有参考文献. 散列(Hash) 是一种按关键字编址的存储和检索方法 散列表(HashTable)根据元素的关键字确定元素的位置 散列函数(Has ...

  5. HashMap, HashSet, HashMap Iterator

    一.遍历HashMap Map<Integer, String> map = new HashMap<Integer, String>();   for(int i=0;i&l ...

  6. hash表、java中的hashMap/hashSet

    哈希表

  7. 【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别

    转自:http://blog.csdn.net/paincupid/article/details/47746341 一.HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间 ...

  8. HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类

    HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...

  9. HashMap和HashSet的区别

    转自:http://www.importnew.com/6931.html HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试 ...

  10. 【转】HashMap和HashSet的区别

    原文网址:http://www.importnew.com/6931.html HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的 ...

最新文章

  1. 阿里公开核心技术:如何摘下4项世界冠军,推理性能比第二名快5倍
  2. [转发] 【GRT安智网】HTC安致手机ROM国内首个中文定制教程goapk首发[最新厨房V0......
  3. 【pygame】pygame的init()
  4. win10 平台VS2019最简安装实现C++/C开发
  5. java util logging_简单日志记录,使用java.util.logging
  6. java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器
  7. HDU 2037 今年暑假不AC (贪心)
  8. LWIP的UDP相关API
  9. 39套漂亮的后台模板
  10. php空格占几个字符,一个空格几个字符?
  11. 【Python】基于Python的百度迁徙(2020年10月21日更)
  12. C语言 标准库stdio.h
  13. 基本DOS命令——文件操作
  14. man 1;man2 ;man 3区别
  15. 基于nodejs+vue社区互助平台- vscode项目
  16. 一些《点石成金》笔记
  17. 十大经典排序算法的动图
  18. spark写mysql优化简书_spark读写mysql、hive、kafka数据demo
  19. 用python爬取中国土地市场网上的土地出让公告所有标题
  20. Oracle spm

热门文章

  1. 关于 Openresty 的两三事
  2. 怎么查看linux硬盘多路径,linux下磁盘多路径
  3. 一个很简单的问题:遍历int数组并删掉所有偶数
  4. dubbo连接线上服务,没有配置好引发的错误
  5. 必须包含数字和字母,字符随意的正则表达式
  6. Python:文件的读取、创建、追加、删除、清空
  7. tensorflow图像数据处理
  8. C++库介绍-标准库、类库
  9. 剑指offer1:二维数组中的查找
  10. 【微信公众号开发】根据openId群发消息