HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
此外,在java编程语言中,最基本的结构就是两种:数组、模拟指针(引用)。所有的数据结构都可以用这两个基本结构来构造。
HashMap底层就是一个数组结构,数组中的每一项又是一个链表。新来的Entry节点插入链表时,使用的是“头插法”。使用“头插法”的原因是hashmap的作者认为“后插入的Entry被查找的可能性更大”。
当新建一个HashMap的时候,就会初始化一个数组。
1、当new一个HashMap时,源码如下:
/**
* The table, resized as necessary. Length MUST Always be a power of two.
*/
transient Entry[] table;
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
final int hash;
……
}
分析:Entry就是数组中的元素,Map.Entry其实是一个key.value(键值对),这个键值对有指向下一个元素的引用,所以这就又构成了一个链表结构。
2、存储(put)数据时,源码如下:
public V put(K key, V value) {
// HashMap允许存放null键和
HashMap数据结构与存储原理

HashMap是Java中的一种数据结构,结合了数组和链表。在存储时,它根据key的hashCode计算存储位置,使用头插法形成链表。查询时,通过key的hashCode找到数组位置并遍历链表。容量设计为2的n次幂以优化分布。当链表过长,Java8会转为红黑树提高效率。
最低0.47元/天 解锁文章
4502

被折叠的 条评论
为什么被折叠?



