一、hashmap、hashtble、concurrenthashmap的区别以及实现原理
1.hashmap是数组+链表的数据结构,hashmap线程不安全,因为可能会出现多个线程同时对hashmap的容量进行计算,或者是同时放入相同的key,造成值被覆盖。
2.hashtable采用synchronized同步锁,保证同一时间只有一个线程能进行操作,但是锁的同时,其它线程连get操作都会被阻塞,造成性能下降。
3.concurrenthashmap采用锁段的方式进行同步,这样能极大提对map的操作效率。在JDK8中采用了转平衡树的方式进行处理。
二、hashmap发生hash碰撞时候怎么处理?链表过长怎么解决?
1.同一个hashcode的entity存放在链表时候顺序是hashmap发生碰撞后,会把相同hashcode的key放在同一个链表下面。取数据时先根据hashcode找到链表位置,然后根据key的eques方法找到正确的存储对象
2.链表过长时,超过8时,链表转红黑树;低于6时,会转为链表。
三、concurrenthashmap的初始化个数是多少、负载因子是多少、扩展长度是多少、扩展时候有什么问题?
默认长度16;负载因子0.75;2倍拓展; 扩展时候会重新hashing,会造成资源和时间消耗。
(拓展阅读:segment在JDK1.8中已经摒弃)
四、arrayList和linkList区别是什么?集合负载因子多少?扩展长度是多少?
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构;对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针;对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
2.负载因子1,即:元素满之后才扩展。
五、synchronised和lock的区别?
1.首先synchronized是java内置关键字,因此是内置特性,而Lock是个java类;
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁);Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.synchronised代码块执行时,其它线程必须一直等待;lock时,其它线程可以通过设置等待时间,而不用一直等待。
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6.Lock锁适合大量同步代码的同步问题,synchronized锁适合代码少量的同步问题。
六、简单介绍下的偏向锁、轻量级锁、自旋锁、膨胀锁。