[Java] Map / HashMap - 源代码学习笔记
Map
1. 用于关联 key 和 value 的对象,其中 key 与 key 之间不能重复。
2. 是一个接口,用来代替 Java 早期版本中的 Dictionary 抽象类。
3. 提供三种不同的视图用于观察内部数据,key 的 Set 视图、value 的 Collection 视图,key-value 关联对象的 Set 视图。
4. 有些实现会保证元素的顺序,例如 TreeMap。有些则不会保证,例如 HashMap
5. 如果 key 是可变对象,需要小心处理
6. key 值指向 Map 自身是不被允许,但是,value 值指向 Map 自身是被运行的。
7. 从 Java 8 开始,对 Map 接口引入了许多 Default 方法。目的是为了支持 Java 8 新引入的函数式编程,同时,又不打破既有的继承 Map 接口的代码。此处不展开讨论。
HashMap
1. 一个基于 hash table 的 Map 接口实现。
2. 允许 null 作为 key 或者 value
3. 不保证元素的顺序
4. 提供常量时间内能完成的操作,包括 get,put 操作
5. 有两个内置参数会影响 HashMap 的性能:initial capacity 和 loadfactor
6. 迭代过程,采用 fail-fast 机制。详情可参看 ArrayList fail-fast 。
7. 一个 hash 值对于一个箱子( bin )。当多个不同元素的 hash 值相同时,他们归属于同一个箱子。
HashMap 采用树结构来处理大量的 hash 值冲突的情况。树是指红黑树。
8. tableSizeFor(int) 返回一个大于参数的最小 2 的幂次方的值。例如 tableSizeFor(3) 返回 4, tableSizeFor(5) 返回 8。
9. remove(Object) 删除 Object 为 key 的记录,并返回关联的 value 值。如果无法找到需要删除的元素则返回 null 。 注意,返回 null 有两种情况,一种是无法找到元素,另一种是 Object 关联 value 本身就是 null。
10. removeNode(int hash, Object key, Object value, boolean matchValue, boolean movable) 是具体实现删除算法的方法,被 remove(Object) 调用。算法思路如下:
a. 根据 hash 找到对应的箱子
b. 在箱子中找到需要删除的对象。根据箱子内元素的存储结构的不同(列表或者树),采用不同的搜索方式。
c. 找到待删除对象后,根据不同的存储结构,调用采用不同的节点删除策略。
HashMap 的数据结构关系的简单示意图,如下。

11. keySet(),values() 和 entrySet() 分别返回 key, value, entry 的视图。由于仅仅内部数据的一个视图,视图和 HashMap 用的是同一份数据。所以,在视图上对元素进行的修改,同样会反映到 HashMap 中,反之亦然。
12. 基础的迭代器是 HashIterator。其他三个集成器:KeyIterator, ValueIterator, EntryIterator,均继承自 HashIterator 的迭代器。
13. afterNodeAccess, afterNodeInsertion, afterNodeRemoval 是应用于 linkedHashMap 的后期处理,在 HashMap 中不处理。
Jdk 版本: jdk1.8.0_31.jdk
[Java] Map / HashMap - 源代码学习笔记的更多相关文章
- [Java] LinkedList / Queue - 源代码学习笔记
简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...
- [Java] List / ArrayList - 源代码学习笔记
在阅读 List / ArrayList 源代码过程中,做了下面的笔记. LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记 List List ...
- HashMap源代码学习笔记
HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是由于它是通过计算散列码来决定存储的位置. HashMap中主要是通过key的hashCode来计算hash值的 ...
- Java后端高频知识点学习笔记1---Java基础
Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- jQuery源代码学习笔记_工具函数_noop/error/now/trim
jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Map接口使用的注意事项
import java.util.HashMap ; import java.util.Map ; import java.util.Set ; import java.util.Iterator ; ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Map接口
import java.util.HashMap ; import java.util.Map ; public class HashMapDemo01{ public static void mai ...
- 20165326 java第七周学习笔记
第七周学习笔记 MySQL(数据管理系统)学习 知识点总结: 不能通过关闭MySQL数据库服务器所占用的命令行窗口来关闭MySQL数据库. 如果MySQL服务器和MySQL管理工具驻留在同一台计算机上 ...
随机推荐
- one way WebService
WSDL支持4种消息交换方式: 1)单向(One-way):服务端接收消息: 2)请求响应(Request-response):服务端点接收请求消息,然后发送响应消息: 3)要求应答(So ...
- Nagios新添加的hosts和services有时显示,有时不显示问题解决
在nagios配置文件hosts.cfg和services.cfg中添加了新服务器和服务列表,重启nagios服务后刷新监控页面,新添加的服务器和服务列表有时能显示出来,有时又显示不出来. 解决方法: ...
- Dell服务器MegaCli命令只返回Exit Code: 0x00问题分析
今天同事给我说一台dell的服务器做了raid后,使用MegaCli看不到raid信息,上去看了一下确实不返回任何raid信息,但是确实机器上做了raid. 这就奇怪了,然后把MegaCli升级到最新 ...
- Orace数据库锁表的处理与总结<摘抄与总结二>
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误. TX锁等待的分析 Oracle数据库中一般使用行级锁. 当Oracle ...
- 解决UITabeleViewCell的分割线不能铺满问题
-(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)] ...
- C语言求2的100次方怎么解,大整数运算
#include "stdio.h"int ai[100]; void main(){ int a,b; ai[99]=1; for(b=0;b<100;b++) for( ...
- ScheduleThreadPoolExecutor源码分析(二)
DelayedWorkQueue: DelayedWorkQueue实现了BlockingQueue接口,因此其可以作为线程池的任务队列.BlockingQueue的主要属性有以下几个: privat ...
- removing right click context menu options on recycle bin
Humpty is correct as always First you might want to make a backup of the reg key then remove the Wa ...
- python3 读取大文件分解成若干小文件
有个数据实在太大了,有1.7G,打开慢,改文件也慢,我们将其分解成若干个中等文件 #!/usr/bin/env python3 # -*- coding: utf-8 -*- f = open(& ...
- ng-class css样式
<style> .error{background-color: red;} .warning{background-color: yellow;} </style> < ...