面试题: ArrayList、LinkedList、HashMap、LinkedHashMap、ConcurrentHashMap、HashTable 的实现原理

ArrayList :

        是jdk1.2出现的,是java.util包下的类,实现了List接口,底层是数组,所以它查询速度是O(1),但是它的插入和删除速度慢,元素可以为null,默认容量是0,一但有元素时,初始容量会变成10,它底层扩容机制是按照1.5倍位运算扩容的

LinkedList :

        是jdk1.2出现的,是java.util包下的,实现了List接口,底层是双向链表,所以它的查询速度是O(n),所以查询慢,但增删快,元素也可以为null

HashMap :

        是jdk1.2出现的,是java.util包下的类,实现Map接口,是允许null值和null键的,底层的默认负载因子是0.75,容量必须是2的n次方,默认的初始容量是16,底层是由数组+链表形式实现的,所以它存储的元素时无序的,在jkd1.8引入了红黑树,当它的数组容量达到64,链表长度大于8的时候,会将链表转换为红黑树,当链表长度小于等于6的时候,会退回链表,还有一种就是,红黑树的左右孩子和左左孙子,其中一个为null,也会退回链表,我们比较常用的方法就是put和get,put的实现原理是,先将K和V封装到node对象中,调用k的hashCode()方法,算出hash值,再通过哈希函数,把hash值转换为数组的下标,然后回去查看数据是否存在,不存在就赋值,如果下标位置上有链表,就会拿着k和链表的k进行equal对比,返回都为false就在链表尾部添加,如果为true,就覆盖为当前的value值,还有get方法,它和put步奏一样,也是先调用hashCode()方法,求出哈希值,并通过二次哈希函数,求出下标,找到对应的值,如果有值就返回对应value值,如果没有值,就返回null,它的线程是不安全的

HashTable :

        jdk1.0的时候就出现了,是java.util包下的类,它的线程是安全的,它的初始默认初始容量是11,所以不存在2的幂次方,扩容时候是当前容量的1倍,它的键和值都不能为null的,但是它的负载因子和HashMap 一样默认都是0.75,在它的底层数据结构是数组+链表,并没有引入红黑树,从jdk1.5开始,就比较推荐使用ConcurrentHashMap

ConcurrentHashMap :

        是jdk1.5出现的,在java.util.concurrent包下的类,它和HashMap 一样,都是键值对的存储模式,但是它的键和值是不能为null的,可以理解为它是HashMap 的安全版,所以它的线程是安全的,专门用来做多线程环境的,它底层创建的node数组是用volatile 修饰的,所以可以保证其可见性,禁止指令重排,它的功能和底层结构和HashMap一样都是数组+链表实现,在jdk1.8引入红黑树,它在HashMap的基础上做了并发安全的实现,在jdk8版本引进了自旋锁,通过在node的节点上加锁来实现数据更新的安全性,在扩容机制中,它引入了多线程并发扩容,也就是多个线程将原始数组进行分片,然后每个线程只需要负责对自己的分片数据进行迁移,从而提升数据迁移的效率,他有一个size()方法,用来获取总的元素个数,从而提升效率,如果在线程竞争不激烈的情况下,它采用的是CAS方式,来实现元素个数的原子递增,如果是竞争激烈的情况下,是用一个数组来维护元素的个数,在实现增加的时候,会随机从数组中选取一个,在通过CAS方式实现原子递增,其实它的核心思想就是利用数组,来实现并发更新的一个负载,

LinkedHashMap :

        是jdk1.4版本出现的,是java.util包下的类,是HashMap 的子类,和HashMap相比,它的底层采用的是双向链表,所以它对元素的操作时有序的,key必须唯一,但key允许为null,线程是不安全的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10JQK炸

如果对您有所帮助,请给点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值