集合
介绍
java
中的容器,用来存储对象
- 存储基本数据类型时会自动装箱为对象
- 分为两大核心接口,
Collection
和Map
集合与数组
|
集合 |
数组 |
存储元素 |
对象 |
基本数据类型,对象 |
容量 |
自动扩容 |
固定 |
存储方式 |
有的集合是连续存储,如列表.有的集合不是,如链表 |
元素是连续存储的 |
Collection
介绍
java.util
- 定义了集合的基本操作,如添加,删除,遍历等
- 继承了Iterable接口,实现了forEach或迭代器遍历
方法
添加
方法 |
描述 |
boolean add(E e) |
向集合中添加一个元素 |
boolean addAll(Collection<? extends E> c) |
将指定集合的所有元素添加到集合中 |
删除
方法 |
描述 |
boolean remove(Object o) |
删除集合中指定的元素 |
boolean removeAll(Collection<? extends E> c) |
删除集合中与指定集合所有匹配的元素 |
void clear() |
清空集合 |
查询
方法 |
描述 |
boolean contains(Object o) |
判断集合中是否包含指定元素 |
boolean containsAll(Collection<? extends E> c) |
判断指定集合是否是集合的子集 |
boolean isEmpty() |
判断集合是否为空 |
遍历
方法 |
描述 |
Iterator<E> iterator() |
返回集合的迭代器 |
void forEach(Consumer<? super E> action) |
通过函数式接口遍历数据 |
其他
方法 |
描述 |
boolean retainsAll(Collection<?> c) |
保留集合中与指定集合所有匹配的元素 |
Object[] toArray() |
将集合转换为数组 |
<T> T toArray(T[] array) |
将集合转换为指定类型的数组 |
List
介绍
Collection
的子接口
- 有序集合
- 允许重复元素
- 允许
null
- 支持索引操作
- 常见实现类有
ArrayList
,Vector
,LinkedList
方法
添加
方法 |
描述 |
void add(int index,E e) |
在指定索引位置添加元素 |
boolean addAll(int index,Collection<? extends E> c) |
在指定索引位置插入指定集合的所有元素 |
删除
方法 |
描述 |
E remove(int index) |
删除指定索引的元素,并返回该元素 |
修改
方法 |
描述 |
E set(int index,E e) |
修改指定索引的元素,并返回被替换的元素 |
查询
方法 |
描述 |
E get(int index) |
获取指定索引的元素 |
int indexOf(Object o) |
返回指定元素第一次出现的索引位置.不存在返回-1 |
int lastIndexOf(Object o) |
返回指定元素最后一次出现的索引位置.不存在返回-1 |
List<E> subList(int formIndex,int toIndex) |
返回列表[formIndex,toIndex) 的子列表 |
遍历
方法 |
描述 |
ListIterator<E> listIterator() |
返回一个列表迭代器,支持双向遍历和修改操作 |
实现类
ArrayList
- 基于动态数组实现,支持快速随机访问
- 查找和遍历性能高,适用于频繁查找和遍历的场景
- 插入和删除元素较慢(需移动元素)
- 线程不安全
LinkedList
- 基于双向链表实现,支持快速插入和删除
- 插入和删除性能高,适用于频繁插入和删除元素的场景
- 查找和遍历性能较低
- 线程不安全
- 同时实现了
Deque
和List
接口,既可以作为队列使用,也可以作为列表使用
- 还可以作为栈使用
Vector
- 与ArrayList类似
- 线程安全
- 性能低
- 已过时
Stack
性能比较
操作 |
ArrayList |
LinkedList |
Vector |
随机访问 |
O(1) |
O(n) |
O(1) |
插入和删除 |
O(n) |
O(1) |
O(n) |
内存占用 |
较低 |
较高 |
较低 |
线程安全 |
不安全 |
不安全 |
安全 |
Set
介绍
Colleciotn
的子接口
- 无序集合
- 不允许重复元素
- 可以存储
null
,TreeSet
除外
- 继承了
Collection
的所有方法,但是本身没有实现方法
- 常见实现类有
HashSet
,LinkedHashSet
,TreeSet
实现类
HashSet<>
- 基于哈希表,无序
- 添加,删除,查询时间复杂度为`O(1)“
- 适用于快速查找和去重的长江
LinkedHashSet
- 基于哈希表和链表实现,有序
- 内存占用较高
- 适用于去重且有序的场景
TreeSet
- 基于红黑树实现,元素根据自然顺序或自定义顺序排序
- 添加,删除,查询时间复杂度为`O(log n)“
- 支持范围查找
- 适用于去重且需要排序的场景
性能比较
操作 |
HashSet |
LinkedHashSet |
TreeSet |
添加/删除 |
O(1) |
O(1) |
O(log n) |
查询 |
O(1) |
O(1) |
O(log n) |
内存占用 |
较低 |
较高 |
较高 |
元素顺序 |
无序 |
插入顺序 |
自然顺序 |
Queue
介绍
Collection
的子接口
- 队列,先进先出
- 不允许
null
- 支持双端操作(
Deque
)
- 常见实现类有
PriorityQueue
,LinkedList
方法
添加
方法 |
描述 |
boolean add(E e) |
将指定元素插入到队列,如果队列已满抛出IllegalStateException |
boolean offer(E e) |
将指定元素插入到队列,如果队列已满,返回false |
删除
方法 |
描述 |
E remove() |
移除并返回队列头部元素,如果队列为空,抛出NoSuchElementException |
E poll() |
移除并返回队列头部元素,如果队列为空,返回null |
查询
|方法|描述|
|E element()
|返回队列的头部元素,如果队列为空,则抛出NoSuchElementException
|
|E peek()
|返回队列的头部元素,如果队列为空,返回null
|
实现类
PriorityQueue
- 基于堆实现,元素按自然顺序或自定义顺序排序
- 支持优先级排序,头部元素优先级最高
- 适合按优先级处理元素的场景
ArrayDeque
- 基于动态数组实现,可以作为普通或双端队列
- 性能优于
LinkedList
,支持快速插入和删除
- 适合高效操作队列的场景
Deque
介绍
方法
添加
方法 |
描述 |
void addFirst(E e) |
在队列头部插入元素 |
void addLast(E e) |
在队列尾部插入元素 |
boolean offerFirst(E e) |
在队列头部插入元素,成功返回true |
boolean offerLast(E e) |
在队列尾部插入元素,成功返回true |
删除
方法 |
描述 |
E removeFirst() |
移除并返回队列头部元素 |
E removeLast() |
移除并返回队列尾部元素 |
E pollFirst() |
移除并返回队列头部元素,队列为空时返回null |
E pollLast() |
移除并返回队列头部元素,队列为空时返回null |
查询
方法 |
描述 |
E getFirst() |
返回队列头部元素 |
E getLast() |
返回队列尾部元素 |
E peekFirst() |
返回队列头部元素 |
E peekLast() |
返回队列尾部元素 |
Map
介绍
- 存储键值对(
key-value
)的集合
key
不允许重复
方法
添加
方法 |
描述 |
V put(K key,V value) |
将指定的键值插入到Map 中,如果键已经存在,则用新值替换旧值,并返回旧值,如果键不存在,返回null |
void putAll(Map<? extends K,? extends V> m) |
将指定Map 中的所有键值插入到当前Map |
删除
方法 |
描述 |
V remove(Object key) |
根据键删除对应键值对,并返回被删除的值,如果键不存在返回null |
void clear() |
清空Map |
查询
方法 |
描述 |
V get(Object key) |
根据键获取对应的值,如果键不存在返回null |
V getOfDefault(Object key,V defaultValue) |
根据键获取对应的值,如果见不存在返回默认值 |
boolean containsKey(Object key) |
判断Map 中是否包含指定键 |
boolean containsValue(Object Value) |
判断Map 中是否包含指定值 |
boolean isEmpty() |
判断Map 是否为空 |
int size() |
返回Map 中键值对的数量 |
修改
方法 |
描述 |
V replace(K key,V value) |
替换指定键的值,如果键不存在返回null |
boolean replace(K key,V oldValue,V newValue) |
当指定键的值等于oldValue 时,替换为newValue ,否则返回false |
遍历
方法 |
描述 |
Set<K> keySet() |
返回Map 中所有键的集合 |
Collection<V> values() |
返回Map 中所有值的集合 |
Set<Map.Entry<K,V> entrySet()> |
返回Map中所有键值对的集合 |
Map.entry
介绍
Map
的内部接口
Map
中存储数据的基本单元,表示一个键值对
- 每一个
Map.entry
对象都包含一个键值对
- 有两个实现类
HashMap.Node
和TreeMap.Entry
方法
方法 |
描述 |
K getKey() |
获取键 |
V getValue() |
获取值 |
V setValue() |
修改值,并返回旧值 |
实现类
HashMap
- 基于哈希表实现,性能高
- 键值对无序
- 允许
null
键和null
值
LinkedHashMap
- 基于hash表与链表实现
- 键值对按插入顺序或访问顺序排序
- 具有
HashMap
的性能优势
TreeMap
- 基于红黑树实现
- 键值对按自然顺序或自定义顺序排序
- 支持范围查找
HashTable
- 与
HashMap
类型
- 不允许
null
键和null
值
- 已过时
性能比较
操作 |
HashMap |
LinkedHashMap |
TreeMap |
HashTable |
添加/删除 |
O(1) |
O(1) |
O(log n) |
O(1) |
查找 |
O(1) |
O(1) |
O(log n) |
O(1) |
内存占用 |
较低 |
较高 |
较高 |
较低 |
键值对顺序 |
无序 |
插入顺序 |
自然顺序 |
无序 |
线程安全 |
不安全 |
不安全 |
不安全 |
安全 |
迭代器
介绍
- 用来遍历集合,单向遍历
- 支持删除元素
- 并发修改可能会产生异常
方法
方法 |
描述 |
boolean hashNext() |
判断集合是否有下一个元素 |
E next() |
返回集合中的下一个元素,如果没有元素抛出NoSuchElementException |
void remove() |
删除当前元素,每次调用next() 后,只能调用一次remove() |
ListIterator
介绍
Iterator
的子接口
- 增强迭代器,专用于遍历
List
- 支持双向遍历
- 支持遍历过程中修改元素
- 支持获取索引
方法
方法 |
描述 |
boolean hasPrevious() |
判断是否有前一个元素 |
E previous() |
返回前一个元素 |
int nextIndex() |
返回下一个元素索引 |
int previousIndex() |
返回前一个元素索引 |
void set(E e) |
指定元素替换最后一次返回的元素 |
void add(E e) |
在当前索引插入元素 |
工具类
Collections
介绍
方法
方法 |
描述 |
void sort(List<T> list,[Comparator<? super T> c]) |
对List 进行排序,可以自定义排序规则 |
int binarySeach(List<T> list,T key,[Comparator<? extends T> c]) |
对已排序集合二分查找,返回索引,不存在返回负数 |
boolean addAll(Collection<? super T> c,T... element) |
添加一组元素到集合中 |
T max(Collection<? extends T> c) |
返回集合中最大的元素 |
T min(Collection<? extends T> c) |
返回集合中最小的元素 |
void reverse(List<?> list) |
反转List 集合 |
void shuffle(List<?> list) |
随机打乱List 集合中元素的顺序 |
void swap(List<?> list,int i,int j) |
交换List 集合两个位置的元素 |
void fill(List<? super T>) list,T obj |
用指定元素填充List 集合的所有元素 |
void copy(List<? super T> dest,List<? extends T> src) |
将List 集合的元素,复制到目标List 集合 |
int frequency(Collection<?> c,Object o) |
统计指定元素在集合中出现的次数 |
List<T> unmodifiableList(List<? extends T> list) |
返回一个不可修改的List |
List<T> emptyList() |
返回一个空的不可修改的List |
List<T> singletonList(T o) |
返回一个只包含一个元素的不可修改的List |
List<T> synchronizedList(List<T> list) |
返回一个线程安全的List |
Arrays
介绍
方法
方法 |
描述 |
String toString(Object[] a) |
将数组转换为字符串 |
void sort(T[] a,[Comparator<? extends T> c]) |
对数组进行升序排序 |
int binarySearch(T[] a,[Comparator<? extends T> c]) |
对已排序数组进行二分查找,没有找到指定元素返回-1 |
boolean equals(T[] a,T[] b) |
比较两个数组是否相等 |
void fill(T[] a,T val) |
填充指定元素到整个数组或某一范围 |
T[] copyOf(T[] original,int newLength) |
复制整个数组,可以只能数组长度 |
T[] copyOfRange(T[] original,int form,int to) |
复制区间内的数组元素 |
List<T> asList(T... a) |
将数组转换为集合 |
String deepToString(Object[] o) |
递归输出多维数组内容 |
boolean deepEquals(Object[] a1,Object[] o2) |
递归比较多维数组 |
void setAll(T[] array,Function<? extends T> generator) |
通过函数式接口,赋值整个数组 |
线程安全
方法
Collections
工具类的synchronizedList
方法,可以返回一个线程安全的集合对象
类
- 通过线程安全集合来保证线程安全
Vector
,HashTable
是低效的线程安全实现类
CurrentHashMap
是高效的线程安全Map实现
CopyOfWriteArrayList
是高效的线程安全List
实现,适用于读多写少的场景