Java学习-集合-01

Java 学习-集合-01

1.List、Set、Map 的区别

元素有序 允许重复元素
List
Set AbstractSet
HashSet
TreeSet 是(用二叉树排序)
Map AbstractMap Key值必须唯一,Value可重复
HashMap
TreeMap 是(用二叉树排序)

2.ArrayList 和 LinkedList 的区别

  • 数据结构实现:
    ArrayList 是 动态数组 的数据结构实现;LinkedList 是 双向链表 的数据结构实现
  • 随机访问效率:
    ArrayList 比 LinkedList 快,因为 ArrayList 是动态数组,每次查询都会查询整个数组,而 LinkedList 是双向链表,是线性的数据存储方式,需要移动指针从前往后一次查找
  • 增加和删除效率:
    在首位的增加和删除操作,LinkedList 要比 ArrayList 效率高,因为 ArrayList 增删操作要影响数组内其他数据的下标,而 LinkedList 只需要移动指针即可

3.HashMap 和 HashTable 有什么区别,其底层实现是什么

  • 线程安全:
    HashMap 非线程安全,HashTable 内部方法有 synchronized 处理是线程安全,但要保证线程安全,推荐使用 ConcurrentHashMap
  • 效率:
    由于线程安全问题,HashMap 比 HashTable 效率高,HashTable 基本被淘汰
  • 对 Null key 和 Null value 的支持:
    HashMap 支持 Null key 和 Null value;HashTable 不支持,会跑出空指针异常
  • 底层实现原理
    HashMap1.7 是数组+链表,1.8 是数组+链表+红黑树
    HashTable 是数组+链表

4.ConcurrentHashMap 原理,jdk7 和 jdk8 的区别

  • 原理:
    JDK1.7版本,ConcurrentHashMap内部使用 段(Segment) ,ConcurrentLevel有16个分段,这16个分段有独立的锁机制,每个独立的机制都是一张表,表的下面是链表,这样就可以支持并发的同时保证每张表的线程安全,提高效率

JDK1.8版本,ConcurrentHashMap内部使用synchronized + volatile + CAS 的实现,降低锁的粒度,提高效率

  • 区别:
    • JDK1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点)
    • JDK1.8版本的数据结构变得更加简单,使得操作更加清晰流畅。因为已经使用synchronized来进行同步,所以不需要分段锁的概念,也就不需要Segment这种数据结构,由于粒度的降低,实现的复杂度也增加了
    • JDK1.8使用红黑树来优化链表,基于长度很长的链表的遍历是一个很漫长的过程,而红黑树的遍历效率是很快的,代替一定阈值的链表,这样效率更高

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!