文章目录
一. java集合简单介绍
1. 什么是集合
集合类是Java数据结构的实现。Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。Java集合类是Java将一些基本的和使用频率极高的基础类进行封装和增强后再以一个类的形式提供。——摘自百度百科java集合类
2. java集合框架图
二.
0. Collection接口
Collection接口时处理对象合集的根接口,公共方法如下
方法名 | 功能 |
---|---|
add(Object element): boolean | 添加一个新元素o到合集中 |
addAll(Collection c): boolean | 在指定索引位置处添加c中的所有元素 |
clear(): void | 从该合集中删除所有元素 |
contains(Object o)/containsAll(Collection c): boolean | 如果该合集包含元素o/包含c中所有元素,则返回true |
equals(Collection c) | 如果该合集等同于另一个合集c,则返回true |
hashCode(): int | 返回该合集的哈希码 |
isEmpty(): boolean | 若空则真 |
remove(Object o): boolean | 从该合集中移除元素o |
removeAll(Collection c):boolean | 从该合集中删除c中的所有元素 |
retainAll(Collection c):boolean | 保留同时位于c和该合集中的元素 |
size(): int | 返回该合集的元素数目 |
toArray(): Object[] | 为该合集中的元素返回一个Object数组 |
addAll、removeAll、retainAll类似于并、差、交运算
1.迭代器
Iterator是一种经典的设计模式,用于在不需要暴露数据是如何保存在数据结构的细节的情况下,来遍历这个数据结构。
Collection接口继承自Iterable接口。Iterable接口中定义了iterator方法,该方法会返回一个迭代器,这个迭代器可以用next()方法顺序访问集合中的元素,可以用hasNext()方法来检测迭代器中是否还有更多的元素,以及remove()方法来一处迭代器返回的最后一个元素。
Collection<String> collection = new ArrayList<>();
collection.add("zerotrac yyds");
collection.add("sweetiee tql");
collection.add("mi na sang dai dai wo");
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
iterator.remove();
}
System.out.println(collection.size());
2.线性表
1)简介
ArrayList和LinkedList定义在List接口下。List接口继承自Collection接口,定义了一个允许重复的有序合集。List接口增加了面向位置的操作,并且增加了一个能够双向遍历线性表的线性表迭代器。
2)List接口中的通用方法
方法名 | 功能 |
---|---|
add(int index, Object element): boolean | 在指定索引位置处增加一个新元素 |
addAll(int index, Collection c): boolean | 在指定索引位置处添加c中的所有元素 |
get(int index): E | 返回该线性表指定索引位置处的元素 |
indexOf(Object element): int | 返回第一个匹配元素的索引 |
lastIndexOf(Object element): int | 返回最后一个匹配元素的索引 |
listIterator(int startIndex): ListIterator<E> | 返回针对从startIndex开始的元素的迭代器 |
remove(int index): E | 移除指定索引位置处的元素 |
set(int index, Object element): Object | 设置指定索引处的元素 |
subList(int fromIndex, int toIndex): List<E> | 返回从fromIndex到toIndex-1的子线性表 |
3)ListIterator接口中的方法
方法名 | 功能 |
---|---|
add(Object element): void | 添加一个指定的对象到线性表中 |
hasPrevious()/hasNext(): boolean | 当往回/往后遍历时,如果还有更多的元素,返回true |
previous()/next(): E | 返回该线性表遍历器的前一个/后一个元素 |
nextIndex()/previousIndex() | 返回下一个/上一个元素的索引 |
set(E element):void | 使用指定元素替换previous()或next()返回的最后一个元素 |
4)数组线性表类ArrayList和链表LinkedList
ArrayList和LinkedList是实现List接口的两个具体类。ArrayList用数组存储元素,这个数组是动态创建的,如果元素个数超过了数组的容量,就创建一个更大的数组,并且将当前数组中的所有元素都复制到新数组中;LinkedList在链表中存储元素。
- 两种类的选择:
- 如果需要通过下标随机访问元素,而不再线性表的起始位置或者中间位置插入或删除元素,则选用ArrayList。
- 如果程序需要在线性表的起始或中间位置上插入或删除元素,选用LinkedList。
ArrayList | 功能 |
---|---|
ArrayList() | 使用默认的初始容量创建一个空的线性表 |
ArrayList(Collection c) | 从已经存在的合集中创建一个线性表 |
ArrayList(int initialCapacity) | 创建一个指定初始容量的空的数组线性表 |
trimToSize() | 将该ArrayList实例的容量裁剪到该线性表的当前大小 |
LinkedList | 功能 |
---|---|
LinkedList() | 使用默认的初始容量创建一个空的线性表 |
LinkedList(Collection c) | 从已经存在的合集中创建一个线性表 |
addFirst/addLast(E element) | 添加元素到该线性表的头部/尾部 |
getFirst/getLast() | 返回该线性表的第一个/最后一个元素 |
removeFirst()/removeLast() | 从该线性表中返回并删除第一个/最后一个元素 |
3. 向量和栈
向量类简单介绍
Vector类和ArrayList类都继承了AbstractList类。除了包含用于访问和修改向量的同步方法外,Vector类和ArrayList类是一样的。同步方法用于防止两个或多个线程同时访问和修改某个向量时引起数据损坏。对于许多不需要同步的应用程序来说,使用ArrayList比使用Vector更高效。
Stack
栈类Stack时作为Vector类的扩展来实现的,方法如下表格
方法 | 功能 |
---|---|
Stack() | 创建一个空的栈 |
empty() | 如果栈是空的,返回真 |
peek(): E | 返回栈顶元素 |
pop(): E | 返回并移除栈顶元素 |
push(Object o): E | 压入一个元素 |
search(Object o): int | 返回该栈中指定元素的位置 |
4.队列
Queue接口
Queue接口继承自java.util.Collection, 加入了插入、提取和检验等操作。
方法 | 功能 |
---|---|
offer(E element): boolean | 插入一个元素到队列中 |
poll(): E | 获取并移除队列的头元素,如果队列为空则返回null |
remove(): E | 获取并移除队列的头元素,如果队列为空则抛出异常 |
peek(): E | 获取队列的头元素,如果队列为空则返回null |
element(): E | 获取队列的头元素,如果队列为空则抛出异常 |
Deque、LinkedList和ArrayDeque
LinkedList类实现了Deque接口和List接口,Deque接口又继承自Queue接口。因此,可以用LinkedList创建一个队列。LinkedList很适合用于队列操作,因为它可以高效地在线性表的两端插入、移除元素。
Deque支持在两端插入和删除元素。deque(double-ended queue) 是双端队列的简称,读音“deck”,Deque继承自Queue,增加了从队列两端插入和删除元素的方法。方法addFirst(e)/removeFirst(e)/addLast(e)/removeLast(e)/getFirst(e)/getLast(e)都在Deque接口中定义。
ArrayDeque是Deque接口的一个实现,使用了可变数组,所以没有容量上的限制。
同时,ArrayDeque是线程不安全的,在没有外部同步的情况下,不能再多线程环境下使用。
ArrayDeque是Deque的实现类,可以作为栈来使用,效率高于Stack;
也可以作为队列来使用,效率高于LinkedList。
需要注意的是,ArrayDeque不支持null值。
ArrayDeque详解
5.Set
6.Map
三. 参考资料
Java集合(一)、什么是Java集合?
《Java语言程序设计(进阶篇)》