面试篇-Java集合

102 阅读1分钟

1,说说 List , Set , Map 三者的区别?

是否有序是否重复存储的元素类型

  • List有序,可重复
  • Set无序,不重复
  • Map使用键值对存储,不允许相同的键。

2,List , Set , Map 在 Java 中分别有哪些对应的实现类?底层的数据结构?

List

  • ArrayList:底层数组,1.5倍扩容,然后调用Arrays.copyof()对原数组进行复制。
  • LinkedList:底层链表。
  • Vector:底层数组,相较于ArrayList,Vector方法加了synchronized,线程安全。

Set

  • HashSet:按哈希算法存取对象,当元素个数超过数组的0.75,会进行2倍扩容。
  • LinkedHashSet:底层数组+双向链表,能够维护元素的次序。
  • TreeSet:实现了SOrtedSet,能够对集合排序。

Map

  • HashMap:线程不安全。
  • HashTable:线程安全,方法中有synchronized。
  • LinkedHashMap
  • TreeMap:基于红黑树实现。
  • Properties

3,有哪些集合是线程不安全的?怎么解决呢?

ArrayList

ArrayList是线程不安全的。一般有三种方式解决:

  • 使用 Vector
底层通过加 synchronized 实现的。
  • 使用 Collections.synchronizeList()
  • 使用 CopyOnWriteArrayList()
读写分离的思想。

往容器添加元素的时候,不会直接添加,而是先将数组复制一份,往新容器添加,添加完成后,将原容器的引用指向新容器。

好处:可以并发读,不需要加锁。

HashMap

HashMap是线程不安全的,一般有三种方式解决:

  • HashTable
底层通过加 synchronized 实现的。
  • Collections.synchronizedMap
  • ConcurrentHashMap
底层通过CAS实现的。

4,HashMap 查询,删除的时间复杂度

  • 没有哈希冲突的情况:O(1)
  • 转链表的情况:O(n)
  • 链表转红黑树的情况:O(log n)

5,HashMap 的底层实现