HashMap简介
HashMap是Java中常用的一种Map容器,它是基于哈希表的Map接口的实现,允许将null作为键值,允许将多个键值对映射到相同的键,它支持快速查找,但是不支持顺序遍历。
HashMap实现原理
HashMap的底层实现是基于数组和链表的数据结构,它的核心是一个Entry数组,每一个Entry都是一个键值对,每一个Entry都有一个键和一个值,当添加Entry时,首先计算Entry的哈希值,根据哈希值确定Entry在数组中的位置,如果发生哈希冲突,就会将冲突的Entry放在链表中,这样就可以保证查询的高效性。
HashMap源码实现
HashMap的源码实现如下:
public class HashMap<K,V> implements Map<K,V> {// 存放Entry的数组private Entry<K,V>[] table;// 存放Entry的链表private LinkedList<Entry<K,V>> linkedList;// 存放Entry的数量private int size;// 构造函数,初始化table数组public HashMap() {table = new Entry[16];}// 添加Entrypublic void put(K key, V value) {// 计算Entry的哈希值int hash = hash(key);// 获取Entry在数组中的位置int index = indexFor(hash, table.length);// 如果数组中该位置有Entry,则将Entry添加到链表中if (table[index] != null) {linkedList.add(table[index]);}// 将Entry添加到数组中table[index] = new Entry<>(key, value);size++;}// 根据键获取值public V get(K key) {// 计算Entry的哈希值int hash = hash(key);// 获取Entry在数组中的位置int index = indexFor(hash, table.length);// 获取EntryEntry<K,V> entry = table[index];// 如果Entry不为空,且Entry的键和要查找的键相同,则返回Entry的值if (entry != null && entry.getKey() == key) {return entry.getValue();}// 如果Entry为空,则从链表中查找if (linkedList != null) {for (Entry<K,V> e : linkedList) {if (e.getKey() == key) {return e.getValue();}}}return null;}// 其他方法的实现省略...}