简述: Map,HashMap的区别和用法

本文初发于 “曾晨de小站” zengchen233.cn,同步转载于此。

简述

HashMap特点:
使用哈希算法对键去重复,效率高,但无序。HashMap是Map接口的主要实现类。

Map集合的特点:
Map集合一次存储两个对象,一个键对象,一个值对象。键对象在集合中是唯一的,可以通过键来查找值。

在学习Mybatis的时候偶然使用到map进行参数传递发现

Map<String, Object> map = new HashMap<>();

这一句话是相当之迷惑,不太理解是什么意思,上网浏览解决完后总结一下。

Map接口

java.util中的集合类包含Java中某些最常用的类。最常用的集合类是ListMap

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不可重复)
  1. HashMap继承于AbstractMap类,实现了Map接口。Map是”key-value键值对”接口,AbstractMap实现了”键值对”的通用函数接口。

  2. 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机制的。

总结

  1. Map是一个接口,HashMap继承AbstractMap接口和实现了Map接口的类;
  2. Map是存储键和值这样的双列数据集合,但存储的数据是没有顺序的,其键不能重复,但其值是可以重复的,可以通过每一个键找到每一个对应的值;HashMap是线程不同步的,即线程不安全的,只有一个线程访问时效率较高。
  3. 两者功能相同,不过一般在项目中,HashMap用的比较多些。