当我coding Map<String,Object> map=new HashMap<String,Object> 时,我敲下的是啥?

1.Map:即 Interface Map<K,V> K - key的类型 V - value的类型

也就是说Map是一个接口,它的每个元素包含一个key对象和一个value对象(这两个对象的类型可以不一样)且在这两个对象之间存在一种映射的对应关系,所以从Map集合中访问元素时,只要指定了key就可以找到对应的value,因此key必须是唯一的不能重复,当key相同时,后面的value值会覆盖之前的value值;

那Map既然是一个接口,那看一下Map定义的一些通用的方法:

V get(Object key)
返回指定键映射到的值,或者null此映射是否不包含键的映射。
int hashCode()
返回此映射的哈希码值。
boolean isEmpty()
如果此映射不包含键 - 值映射,则返回true。
Set keySet()
返回Set此映射中包含的键的视图。
V put(K key, V value)
将指定的值与此映射中的指定键相关联(可选操作)。
Map接口有很多实现类例如 TreeMap, Hashtable, SortedMap,HashMap,这里只对HashMap进行介绍;

2.HashMap:即 Class HashMap<K,V>,是基于哈希表的Map接口实现。此实现提供所有可选的映射操作,并允许 空值和空键。这个类不保证地图的顺序; 特别是,它不保证该顺序会随着时间的推移保持不变。

①.HashMap的数据结构

在 Java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是指针(引用),HashMap 就是通过这两个数据结构进行实现。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。即HashMap 底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个 HashMap 的时候,就会初始化一个数组。

概括一下就是:HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据 hash 算法来决定其在数组中的存储位置,在根据 equals 方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry 时,也会根据 hash 算法找到其在数组中的存储位置,再根据 equals 方法从该位置上的链表中取出该Entry。

②.HashMap的两个影响其性能的参数:初始容量和负载因子。

容量是在哈希表中桶的数量,初始容量是简单地在创建哈希表中的时间的能力。负载因子衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即,重建内部数据结构),以便哈希表具有大约两倍的桶数。作为一般规则,默认加载因子(0.75)在时间和空间成本之间提供了良好的权衡。较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中 ,包括get和put)。在设置其初始容量时,应考虑映射中的预期条目数及其加载因子,以便最小化重新散列操作的数量。如果初始容量大于最大条目数除以加载因子,则不会发生重新加载操作。

③.既然HashMap实现了Map接口,那就一定要实现所有的接口的所有方法,所以此处就不写啦~

如下是简单的例子:


Map<String, Object> map = new HashMap<String, Object>();//创建Map对象 Object是所有类型的父类
 map.put(“publish”, publish);//存储key和value
 map.put(“status”, status); map.get(“publish”);//获取相应key的值