集合问题
List
关于List相关的问题主要有:
- ArrayList和LinkedList有什么区别?
- ArrayList是怎么扩容的?
- ArrayList插入、删除、查询元素的时间复杂度各是多少?
- 怎么求两个集合的并集、交集、差集?
- ArrayList是怎么实现序列化和反序列化的?
- 集合的方法toArray()有什么问题?
- 什么是fail-fast?
- LinkedList是单链表还是双链表实现的?
- LinkedList除了作为List还有什么用处?
- LinkedList插入、删除、查询元素的时间复杂度各是多少?
- 什么是随机访问?
- 哪些集合支持随机访问?他们都有哪些共性?
- CopyOnWriteArrayList是怎么保证并发安全的?
- CopyOnWriteArrayList的实现采用了什么思想?
- CopyOnWriteArrayList是不是强一致性的?
- CopyOnWriteArrayList适用于什么样的场景?
- CopyOnWriteArrayList插入、删除、查询元素的时间复杂度各是多少?
- CopyOnWriteArrayList为什么没有size属性?
- 比较古老的集合Vector和Stack有什么缺陷?
Map
关于Map的问题主要有:
- 什么是散列表?
- 怎么实现一个散列表?
- java中HashMap实现方式的演进?
- HashMap的容量有什么特点?
- HashMap是怎么进行扩容的?
- HashMap中的元素是否是有序的?
- HashMap何时进行树化?何时进行反树化?
- HashMap是怎么进行缩容的?
- HashMap插入、删除、查询元素的时间复杂度各是多少?
- HashMap中的红黑树实现部分可以用其它数据结构代替吗?
- LinkedHashMap是怎么实现的?
- LinkedHashMap是有序的吗?怎么个有序法?
- LinkedHashMap如何实现LRU缓存淘汰策略?
- WeakHashMap使用的数据结构?
- WeakHashMap具有什么特性?
- WeakHashMap通常用来做什么?
- WeakHashMap使用String作为key是需要注意些什么?为什么?
- 什么是弱引用?
- 红黑树具有哪些特性?
- TreeMap就有序的吗?怎么个有序法?
- TreeMap是否需要扩容?
- 什么是左旋?什么是右旋?
- 红黑树怎么插入元素?
- 红黑树怎么删除元素?
- 为什么要进行平衡?
- 如何实现红黑树的遍历?
- TreeMap中是怎么遍历的?
- TreeMap插入、删除、查询元素的时间复杂度各是多少?
- HashMap在多线程环境中什么时候会出现问题?
- ConcurrentHashMap的存储结构?
- ConcurrentHashMap是怎么保证并发安全的?
- ConcurrentHashMap是怎么扩容的?
- ConcurrentHashMap的size()方法的实现知多少?
- ConcurrentHashMap是强一致性的吗?
- ConcurrentHashMap不能解决什么问题?
- ConcurrentHashMap中哪些地方运用到分段锁的思想?
- 什么是伪共享?怎么避免伪共享?
- 什么是跳表?
- ConcurrentSkipList是有序的吗?
- ConcurrentSkipList是如何保证线程安全的?
- ConcurrentSkipList插入、删除、查询元素的时间复杂度各是多少?
- ConcurrentSkipList的索引具有什么特性?
- 为什么Redis选择使用跳表而不是红黑树来实现有序集合?
Set
关于Set的问题主要有:
- HashSet怎么保证添加元素不重复?
- HashSet是有序的吗?
- HashSet是否允许null元素?
- Set是否有get()方法?
- LinkedHashSet是有序的吗?怎么个有序法?
- LinkedHashSet支持按元素访问顺序排序吗?
- TreeSet真的是使用TreeMap来存储元素的吗?
- TreeSet是有序的吗?怎么个有序法?
- TreeSet和LinkedHashSet有何不同?
- TreeSet和SortedSet有什么区别和联系?
- CopyOnWriteArraySet是用Map实现的吗?
- CopyOnWriteArraySet是有序的吗?怎么个有序法?
- CopyOnWriteArraySet怎么保证并发安全?
- CopyOnWriteArraySet以何种方式保证元素不重复?
- 如何比较两个Set中的元素是否完全一致?
- ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗?
- ConcurrentSkipListSet是有序的吗?怎么个有序法?
Queue
关于Queue的问题主要有:
- 什么是堆?什么是堆化?
- 什么是优先级队列?
- PriorityQueue是怎么实现的?
- PriorityQueue是有序的吗?
- PriorityQueue入队、出队的时间复杂度各是多少?
- PriorityQueue是否需要扩容?扩容规则呢?
- ArrayBlockingQueue的实现方式?
- ArrayBlockingQueue是否需要扩容?
- ArrayBlockingQueue怎么保证线程安全?
- ArrayBlockingQueue有什么缺点?
- LinkedBlockingQueue的实现方式?
- LinkedBlockingQueue是有界的还是无界的队列?
- LinkedBlockingQueue怎么保证线程安全?
- LinkedBlockingQueue与ArrayBlockingQueue对比?
- SynchronousQueue的实现方式?
- SynchronousQueue真的是无缓冲的吗?
- SynchronousQueue怎么保证线程安全?
- SynchronousQueue的公平模式和非公平模式有什么区别?
- SynchronousQueue在高并发情景下会有什么问题?
- PriorityBlockingQueue的实现方式?
- PriorityBlockingQueue是否需要扩容?
- PriorityBlockingQueue怎么保证线程安全?
- PriorityBlockingQueue为什么不需要notFull条件?
- 什么是双重队列?
- LinkedTransferQueue是怎么实现阻塞队列的?
- LinkedTransferQueue是怎么控制并发安全的?
- LinkedTransferQueue与SynchronousQueue有什么异同?
- ConcurrentLinkedQueue是阻塞队列吗?
- ConcurrentLinkedQueue如何保证并发安全?
- ConcurrentLinkedQueue能用于线程池吗?
- DelayQueue是阻塞队列吗?
- DelayQueue的实现方式?
- DelayQueue主要用于什么场景?
Deque
关于Deque的问题主要有:
- 什么是双端队列?
- ArrayDeque是怎么实现双端队列的?
- ArrayDeque是有界的吗?
- LinkedList与ArrayDeque的对比?
- 双端队列是否可以作为栈使用?\
- LinkedBlockingDeque是怎么实现双端队列的?
- LinkedBlockingDeque是怎么保证并发安全的?
- ConcurrentLinkedDeque是怎么实现双端队列的?
- ConcurrentLinkedDeque是怎么保证并发安全的?
- LinkedList是List和Deque的集合体?
总结
- 使用的数据结构?
- 添加元素、删除元素的基本逻辑?
- 是否是fail-fast的?
- 是否需要扩容?扩容规则?
- 是否有序?是按插入顺序还是自然顺序还是访问顺序?
- 是否线程安全?
- 使用的锁?
- 优点?缺点?
- 适用的场景?
- 时间复杂度?
- 空间复杂度?