集合面试题大纲(高薪高频)

前言

兄弟们有什么建议或者面试题都拿出来我做个总结大家一起进步拿到高薪!!!

1、HashMap和Hashtable区别?

 首先 简单介绍一下HashMap和Hashtable

HashMap:基于哈希表的 Map 接口的实现

Hashtable:散列表(也叫哈希表)是根据关键码值(Key value)而直接进行访问的数据结构

相同点:

1、HashMap和Hashtable都实现了Map接口

2、都可以存储key-value数据

不同点:

1、HashMap可以把null作为key或value,Hashtable不可以

2、HashMap线程不安全,效率高。Hashtable线程安全,效率

3、Hashtable:继承Dictionary类。HashMap:继承AbstractMap

2、ConcurrentHashMap和Hashtable的区别?(都是线程安全所以拿来比较)

简介ConcurrentHashMap:

ConcurrentHashMap是HashMap的线程安全版本。

在JDK1.7中ConcurrentHashMap采用了(数组+Segment+分段锁)的方式实现。

jdk.8后内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。

主要区别:ConcurrentHashMap不论1.7还是1.8,他的执行效率都比HashTable要高的多,主要原因还是因为Hash Table使用了一种全表加锁的方式(全锁住)

Hashtable(方法锁):使用 synchronized 来保证线程安全,但效率非常低下。

concurrenthashmap(分段锁):(锁分段技术)容器中有多把锁,每一把锁用于锁容器其中一部分数据 。当多线程访问的是不同数据段的数据,线程间就不会存在锁竞争,提高并发访问率。(哪块不安全就锁哪块,不能不锁,不能全锁,那我就块锁,不会影响其他办事效率)

JDK1.8中为了进一步优化ConcurrentHashMap的性能,去掉了Segment分段锁的设计。(数组 + 链表 + 红黑树) 而线程安全方面是结合CAS机制 + 局部锁实现的,减低锁的粒度,提高性能。

3、jdk1.7到jdk1.8 HashMap发生了什么变化(底层)?

底层数据结构不同:

1、1.7中底层是数组+链表

1.8中底层是数组+链表+红⿊树,加红⿊树的⽬的是提⾼HashMap插⼊和 查询整体效率,也就是说在 JVM 存储 hashMap 的 K-V 时仅仅通过

2、插入键值对的put方法的区别

1.7中是采用头插

1.8中会将节点插入到链表尾部

4、HashMap的扩容原理?

简介hashMap扩容:

扩容就是重新计算容量,向hashMap不停的添加元素,当hashMap无法装载新的元素,对象将需要扩大数组容量,以便装入更多的元素

初始化容量为16,达到阈值进行扩容。阈值 = 最大容量 * 负载因子(0.75),扩容每次2倍,总是2的n次方。

扩容机制:使用一个容量更大的数组替代已有的容量小的数组,transfer()方法将原有的Entry数组的元素拷贝到新的Entry数组里。

5、什么是快速失败(fail-fast)和安全失败(fail-safe)?

简介快速、安全失败:(我认为就是遍历时线程对集合进行(增加、删除、修改)爆出的异常)

java.util 包的集合类就都是快速失败。HashMap、ArrayList 这些集合类,

原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值,如果改变就会抛出异常。

java.util.concurrent 包下的类都是安全失败。比如:ConcurrentHashMap。

原理:采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值