首先我们来看看HashMap的底层源码
/**
* Constructs an empty <tt>HashMap</tt> with the default initial capacity
* (16) and the default load factor (0.75).
*/
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
我们可以看到底层其实就是一个数组,而且是一个Entry类型的数组,我们来看看Entry类的源码
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
final int hash;
Entry<K,V> next;
它是一个静态内部类,成员变量有我们放进去的key,value以及指向下一个Entry对象的引用当我们调用put方法时
public V put(K key, V value) {
K k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, k, value, i);
return null;
}
它首先根据key值生成一个hash值,并通过以下方法
static int indexFor(int h, int length) {
return h & (length-1);
}
得到数组的存放位置,如果该位置已经有对象存在了,就顺着此对象的链开始寻找,如果e.hash == hash && eq(k, e.key)返回为真就用新的对象替换旧的对象并将旧的对象返回,如果都不成功,表示在链上不存在,这个时候就直接添加到数组,同时将添加的这个Entry的next指向被替换的那个Entry对象,实现如下
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
总的来说HashMap底层是用数组来实现,而每一个数组元素又可以当成一个链表的头,这样做是为了提高查询的效率,使得查找时间不会随Map的大小而改变
分享到:
相关推荐
《HashMap底层实现原理》 HashMap是Java编程语言中一个非常重要的数据结构,它在实际开发中被广泛应用。HashMap提供了一种高效、灵活的方式来存储和检索键值对数据,它的核心特性是快速查找,通常时间复杂度为O(1)...
Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树) 在Java集合中,HashMap是一个常用的数据结构,它基于Map接口实现,元素以键值对的方式存储,并且允许使用null键和null值。由于key不允许...
02-JDK1.7中的HashMap底层实现分析.mp4
03-JDK1.8中的HashMap底层实现分析.mp4
java 集合和泛型 1. Map接口 2. HashMap底层实现 3. Hash数据结构和算法 4. 红黑树数据结构和算法
HashMap底层原理.md
HashMap是Java中常用的一种数据结构,它基于哈希表实现,提供快速的键值对存储和检索。HashMap的核心原理是通过散列函数将键对象转换为哈希码,然后...了解它们的底层实现和区别,有助于在实际编程中做出最优的选择。
HashMap的底层原理主要依赖于哈希表,这是一种数据结构,它通过计算键的哈希码来实现高效的查找操作。 在HashMap中,每个元素都是一个键值对,存储在一个Entry对象中。当向HashMap添加键值对时,首先会计算键的哈希...
08-HashMap底层实现原理总结与展望.mp4
构造 首先来看下hashMap的构造方法 HashMap hashMap = new HashMap();...直接来看下hashMap的两个参数构造方法,在默认值初始化的时候,tableSizeFor控制着hashMap size的大小,具体的实现下看: public HashMap
本文将详细介绍HashMap的底层原理,包括其内部实现结构、关键字段的作用、以及JDK 1.7和JDK 1.8版本的主要区别。 首先,HashMap是基于哈希表的Map接口非同步实现,它允许使用null值和null键,这意味着HashMap在设计...
HashMap的底层实现依赖于数组、链表和红黑树三种数据结构。数组提供快速的定位能力,链表和红黑树解决了哈希冲突问题,同时也保证了在极端情况下HashMap的性能。 HashMap中几个关键字段的含义如下: - DEFAULT_...
HashMap 的底层实现原理可以分为两部分:数组 + 链表(jdk 1.7)和数组 + 链表/红黑树(jdk 1.8)。在jdk 1.7中,HashMap 使用数组 + 链表的结构来存储数据,而在 jdk 1.8 中,当链表的长度超过 8 个时,会将链表...
HashMap的底层结构是一个“链表散列”的数据结构,即数组和链表的结合体。数组:存储区间连续,占用内存严重,寻址容易,插入删除困难;链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易。HashMap综合...
HashMap的底层实现基于数组和链表,这使得它具有较快的查找速度。以下是关于HashMap的详细说明: 一、HashMap的基本原理 HashMap使用一个数组配合链表(JDK 1.8以后还引入了红黑树)来存储键值对。数组的长度通常...
### JDK 7.0集合系列解析之...通过深入解析HashMap在JDK 7.0中的底层实现原理,可以更好地理解其运行机制和性能特性。掌握这些知识,可以帮助开发者合理使用HashMap,并针对不同的应用场景作出适当的调整和优化。
9. HashMap底层实现原理和扩容机制JDK1.8以前:数组+单链表的组合,以键值对的方式存储元素。JDK1.8及以后:引入红黑树结构,添加元素时,若链表个数大于8,链表会转换为红黑树,反之小于6时会修剪或还原成链表结构...