Java中的Map

本文介绍了HashMap、LinkedHashMap和TreeMap的区别,HashMap无序,而LinkedHashMap支持按照插入或访问顺序遍历。TreeMap则按升序或降序排列。此外,解释了Map的构造方法和扩容机制,并指出在数据量较大时,LinkedHashMap读取效率优于HashMap。最后讨论了如何通过改造LinkedHashMap实现LRU缓存策略。
摘要由CSDN通过智能技术生成

Map类型

LinkedHashMap继承自HashMap,TreeMap继承自SortedMap, HashMap和SortedMap都实现了Map接口。Map的主要方法有remove、size、containsKey、clear、containsValue、putIfabsent

Map构造方法

不带参数的构造方法,默认长度是16,默认的负载因子是0.75。等同于

Map<Integer,String> map = new HashMap(16, 0.75f);

超过75的坐标被占用后会进行扩容。扩容之后承2变成32。如果使用了new HashMap(3)实际相当于new HashMap(8),大于这个数字的2的n次方。如果new HashMap(10000, 0.75f),插入10000条数据不一定需要扩容,因为实际容量为12288(2的14次方)

Map成员变量

每存入一个键值对,HashMap内部就增加了一个Entry。

Entry<K,V> next;
final int hash;

HashMap顺序

HashMap是无序的,遍历输出的顺序与put的顺序无关,那么是按什么顺序输出的?假设

Map<Integer,String> map = new HashMap(16);
map.put(120, "hello");

120 % 16= 8,120的key就会放在位置8,如果再put一个key为40的值,40就放在120的next属性上
如果key是string类型,需要用到的方法1:

final int hash(Object key)

用hashCode()方法将key转换成hash码后并进行优化得到的hash码,如yuwen优化后的hash码为115347492。接下来需要用到方法2:

static int indexFor(int h, int length)

对优化后的hash码进行取址,确定在HashMap中的位置,如115347492在长度为16的HashMap中坐标为4

LinkedHashMap

数据量够大的时候,LinkedHashMap在读取的时间比HashMap短,写入的时候比HashMap长
LinkedHashMap可以按写入顺序和使用顺序(需要在构造函数中增加参数)进行遍历和输出。
LRUMAP是在有限的集合里面,如果存储的时候,集合超出了限制,那么就淘汰最近最少使用的数据,实际上是一种资源调度的算法。可以通过继承改造LinkedHashMap实现LRUMAP。
TreeMap是按升序/降序排列的map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值