集合总结笔记(jdk 1.6)——HashMap/LinkedHashMap

本文详细介绍了HashMap与LinkedHashMap的数据结构、工作原理及主要操作,包括添加、删除、迭代等过程,并对比了两者之间的主要区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HashMap

1、前言

HashMap是使用结合了数组和链表优点的哈希表实现,是一种键值对(K-V)形式的存储结构。HashMap的key和value都允许为空、value允许重复、无序、非线程安全。HashMap的存储单元Entry有四个属性:

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    int hash;
    ...
}

存储结构如图:


2、添加数据

(1)HashMap在new的时候构造出了一个大小为16的Entry数组table,Entry内所有数据都取默认值null;

(2)如果key为空会默认放在第0位的数组table位置上(如果为空的key已存在会覆盖,获得数组0的元素,循环Entry.next判断)

(3)key 不为null,根据key对象的hashcode,重新计算hash值,根据新的hash值和数组长度取模计算得到key对象对应的数组下标位置index;

(4)判断key是否存在,存在则覆盖(获得数组index的元素,循环Entry.next判断,先判断hash是否相等再比较key对象);

(5)把新添加的数据新建一个Entry,其nex指向数组index位置上的元素,新的Entry占据数组index位置;

3、扩容

(1)取当前数组table长度的2倍作为新数组的大小,新建newTable数组

(2)轮询原table数组的每一个位置,将每个位置上连接的Entry,跟hash计算重新算出在新newTable数组上的位置,并以链表形式连接

(3)原table上的所有Entry全部轮询完毕之后,意味着原table上面的所有Entry已经移到了新的table上,HashMap中的table指向newTable

4、删除数据

(1)根据key的hash找到待删除的键值对位于table的哪个位置i上

(2)记录一个prev表示待删除的Entry的前一个位置Entry,赋值e为当前Entry

(3)从table[i]开始遍历链表,假如找到了匹配的Entry,要做一个判断,这个Entry是不是table[i]:

a.是的话,table[i]就直接是table[i]的下一个节点,后面的都不需要动

b.不是的话,e的前一个Entry也就是prev,prev的next指向e的后一个节点,也就是next,这样,e所代表的Entry就被踢出了,e的前后Entry就连起来了

5、迭代

(1)初始化HashIterator迭代器时,从table[0]开始循环获得开始的current元素(取到table不为null的元素开始

(2)根据current的next可以获得当前table[0]中所有Entry

(3)直到current的next为null,说明这个table[0]里面的Entry没有了,开始table[size]的next循环

6、HashMap与Hashtable区别

a.Hashtable是线程安全的,Hashtable所有对外提供的方法都使用了synchronized,也就是同步,而HashMap则是线程非安全的

b.Hashtable不允许空的key和value

c.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey

二、LinkedHashMap

1.前言

LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。与HashMap的区别在于LinkedList是有序的,它的数据结构Entry多了after和before。注意其before、After是用于维护Entry插入的先后顺序的,next是用于在同一个数组位置上的Entry链接指向。

存储结构示意图:

2.添加数据

LinkedHashMap继承自HashMap,添加操作基本与HashMap一致,只是多个维护双向链表的操作。新增一个head(head是空元素,只维护了after和before),把Entry里面的after和before按照顺序链起来。head的before指向最后一个元素,after指向第一个元素;中间元素也前后元素通过after和before指向链接;最后一个元素的after指向head,形成链接环

3.删除数据

跟HashMap操作一样,只是维护Entry元素里面after和before指向,把删除元素的前后Entry链接起来

4.迭代

初始化nextEntry从head.after开始,直至next到head终止




备注:

HashMap参考资料:http://www.importnew.com/25049.html

LinkedHashMap参考资料:http://www.importnew.com/25103.html




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值