类关系图

### ![](../assets/20180418143344001.png)常用接口及实现类

* Map

* Dictionary

* HashMap

* Hashtable

* LinkedHashMap

* SortedMap

* TreeMap

* WeakHashMap

* EnumMap

下面针对各个实现类的特点做一些说明:

\(1\) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

\(2\) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它承自Dictionary类,并且是线程安全的,任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换。

\(3\) LinkedHashMap:LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。

\(4\) TreeMap:TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。如果使用排序的映射,建议使用TreeMap。在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。

对于上述四种Map类型的类,要求映射中的key是不可变对象。不可变对象是该对象在创建后它的哈希值不会被改变。如果对象的哈希值发生变化,Map对象很可能就定位不到映射的位置了。

通过上面的比较,我们知道了HashMap是Java的Map家族中一个普通成员,鉴于它可以满足大多数场景的使用条件,所以是使用频度最高的一个。下文我们主要结合源码,从存储结构、常用方法分析、扩容以及安全性等方面深入讲解HashMap的工作原理。

### Map集合类对null的支持

|集合类 | key | value | super | 说明 |

| :---: | :---: |:---: |:---: | ---: |

| Hashtable | 不允许null |不允许null | Dictionary | 线程安全|

| ConcurrentHashMap | 不允许null | 不允许null| AbstractMap|锁分段技术(JDK8:CAS) |

| TreeMap | 不允许null | 允许null | AbstractMap | 线程不安全|

| HashMap | 运行为null |运行为null| AbstractMap| 线程不安全|

【参考资料】

【美团公众号】 -- [https://tech.meituan.com/java-hashmap.html](https://tech.meituan.com/java-hashmap.html)

java自定义键值对_KV键值对数据类型相关推荐

  1. java 自定义注解以及获得注解的值

    1.自定义注解 import java.lang.annotation.*;@Documented @Target(ElementType.FIELD) @Inherited @Retention(R ...

  2. linux的自定义input,linux键值到Android键值的转换与自定义

    首先要确定按键输入设备是对应/dev/input目录下哪个event,根据VID PID匹配对应的kl文件,可通过如下命令 cat /proc/bus/input/devices 查看设备信息 fra ...

  3. java如何获得键值_如何在java中取map中的键值 的两种方法

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; public class Test { /** * @param args ...

  4. Java删除properties配置文件中指定键值的代码

    将开发过程较好的一些内容片段记录起来,下面的内容段是关于Java删除properties配置文件中指定键值的内容. public static boolean deleteKeyValue4Pro(S ...

  5. django自定义模板标签,通过键获取字典的值,屏蔽姓名等隐蔽信息并调用展示到页面上

    1.在web开发中,经常会说要屏蔽某些字眼,用*来屏蔽客户比较隐蔽的信息,如身份证,姓名,手机号等等,当然,如果安全性做得好一点的会加密身份证后存入数据库,如果没有的话,直接取出来,页面要展示的时候, ...

  6. JAVA中如何取map的值_如何在java中取map中的键值 的两种方法

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; public class Test { /** * @param args ...

  7. Java中如何给map数组制空,java.util.HashMap可以存储null键和null值。( )

    java.util.HashMap可以存储null键和null值.( ) 答:对 2008年网络新词新语大多与国家的社会生活息息相关,体现出网民高涨的参政议政热情和明显的舆论监督意识. 答:对 冯·诺 ...

  8. 约束,MySQL约束,非空默认值,主键外键唯一自增,完整详细可收藏

    文章目录 1. 约束(constraint)概述 2. 非空约束 3. 唯一性约束 4. PRIMARY KEY 约束 5. 自增列:AUTO_INCREMENT 6. FOREIGN KEY 约束 ...

  9. 选择某种Map集合保存学号从1到15的学员的学号(键)和姓名(值)

    选择某种Map集合保存学号从1到15的学员的学号(键)和姓名(值),  * 学号用字符串表示,输入的时候要以学号乱序的方式存入Map集合,  * 然后按照学号从大到小的顺序将Map集合中的元素输出打印 ...

最新文章

  1. mysql解决丢失更新_mysql 数据丢失更新的解决方法
  2. c++ 方向_GE医疗C型臂系列手术机设备全球装机量破万
  3. SpringBoot 之 跳转页面的几种方法
  4. mybatis 带分号批量sql_请查收,32 道 MyBatis 的高频面试题已答完
  5. 下载UBUNTU的可用链接
  6. Dynamics AX2012 弹出Message Box
  7. 一个比较有含金量的架构认证
  8. TLQ 异常杀进程清理 IPC 操作步骤
  9. css两列等高,css多列等高布局
  10. 关于企业数字化转型的建议
  11. 对泊松分布的一点理解
  12. 拉伸——CAD做三维图的常用指令
  13. 天耀18期 -08.面向对象-上转型【作业】
  14. 【运筹学】对偶理论 : 互补松弛性 ( 定理内容 | 定理证明 )
  15. 数据结构堆栈 内存堆栈_零堆栈数据科学家第二部分秋天
  16. PPT文档播放没声音了怎么办?
  17. 韩寒:忘记自己是女人,然后借着风,像男人一样去奋斗
  18. Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl问题排查
  19. 卷积神经网络图像尺寸预处理-----图像裁剪
  20. vue 高德地图 矢量覆盖物绘制 多边形 线面绘制 1.0

热门文章

  1. 为技术匠人打call!用匠人精神,打造技术文化
  2. 用ARM DS-5进行android linux开发
  3. MapReduce太慢了,记一次对它的调优建议。
  4. leetcode 1008. Construct Binary Search Tree from Preorder Traversal | 1008. 前序遍历构造二叉搜索树(Java)
  5. leetcode 208. Implement Trie (Prefix Tree) | 208. 实现 Trie 前缀树(Java)
  6. netty系列之:自定义编码解码器
  7. 小师妹学JavaIO之:Buffer和Buff
  8. Spring Boot的快速入门
  9. CSS盒子模型的使用及其注意事项——响应式Web系列学习笔记
  10. 4行代码解决:L1-057 PTA使我精神焕发 (5分)