说下Java中的集合?
List接口:继承自 Collection 接口,代表有序的、可重复的数据列表
- 能够根据索引(下标),随机访问元素
常见的实现类:
| 实现类 | 特点 |
|---|---|
| ArrayList | 是一个容量可变,非线程安全的列表,底层使用数组实现 |
| LinkedList | 本质上是一个双向链表, 与ArrayList相比,其插入和删除速度更快 |
| Vector | 底层也是基于数组实现,线程安全,但效率相对较低 |
Map接口:与 Collection 接口并列,是一个键值对集合,存储键、值和之间的映射
- key无序,且唯一;value不要求有序,允许重复
- 检索元素时,只要给出键值对象,就会返回对应的值对象
常见的实现类:
| 实现类 | 特点 |
|---|---|
| HashMap | JDK1.8之前,由数组+链表组成的;JDK1.8 以后,由数组+链表/红黑树组成 |
| LinkedHashMap | 继承于HashMap,底层仍然采用的是基于拉链式散列结构,即数组+链表/红黑树组成 |
| HashTable | 由数组+链表组成,HashTable是线程安全的,不允许 null键和null值 |
| TreeMap | 红黑树(自平衡的排序二叉树)实现,key按自然排序或Comparator排序 |
| ConcurrentHashMap | 采用 Node数组+链表+红黑树实现,是线程安全的 |
Set接口:不允许出现重复的元素,是无序的
常见的实现类:
| 实现类 | 特点 |
|---|---|
| HashSet | 通过HashMap实现,线程不安全,HashMap的Key为HashSet存储的元素,所有Key都是用相同的Value |
| LinkedHashSet | 继承自HashSet,通过LinkedHashMap实现,使用双向链表维护元素插入顺序 |
| TreeSet | 通过TreeMap实现,添加元素到集合时,按照比较规则将其插入合适的位置,保证插入后的集合仍然有序 |
数组和集合的区别?
- 数组是固定长度的数据结构,一旦创建,长度就无法改变;而集合是动态长度的数据结构,可以根据需要动态增加或减少元素
- 数组可以存储基本数据类型和对象;而集合只能存储对象
- 数组可以通过索引(下标)直接访问元素;而集合需要通过迭代器或者其他方法访问元素