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 - 源代码学习笔记的更多相关文章

  1. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  2. [Java] List / ArrayList - 源代码学习笔记

    在阅读 List / ArrayList 源代码过程中,做了下面的笔记. LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记 List List ...

  3. HashMap源代码学习笔记

        HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是由于它是通过计算散列码来决定存储的位置. HashMap中主要是通过key的hashCode来计算hash值的 ...

  4. Java后端高频知识点学习笔记1---Java基础

    Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...

  5. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  6. jQuery源代码学习笔记_工具函数_noop/error/now/trim

    jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...

  7. 吴裕雄--天生自然java开发常用类库学习笔记:Map接口使用的注意事项

    import java.util.HashMap ; import java.util.Map ; import java.util.Set ; import java.util.Iterator ; ...

  8. 吴裕雄--天生自然java开发常用类库学习笔记:Map接口

    import java.util.HashMap ; import java.util.Map ; public class HashMapDemo01{ public static void mai ...

  9. 20165326 java第七周学习笔记

    第七周学习笔记 MySQL(数据管理系统)学习 知识点总结: 不能通过关闭MySQL数据库服务器所占用的命令行窗口来关闭MySQL数据库. 如果MySQL服务器和MySQL管理工具驻留在同一台计算机上 ...

随机推荐

  1. 在使用Kettle的集群排序中 Carte的设定——(基于Windows)

    本片文章主要是关于使用Kettle的UI界面: Spoon来实现基于集群的对数据库中的数据表数据进行排序的试验. 以及在实验过程中所要开启的Carte服务的一些配置文件的设置, 还有基于Windows ...

  2. 用java写bp神经网络(四)

    接上篇. 在(一)和(二)中,程序的体系是Net,Propagation,Trainer,Learner,DataProvider.这篇重构这个体系. Net 首先是Net,在上篇重新定义了激活函数和 ...

  3. javascript DOM小结

    一:定义 dom:文档对象模型. dom是针对HTML和XML文档的一个API.dom描绘了一个层次化的节点树,允许开发人员添加.移除.修改页面的某一部分. 1:childNodes(返回当前节点的子 ...

  4. Java GC 日志输出分析

    搜到的几篇讲GC日志的文章,学到了很多东西.但是有些错误或者不够精确的地方. 因此自己尝试着总结一下. 先写个程序,然后结合程序解释每句话的意思. 运行参数 -Xms200M -Xmx200M -Xm ...

  5. hdoj 2601(判断N=i*j+i+j)

    Problem E Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  6. this point

    // this.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespa ...

  7. modifytime是一个神奇的column name----这边文章是错的totally,因为我的实验不彻底。timestamp属性很神奇,头一个timestamp,会自动的成DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    在mysql里边modifytime是一个神奇的column name,试一下. 请执行sql语句 CREATE TABLE `test_time` ( `modifytime` timestamp ...

  8. 寒假挑战PythonTip(一人一python)总结——算法是程序的灵魂,程序员的心法

        2014年2月中旬,我上升到挑战python英雄榜第3名.这是我寒假修炼算法的成果之一.来一下总结吧! Linux的创始人Linus Torvalds在一次演讲中有一段涉及“什么才是优秀程序员 ...

  9. Sublime text3 JS语法检测工具安装及使用

    Sublime text3 JS语法检测工具安装及使用 工具/原料 sublime text3 nodejs sublimeLinter sublimeLinter-jshint 方法/步骤 首先ct ...

  10. python【第六篇】面向对象编程

    面向对象编程 一.编程范式:编程的方法论.程序员编程的“套路”及“特点”特点总结,抽象成方法.规范. 二.面向对象编程介绍: 1.描述 世界万物,皆可分类:世间万物,皆为对象:只要是对象,就肯定属于某 ...