什么是集合类
- Java集合类是Java标准库中用于存储和操作一组对象的类和接口。集合类提供了一种灵活的方式来管理和操作数据,支持多种数据结构,如列表、集合、映射等。
- 简单来说,集合指的是存放数据的容器,可以一次容纳多个对象,并且允许用户通过一些方法来访问和操作这些对象。
主要组成部分
- 接口:定义了集合的基本操作。
- 实现类:提供了接口的具体操作。
- 算法:提供了对集合进行操作的方法,如排序、查找等。
集合类的分类(Collection和Map)
Java中的集合类可以分为两大类:一类是实现Collection接口;另一类是实现Map接口。
Collection是一个基本的集合接口,Collection中可以容纳一组集合元素。Collection是高度抽象出来的接口,JDK 不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set 和 List)去实现。
Map没有继承Collection接口,与Collection是并列关系。Map提供键(key)到值(value)的映射。一个Map中不能包含相同的键,每个键只能映射一个值。
Collection接口
常用API
| API | 描述 |
|---|---|
| boolean add(E e) | 添加一个元素进入Collection |
| boolean addAll(Collection<? extends E> c) | 添加一个Collection进目标Collection |
| boolean remove(Object o) | 删除元素,只删除第一个出现的(如果存在多个) |
| boolean removeAll(Collection<?> c) | 删除Collection中的所有存在的元素 |
| boolean contains(Object o) | 判断是否存在指定元素 |
| boolean containsAll(Collection<?> c) | 判断给定的collection中是否全部存在于目标Collection |
| boolean retainAll(Collection<?> c) | retainAll() 方法用于保留 arraylist 中在指定集合中也存在的那些元素。 |
| void clear() | 清空collection |
| boolean equals(Object o) | 判断是否相等 |
| int hashCode() | 计算hashCode |
| boolean isEmpty() | 判断是否为空 |
| int size() | 返回collection中的元素个数 |
| Object[] toArray() | 将collection转成一个数组,方便遍历 |
| T[] toArray(T[] a) | 同上,只是传入了一个数组 |
| Iterator iterator() | 返回一个迭代器 |
| foreach | for循环遍历(底层也是iterator) |
常见子接口
List、Set、Queue是Collection的子接口,具备Collection的所有方法
List
- 数据结构为线性表
| 特点 | ArrayList | Vector | LinkedList |
|---|---|---|---|
| 存储元素有序 | √ | √ | √ |
| 可以存储重复元素 | √ | √ | √ |
| 底层结构 | 数组 | 数组 | 双向链表 |
| 可以存储null值 | √ | √ | √ |
| 线程安全 | × | √ | × |
Set
- 数据结构为集合
| 特点 | HashSet | TreeSet | LinkedHashSet |
|---|---|---|---|
| 存储元素有序 | × | √ | √ |
| 可以存储重复元素 | × | × | × |
| 内部 | HashMap | TreeMap的SortedSet | LinkedHashMap |
| 底层结构 | Hash表 | 二叉树 | Hash表存储,双向链表记录插入顺序 |
| 可以存储null值 | √ | × | √ |
| 线程安全 | × | × | × |
Queue
- 数据结构为队列
| 特点 | LinkedList | ArrayDeque | LinkedBlockingQueue | PriorityBlockingQueue |
|---|---|---|---|---|
| 存储元素有序 | √ | √ | √ | 按优先级 |
| 可以存储重复元素 | √ | √ | √ | √ |
| 可以存储null值 | √ | × | × | × |
| 数据结构 | 双向链表 | 可扩容循环数组 | 链表 | 二叉堆 |
| 线程安全 | × | × | √ | √ |
| 典型应用场景 | 需要null值或双向遍历的场景 | 高频插入删除的场景,替代Stack | 线程池任务队列 | 带优先级的任务调度 |
Map接口
常用API
| API | 描述 |
|---|---|
| V put(K key, V value) | 添加键值对, 若键值存在,则为更新操作 |
| void putAll(Map<? extends K,? extends V> m) | 将参数map中所有键值对放入该map |
| V get(Object key) | 根据key值获取value,若key值不存在,则返回null |
| V remove(Object key) | 删除map中所包含的参数key |
| boolean containsKey(Object key) | 判断map中是否包含参数key |
| boolean containsValue(Object value) | 判断map中是否包含参数value |
| void clear() | 清空map |
| boolean equals(Object o) | 判断两个map是否相等 |
| int hashCode() | 返回此映射的哈希码值 |
| boolean isEmpty() | 判断map中是否有元素 |
| int size() | 返回键-值映射关系数 |
| Set<Map.Entry<K,V>> entrySet() | 返回此映射中包含的映射关系的 Set 视图 |
| Set< K > keySet() | 返回此映射中包含的键的 Set 视图 |
| Collection< V > values() | 返回此映射中包含的值的 Collection 视图 |
常见子接口
| 特点 | HashMap | LinkedHashMap | TreeMap | Hashtable | ConcurrentHashMap |
|---|---|---|---|---|---|
| 底层结构 | 数组+链表+红黑树(JDK8+) | 哈希表+双向链表 | 红黑树 | 数组+链表 | 数组+链表/红黑树(JDK8+) |
| 存储有序性 | 无序 | 插入顺序/访问顺序 | key自然排序/自定义 | 无序 | 无序 |
| 允许重复 键/值 | × / √ | × / √ | × / √ | × / √ | × / √ |
| 允许null 键/值 | √ / √ | √ / √ | × / √ | × / × | × / √ |
| 线程安全 | × | × | × | √ | √ |

591

被折叠的 条评论
为什么被折叠?



