面试:集合篇

1、ArrayList和LinkedList区别 ?

2、ArrayList和HashSet的区别 ?

3、HashMap、HashTable和ConcurrentHashMap的区别 ?

思考下,或者写一写,再看答案,你一定可以,加油!!!
在这里插入图片描述

1、ArrayList和LinkedList区别
  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
2、ArrayList和HashSet的区别
  1. ArrayList中保存的数据是有序的,HashSet中保存的数据是无序的。
  2. ArrayList是用数组实现的而HashSet的底层是用HashMap实现的。ArrayList可以保存重复的数据,而HashSet不能。调用ArrayList的add方法时在数组的下一个位置添加了一个对象,调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量。
  3. 保证HashSet的数据是唯一的要重写equals()和hashCode()方法。
3、HashMap、HashTable和ConcurrentHashMap的区别
  1. HashMap是非线程安全的不适用于多线程资源共享场景,可以接受 key和 value 为 null,而且在单线程场景下性能最好;
  2. Hashtable与HashMap相比API都是sychronized的,因此是线程安全的,而且Hashtable不可以接受 key和 value 为 null;由于Hashtable中的所有数据都加了同步锁,因此性能最差;
  3. ConcurrentHashMap在HashMap的基础上对其所存的数据进行了分段,每个分段都有一个锁,当读的时候不受锁的影响,只有在写的时候受锁的限制,缩小了锁的范围,不同段之间不受锁竞争影响,既保证了线程安全,有提升了性能。
  4. 拓展:Segment 类继承于 ReentrantLock 类,从而使得 Segment 对象能充当锁的角色。每个 Segment 对象用来守护其(成员对象 table 中)包含的若干个桶。
    table 是一个由 HashEntry 对象组成的数组。table 数组的每一个数组成员就是散列映射表的一个桶。
    count 变量是一个计数器,它表示每个 Segment 对象管理的 table 数组(若干个 HashEntry 组成的链表)包含的 HashEntry 对象的个数。每一个 Segment 对象都有一个 count 对象来表示本 Segment 中包含的 HashEntry 对象的总数。注意,之所以在每个 Segment 对象中包含一个计数器,而不是在 ConcurrentHashMap 中使用全局的计数器,是为了避免出现“热点域”而影响 ConcurrentHashMap 的并发性。(这里介绍是1.7版本的,1.8版本采用了synchroized+cas来保证线程安全,1.7和1.8之间存在很多不同的设计,这里不多做介绍,感兴趣的朋友可以查一查。)有兴趣的朋友还可以了解为什么初始容量要保持在2^n?为什么负载因子是0.75?
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值