Java常用集合框架之Map

一 java集合框架图

在这里插入图片描述
在这里插入图片描述

二 map

在这里插入图片描述

2.1 hashMap

通过阅读map接口的源码可以发现,map的key是由set组织起来的,所以key是不能重复的。而value是Collection,value值是可以重复的。
在这里插入图片描述
HashMap结构
在这里插入图片描述
当表中key的值经过上述运算,总是得出相同的值,也就是说所有的都存放于同一个element中,即同一个bucket桶中,这样会使得桶的链表会变得很长,导致查询的性能恶化从O(1) 变为 O(n)

所以在java8及以后使用如下结构
在这里插入图片描述
构造函数
构造函数中并没有初始化,推断使用的是延迟加载,在使用到的时候初始化,如put()
在这里插入图片描述
put()方法
在这里插入图片描述
put执行过程:
在这里插入图片描述
hash()方法。
在这里插入图片描述
结合put中的方法可以指导新存入的数据应该放到哪个桶,也就是数组下标的计算过程

在这里插入图片描述
同时也发现为什么数组的大小一定要是2的幂次方。因为数组下标的算法是通过位运算来实现%求模的。将hash与(n-1)进行&运算可以看成是要保留几位。假设hash值为15,即0000 1111,数组长度为8,即(n-1)为7,0000 0111,那么取模后,得到的是0000 0111,会发现结果是保留3位。也只有n满足为2的幂次方时才能使用该运算。
如何有效减少碰撞
1、扰动函数算法,促使元素位置分布均匀,减少碰撞几率;
2、使用final对象,并采用合适的equals方法和hashCode方法;

扩容问题
在这里插入图片描述
线程安全问题
hashMap本身不是线程安全的但是可以将其转为安全的
在这里插入图片描述
在这里插入图片描述
与HashTable都是串行的效率低

2.2 Hashtable

目前已被废弃。
与hashMap最大区别就是,hashtable是线程安全的,key和value都不能为null。
hashMap 的key和value都能为空,但是这样的key只能有个一个,value可以多个。这样就不能使用get来判断是否存在,应该使用containsKey()

2.3 ConcurrentHashMap

提升hashtable性能
分段锁:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2.4 三者区别

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值