HashMap(HashSet)的实现
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)的实现相关推荐
- Hash+哈希表+HashMap+HashSet
Hash+哈希表+HashMap+HashSet 哈希算法,是一类「算法」. 哈希表(Hash Table),是一种「数据结构」. 哈希函数,是支撑哈希表的一类「函数」. Map是映射/地图的意思,在 ...
- HashTable HashMap HashSet区别(java) [From 爱做饭的小莹子]
Hashtable: 1. key和value都不许有null值 2. 使用enumeration遍历 3. 同步的,每次只有一个线程能够访问 4. 在java中Hashtable是H大写,t小写,而 ...
- Java Review - HashMap HashSet 源码解读
文章目录 概述 HashMap结构图 构造函数 重点方法源码解读 (1.7) put() get() remove() 1.8版本 HashMap put resize() 扩容 get HashSe ...
- 聊聊传说中的散列哈希Hash算法,以及Java中的HashTable,HashMap,HashSet,ConcurrentHashMap......
建议本文结合java源码来阅读,看了之后就什么都懂了,还有参考文献. 散列(Hash) 是一种按关键字编址的存储和检索方法 散列表(HashTable)根据元素的关键字确定元素的位置 散列函数(Has ...
- HashMap, HashSet, HashMap Iterator
一.遍历HashMap Map<Integer, String> map = new HashMap<Integer, String>(); for(int i=0;i&l ...
- hash表、java中的hashMap/hashSet
哈希表
- 【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
转自:http://blog.csdn.net/paincupid/article/details/47746341 一.HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间 ...
- HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类
HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...
- HashMap和HashSet的区别
转自:http://www.importnew.com/6931.html HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试 ...
- 【转】HashMap和HashSet的区别
原文网址:http://www.importnew.com/6931.html HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的 ...
最新文章
- 阿里公开核心技术:如何摘下4项世界冠军,推理性能比第二名快5倍
- [转发] 【GRT安智网】HTC安致手机ROM国内首个中文定制教程goapk首发[最新厨房V0......
- 【pygame】pygame的init()
- win10 平台VS2019最简安装实现C++/C开发
- java util logging_简单日志记录,使用java.util.logging
- java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器
- HDU 2037 今年暑假不AC (贪心)
- LWIP的UDP相关API
- 39套漂亮的后台模板
- php空格占几个字符,一个空格几个字符?
- 【Python】基于Python的百度迁徙(2020年10月21日更)
- C语言 标准库stdio.h
- 基本DOS命令——文件操作
- man 1;man2 ;man 3区别
- 基于nodejs+vue社区互助平台- vscode项目
- 一些《点石成金》笔记
- 十大经典排序算法的动图
- spark写mysql优化简书_spark读写mysql、hive、kafka数据demo
- 用python爬取中国土地市场网上的土地出让公告所有标题
- Oracle spm