认识集合框架
Java 集合框架 Java Collection Framework ,又被称为容器container,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes
Java集合框架主要由三部分组成:
1.接口(Interfaces):表示集合的抽象数据类型。允许集合独立于其实现细节进行操作。
2.实现类(Implementations):接口的具体实现,即可重用的数据结构。
3.算法(Algorithms):对实现了集合接口的对象进行操作的方法,如搜索和排序。
类和接口总览
1. Collection:是一个接口,包含了大部分容器常用的一些方法
2. List:是一个接口,规范了ArrayList 和 LinkedList中要实现的方法
ArrayList:实现了List接口,底层为动态类型顺序表
LinkedList:实现了List接口,底层为双向链表
3. Stack:底层是栈,栈是一种特殊的顺序表
4. Queue:底层是队列,队列是一种特殊的顺序表
5. Deque:是一个接口,可以用来实现双端队列
6. Set:集合,是一个接口,里面放置的是K模型
HashSet:底层为哈希桶,查询的时间复杂度为O(1)
TreeSet:底层为红黑树,查询的时间复杂度为O(logN)
7. Map:映射,里面存储的是K-V模型的键值对
HashMap:底层为哈希桶,查询时间复杂度为O(1),关于key有序的
TreeMap:底层为红黑树,查询的时间复杂度为O(logN),关于key有序
Collection接口
Collection是集合层次结构的根接口,所有集合类都实现了这个接口。它提供了适用于所有集合的基本操作。
主要方法:
boolean add(E e) - 添加元素
boolean remove(Object o) - 移除元素
boolean contains(Object o) - 检查是否包含指定元素
int size() - 返回集合中的元素数量
boolean isEmpty() - 检查集合是否为空
Iterator<E> iterator() - 返回迭代器
void clear() - 清空集合
boolean containsAll(Collection<?> c) - 检查是否包含另一个集合的所有元素
boolean addAll(Collection<? extends E> c) - 添加另一个集合的所有元素
boolean removeAll(Collection<?> c) - 移除同时存在于指定集合中的所有元素
boolean retainAll(Collection<?> c) - 仅保留同时存在于指定集合中的元素
Object[] toArray() - 返回包含集合中所有元素的数组
List接口
List
是一个有序的Collection
,用户可以通过索引访问元素,并且允许重复元素。
特点:有序(插入顺序,允许重复元素,可以通过索引访问元素
主要方法:
E get(int index) - 获取指定位置的元素
E set(int index, E element) - 替换指定位置的元素
void add(int index, E element) - 在指定位置插入元素
E remove(int index) - 移除指定位置的元素
int indexOf(Object o) - 返回指定元素第一次出现的索引
int lastIndexOf(Object o) - 返回指定元素最后一次出现的索引
List<E> subList(int fromIndex, int toIndex) - 返回指定范围内的子列表
Stack接口
Stack
类是一个后进先出(LIFO, Last In First Out)的数据结构,它继承自 Vector
类。尽管 Stack
是一个可用的类,但它被认为是遗留的,并且在新代码中不推荐使用。通常建议使用 Deque
或 ArrayDeque
作为替代。
主要方法:
push(E item):将一个元素压入栈顶。
pop():从栈顶移除一个元素并返回它;如果栈为空,则抛出 EmptyStackException。
peek():查看栈顶的元素但不移除它;如果栈为空,则抛出 EmptyStackException。
search(Object o):返回对象在栈中的位置,即自上而下的索引,如果对象不在栈中则返回 -1。
empty():如果栈为空,则返回 true。
Queue接口
Queue
代表了先进先出(FIFO)的数据结构,除了基本的Collection
操作外,还提供了额外的插入、提取和检查操作。
主要方法:
boolean offer(E e) - 将元素添加到队列(不抛出异常)
E poll() - 获取并移除队首元素,如果队列为空则返回null
E peek() - 获取但不移除队首元素,如果队列为空则返回null
E element() - 获取但不移除队首元素,如果队列为空则抛出异常
E remove() - 获取并移除队首元素,如果队列为空则抛出异常
Deque接口
Deque
(双端队列)是Queue
的子接口,允许在两端进行插入和删除操作。
主要方法:
void addFirst(E e) / void addLast(E e) - 在队列前端/后端添加元素
E removeFirst() / E removeLast() - 移除并返回队列前端/后端的元素
E getFirst() / E getLast() - 获取但不移除队列前端/后端的元素
boolean offerFirst(E e) / boolean offerLast(E e) - 在队列前端/后端添加元素(不抛出异常)
E pollFirst() / E pollLast() - 获取并移除队列前端/后端的元素,如果队列为空则返回null
E peekFirst() / E peekLast() - 获取但不移除队列前端/后端的元素,如果队列为空则返回null
Set接口
Set
是一个不包含重复元素的Collection
。
特点:不允许重复元素、大多数实现类不保证元素的顺序、有些实现类可能保证特定的顺序(如LinkedHashSet
维护插入顺序)
Map接口
Map
将键映射到值,不能包含重复的键,每个键最多映射到一个值。
主要方法:
V put(K key, V value) - 添加键值对
V get(Object key) - 获取指定键对应的值
V remove(Object key) - 移除指定键对应的值
boolean containsKey(Object key) - 检查是否包含指定键
boolean containsValue(Object value) - 检查是否包含指定值
Set<K> keySet() - 返回包含所有键的Set
Collection<V> values() - 返回包含所有值的Collection
Set<Map.Entry<K, V>> entrySet() - 返回包含所有键值对的Set
int size() - 返回键值对的数量
boolean isEmpty() - 检查Map是否为空
void clear() - 清空Map