返回顶部

Java—Map与List

一、Map

  • HashMap

    • 在jdk1.7与1.8中的区别?
jdk1.7:
    数组+链表
jdk1.8:
    数组+链表/红黑树
    • 线程不安全的原因?
jdk1.7:
    环形链表(扩容时的transfer方法:头插法 -> 死循环);
    数据丢失;
jdk1.8:
    数据覆盖;
    • 数组每次扩容2倍(保持数组容量为2^n)的原因?
减少hash碰撞:(n - 1)& hash
  • ConcurrentHashMap

    • 在jdk1.7与1.8中的区别?
jdk1.7:
    实现:数组 + Segment
    安全:分段锁(最多16个Segment)
    注:Segment继承ReentrantLock,类似HashMap
jdk1.8:
    实现:数组 + 链表 / 红黑树
    安全:synchronized + cas,对每个数组元素(即链表 / 红黑树)加锁
    优势:获得jvm支持;减少内存开销(获得锁、加锁、释放锁)

二、List

  • ArrayList与LinkedList区别?

  ArrayList LinkedList
数据结构 数组 链表
效率 适合查询 适合增、删
内存

三、并发下的问题

  说明
ArrayList、HashMap

效率高、线程不安全;

可通过Collections.synchronizedList(list);Collections.synchronizedMap(map);保证线程安全

 Vector、Hashtable

效率低、线程安全;

本质上是通过synchronized保证线程安全的; 

 CopyOnWriteArrayList、ConcurrentHashMap

 效率高、线程安全;

posted @ 2022-09-25 22:43  dork-h  阅读(44)  评论(0)    收藏  举报