文章目录
一、hashmap是什么?
哈希表是一种以键-值(key-value)映射存储数据的结构,是一个散列表,我们只要输入待查找的值即key,即可查找到其对应的hashcode。
它是基于快速存取的角度设计的,也是一种典型的**“空间换时间”**的做法。
声明HashMap时,通常使用的都是默认的构造方法:HashMap<K,V>,在其内部包装了一个Node<K,V>的类,并且用Node型的数组table用来存储数据,与ArrayList一样的实现了元素的增删以及扩容等功能。K一般是8种基本类型的封装类和String类,可存储null的键和null的值。
二、hashmap的数据结构是什么样子的?
HashMap“链表散列”的数据结构,即数组和链表/红黑树(自平衡二叉查找树,链表size大于8时使用红黑树代替链表)的结合体。
Hashmap中key会被映射成数据所在的地址,而value就在以这个地址为头的链表中,这种数据结构在获取的时候就很快。但这里存在的问题就是如果hash桶较小,数据量较大,就会导致链表非常的长,所以需要引入红黑树。
三、hashmap的成员变量有哪些?
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。如下图:
hashmap包括几个重要的成员变量:table, size, threshold, loadFactor, modCount。
- table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的"key-value键值对"都是存储在Entry数组中的。 Entry 实现了Map.Entry 接口,即实现getKey(), getValue(), setValue(V value), equals(Object o), hashCode()这些函数。这些都是基本的读取/修改key、value值的函数。
- size是HashMap的大小,它是HashMap保存的键值对的数量。
- threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值=“容量*加载因子”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。
- loadFactor就是加载因子。
- modCount是用来实现fail-fast机制的。
四、HashMap中的常用方法有哪些?
方法 | 作用 |
---|---|
add()/ addall() | 添加元素 |
remove() /clear() | 删除元素 |
size() | 元素数量 |
isEmpty() | 是否为空 |
get() | 返回指定键所映射的值 |
equals() | 是否为同一个HashMap |
containsKey() | 是否包含指定的键 |
containsValue() | 是否包含指定的值 |
keySet() | 返回所有键的Set |
values() | 返回所有值的Collection |
entrySet() | 返回所有映射的Set |
五、HashMap中的hash算法是怎样的?
关于hashcode:
1、HashCode的存在主要是为