接口java.util.Map,包括3个实现类:HashMap、Hashtable、TreeMap。当然还有LinkedHashMap、ConcurrentHashMap 、WeakHashMap。
Map是用来存储键值对的数据结构,键值对在数组中通过数组下标来对其内容索引的,而键值对在Map中,则是通过对象来进行索引,用来索引的对象叫做key,其对应的对象叫value。
Map与Collection在集合框架中属并列存在
Map是一次添加一对元素(存储的是夫妻,哈哈)。Collection是一次添加一个元素(存储的是光棍,哈哈)。
Map存储的是键值对。
Map存储元素使用put方法, Collection使用add方法。
Map集合没有直接取出元素的方法, 而是先转成Set集合, 再通过迭代获取元素。
Map集合中键要保证唯一性。
Map的两种取值方式keySet、entrySet
keySet
先获取所有键的集合, 再根据键获取对应的值。(即先找到丈夫,去找妻子)
entrySet
先获取map中的键值关系封装成一个个的entry对象, 存储到一个Set集合中,再迭代这个Set集合, 根据entry获取对应的key和value。
向集合中存储自定义对象 (entry类似于是结婚证)
HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。
keySet的演示图解:
entrySet的演示图解:
HashMap概述
HashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可选的映射操作,并允许使用null值和null键
它不保证映射的顺序,HashMap是Hashtable的轻量级实现(非线程安全的实现),它们都完成了Map接口。
HashMap的数据结构
哈希表是由数组+链表组成的,(注意,这是jdk1.8之前的)数组的默认长度为16。
为什么是数组+链表?
数组对于数据的访问如查找和读取非常方便,链表对于数据插入非常方便。
链表可以解决hash值冲突(即对于不同的key值可能会得到相同的hash值)
数组里每个元素存储的是一个链表的头结点。而组成链表的结点其实就是hashmap内部定义的一个类:Entity
Entity包含三个元素:key,value和指向下一个Entity的next。
本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/archive/2017/10.html,如需转载请自行联系原作者