[Java-集合] Java集合相关问题
2026年3月12日大约 1 分钟
[Java-集合] Java集合相关问题
数组和集合的区别?
- 数组是定长的;集合是动态的长度
- 数组可以存储基本数据类型和对象;集合只能存储对象。
- 数组可以之间获取元素;集合需要通过迭代器或集合提供的方法获取元素。
Java 里面常见的集合有哪些?
Collection 体系
ArrayList:动态数组。
LinkedList:双向链表,快速插入删除,可作栈/队列。
Vector:线程安全但性能低(已淘汰)。
HashSet:基于 HashMap实现,存储唯一元素。
TreeSet:基于红黑树,有序唯一。
LinkedHashSet:LinkedHashMap + 双向链表,保持插入顺序。
PriorityQueue:基于堆的优先队列。
Map 体系 (键值对)
- HashMap:存储键值对。1.8 之前链表+数组,1.8 之后链表+红黑树 实现
- LinkedHashMap:HashMap + 双向链表,保持插入顺序。
- TreeMap:基于红黑树,键有序。
- Hashtable:线程安全但性能低(已淘汰)。
并发专用 (JUC)
- ConcurrentHashMap:高并发 Map,分段锁/CAS+synchronized。
- CopyOnWriteArrayList:读多写少场景的线程安全 List。
ConcurrentHashMap 的实现原理是什么?or 底层实现原理?
涉及到的概念
- 分段锁(Segment Locking):ConcurrentHashMap 将整个 Map 分成多个段(Segment),每个段维护一个独立的锁,这样多个线程可以同时访问不同段的数据,提高并发性能。
- CAS(Compare And Swap):比较并交换:对比内存值,若未变则更新,原子操作。
具体原理
- JDK 1.7 之前:
Segment+HashEntry+ReentrantLock。 - JDK 1.8 之后:使用
Node+ CAS +synchronized, 取消了 Segment,改为在桶级别进行锁定。