简述: Map,HashMap的区别和用法
本文初发于 “曾晨de小站” zengchen233.cn,同步转载于此。
简述
HashMap特点:
使用哈希算法对键去重复,效率高,但无序。HashMap是Map接口的主要实现类。
Map集合的特点:
Map集合一次存储两个对象,一个键对象,一个值对象。键对象在集合中是唯一的,可以通过键来查找值。
初
在学习Mybatis
的时候偶然使用到map进行参数传递发现
Map<String, Object> map = new HashMap<>();
这一句话是相当之迷惑,不太理解是什么意思,上网浏览解决完后总结一下。
Map接口
java.util
中的集合类包含Java
中某些最常用的类。最常用的集合类是List
和Map
。
Map
是一种键-值对
(key-value)集合,Map集合中的每一个元素都包含一个键对象和一个值对象。其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是Map
类型的,就像数组中的元素还可以是数组一样。
Map
接口主要有两个实现类:HashMap
类和 TreeMap
类。其中,HashMap
类按哈希算法来存取键对象,而TreeMap
类可以对键对象进行排序。
方法名称 | 说明 |
---|---|
V get(Object key) | 返回 Map 集合中指定键对象所对应的值。V 表示值的数据类型 |
V put(K key, V value) | 向 Map 集合中添加键-值对,返回 key 以前对应的 value,如果没有, 则返回 null |
V remove(Object key) | 从 Map 集合中删除 key 对应的键-值对,返回 key 对应的 value,如果没有,则返回null |
Set entrySet() | 返回 Map 集合中所有键-值对的 Set 集合,此 Set 集合中元素的数据类型为 Map.Entry |
Set keySet() | 返回 Map 集合中所有键对象的 Set 集合 |
HashMap类
- HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现
- HashMap中的Entry对象是无序排列的
- Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射(key不可重复)
HashMap继承于AbstractMap类,实现了Map接口。Map是”key-value键值对”接口,AbstractMap实现了”键值对”的通用函数接口。
HashMap是通过”拉链法”实现的哈希表。它包括几个重要的成员变量:table, size, threshold, loadFactor, modCount。
(1) table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的”key-value键值对”都是存储在Entry数组中的。
(2) size是HashMap的大小,它是HashMap保存的键值对的数量。
(3) threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值=“容量*加载因子”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。
(4) loadFactor就是加载因子。
(5) modCount是用来实现fail-fast机制的。
总结
- Map是一个接口,HashMap继承AbstractMap接口和实现了Map接口的类;
- Map是存储键和值这样的双列数据集合,但存储的数据是没有顺序的,其键不能重复,但其值是可以重复的,可以通过每一个键找到每一个对应的值;HashMap是线程不同步的,即线程不安全的,只有一个线程访问时效率较高。
- 两者功能相同,不过一般在项目中,HashMap用的比较多些。