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)