1. HashMap
1.1 基本概念
1.1.1 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
1.1.2 HashMap<K,V>extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
1.1.3 HashMap 的实现不是同步的,这意味着它不是线程安全的
1.1.4 HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”.
初始容量 只是哈希表在创建时的容量
-> static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
static final int MAXIMUM_CAPACITY = 1 << 30;
加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
-> static final float DEFAULT_LOAD_FACTOR = 0.75f;
1.2 HashMap 的数据结构
实际上 HashMap的实现,是一个Entry数组,然后每个Entry元素又是一个单向链表。HashMap是以这种数据结构来解决hash碰撞的。在使用HashMap的时候,需要根据自己的实际情况来判断是否重写equals 和 hashcode方法 。
因为也是以数组的形式存在,所以扩容的时候,和Arraylist是一样的,需要开辟一个更大的空间,然后copy老数据。但是扩容的方式是不一样的,当hashmap的使用达到初始容量*加载因子的时候,HashMap 是直接扩展到原先的2倍。
1.3 主要的对外方法
1.3.1 clear() :clear() 的作用是清空HashMap。它是通过将所有的元素设为null来实现的。
1.3.2 containsKey() containsKey() 的作用是判断HashMap是否包含key。
1.3.3 containsValue() containsValue() 的作用是判断HashMap是否包含“值为value”的元素。
注意: 在hashset的方法中是contains方法,因为set不存在相同的元素,所以不用区分 key 和 value
1.3.4 entrySet()、values()、keySet()
entrySet()的作用是返回“HashMap中所有Entry的集合”,它是一个集合。当我们通过entrySet()获取到的Iterator的next()方法去遍历HashMap时,实际上调用的是 nextEntry() 。而nextEntry()的实现方式,先遍历Entry(根据Entry在table中的序号,