[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管理工具驻留在同一台计算机上 ...
随机推荐
- IDEA 13》》》14破解
更新IDEA 15注册方式 http://15.idea.lanyus.com/ ------------------------------------------------ 之前的已不能用,下面 ...
- 如何让 .Net Console 控制台显示界面在最上层
可以利用 Win32 API 来控制 Console 窗口的 最大化 或 最小化. 废话不多说见以下代码: [DllImport("user32.dll", SetLastErro ...
- openURL的使用方法
openURL的使用方法 openURL的使用方法: view plaincopy to clipboardprint? [[UIApplication sharedApplication] open ...
- 百度地图API地址转换成经纬度
public class LngAndLatUtil { public static Map<String,Double> getLngAndLat(String address){ Ma ...
- Sqoop import加载HBase案例详解
简单写一下如何将订单表sqoop到hbase表中的步骤. 下表: 1.通过hbase shell 打开hbase. 2.创建一个hbase表 create 'so','o' 3.将so表的数据导入到h ...
- poj 1273.PIG (最大流)
网络流 关键是建图,思路在代码里 /* 最大流SAP 邻接表 思路:基本源于FF方法,给每个顶点设定层次标号,和允许弧. 优化: 1.当前弧优化(重要). 1.每找到以条增广路回退到断点(常数优化). ...
- 优秀Android开源项目
开源项目汇总: Trinea/android-open-project · GitHub 包含个性化控件.工具库.优秀项目.开发及测试工具等 优秀完整项目: 1.Google I/O Android ...
- Oracle数据库之动态SQL
Oracle数据库之动态SQL 1. 静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:一种为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大 ...
- 自定义复选框 checkbox 样式
默认的复选框样式一般在项目中都很少用 ,看起来也丑丑的.这里提供一个优化样式后的复选框.原理就是隐藏掉默认样式,在用设计好的样式替代 html结构 <div> <input type ...
- js获取url中的参数对象、js生成带参数的url
// 获取url中的参数,并返回一个对象 $.getRequestData = function() { var url = location.search; //获取url中"?" ...