怎么删除,暂时没找到删除入口,瞎记录一下一些面试题吧
1.JDK1.7到1.8对HashMap的优化点:
哈希扰动函数的运算次数减少了;
引入红黑树优化原来的链表的查询效率;
插入数据时候,把头插法换成了尾插法(避免多线程同时操作造成死循环);
扩容时候把全部重新计算位置的算法优化了,通过判断hash值对应于目标扩容长度的二进制位置是否为1,为1则扩容后的key的位置为原来位置+历史hashMap长度,为0则还是原来位置;
2.JDK1.7到1.8对concurrentHashMap的优化点:
去掉继承于ReenTrantLock的Segment(分段锁思想),用cas和synchronized来解决并发问题;
1.8版本的concurrentHashMap的put过程:
- key或者value为null则直接抛出异常
- tab为null则进行初始化容量为16
- 如果计算出key的hash值对应的index位置node为null,则cas插入数据
- 如果发现index位置node不为为null,且node的hash值为MOVED(-1),则帮助一起进行扩容
- 如果如果发现index位置node不为为null,且node的hash值不为MOVED(-1),则synchronized (f)加锁向链表尾部添加元素,或者向红黑树添加节点
- 如果上一步的链表添加节点后满足向红黑树转换的条件,则链表转红黑树
- cas更新hash表中的数据总数,并判断是否需要扩容
3.ArrayList,LinkedList:
ArrayList底层用Object数组,支持快速随机访问;LinkedList底层用双向链表,不支持快速随机访问。
4.CopyOnWriteArrayList:可以看作是线程安全的 ArrayList,在读多写少的场合性能非常好,远远好于 Vector。
CopyOnWriteArrayList 是一个集合类,它的主要特点如下:
-
CopyOnWriteArrayList 可以理解为一个线程安全的 ArrayList;
-
在"增删改"操作中使用互斥锁保证线程安全,读操作不加锁;
-
采用写入时复制(Copy-On-Write)的思想,读写分离,可能造成脏读;
-
适用于读多写少的场景。
5.安全失败:采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。所以,在遍历过程中对原集合所作的修改并不能被迭代器检测到,故不会抛 ConcurrentModificationException 异常。