jdk相关面试总结

234 阅读2分钟

怎么删除,暂时没找到删除入口,瞎记录一下一些面试题吧

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 是一个集合类,它的主要特点如下:

  1. CopyOnWriteArrayList 可以理解为一个线程安全的 ArrayList;

  2. 在"增删改"操作中使用互斥锁保证线程安全,读操作不加锁;

  3. 采用写入时复制(Copy-On-Write)的思想,读写分离,可能造成脏读;

  4. 适用于读多写少的场景。

5.安全失败:采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。所以,在遍历过程中对原集合所作的修改并不能被迭代器检测到,故不会抛 ConcurrentModificationException 异常。