Java学习之路——集合
概述
集合的定义
什么是集合(Collection)?集合就是“由若干个确定的元素所构成的整体”。
从概念上来看集合和数组是十分相似的,那么为什么有了数组还要集合呢?
- 数组初始化后大小不可变;
- 数组只能按索引顺序存取;
- ……
正因为数组有着上述的缺点,因此在 Java 中又提供了集合来让我们使用。
集合的种类及特点
Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口。Java 的java.util包主要提供了以下三种类型的集合:
List:一种有序列表的集合;Set:一种保证没有重复元素的集合;Map:一种通过键值(key-value)查找的映射表集合。
Java 集合有以下特点:
- 接口和实现类相分离;
- 二是支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素。
Java 访问集合是通过统一的方式——迭代器(Iterator)来实现,有了它我们就可以只关心上层使用而不用关心下层的集合类型。
一、Collection接口常用方法
1. 添加元素
add(int index,E element):向集合中添加一项;index(可选参数)- 表示元素所插入处的索引值;element- 要插入的元素;返回值:如果成功插入元素,返回 true;
如果 index 超出范围,则该 add() 方法抛出
IndexOutOfBoundsException异常。
addAll(int index, Collection c):index(可选参数)- 表示元素所插入处的索引值;c - 要插入的集合元素;
返回值:如果成功插入元素,返回 true;
如果给定的集合为 null,则超出
NullPointerException异常;如果 index 超出范围,则该 add() 方法抛出
IndexOutOfBoundsException异常。
2. 获取有效元素个数
size():返回数组中元素的个数。- 返回值:返回数组中元素的个数。
3. 清空集合
clear():删除动态集合中的所有元素。
4. 是否为空集
isEmpty():判断集合是否为空。返回值:如果数组中不存在任何元素,则返回 true;
如果数组中存在元素,则返回 false。
5. 是否包含某个元素
contains(Object obj):用于判断元素是否在集合中;obj- 要检测的元素;返回值:如果指定的元素存在于动态数组中,则返回 true;
如果指定的元素不存在于动态数组中,则返回 false。
containsAll(Collection c):检测集合是否包含指定集合中的所有元素。collection- 集合参数;- 返回值:如果动态数组中包含的集合中的所有元素,则返回 true;
- 如果集合中存在的元素与指定
Collection中的元素不兼容,则抛出ClassCastException; - 如果 collection 中包含 null 元素,并且集合中不允许 null值,则抛出
NullPointerException异常。
6. 删除元素
remove(Object obj / int index):删除集合里的单个元素;obj - 要删除的元素,如果 obj 元素出现多次,则删除在数组中第一次出现的元素;
index - 要删除元素索引值;
返回值:如果传入元素,删除成功,则返回 true;
如果传入索引值,则返回删除的元素;
如果指定的索引超出范围,则该方法将抛出
IndexOutOfBoundsException异常。
removeAll(Collection c):删除存在于指定集合中的动态数组元素。c - 动态数组列表中要删除的元素集合;
返回值:如果从集合成功删除元素返回 true;
如果集合中存在的元素类与指定
Collection的元素类不兼容,则抛出ClassCastException异常;如果集合中包含 null 元素,并且指定
Collection不允许 null 元素,则抛出NullPointerException异常。
7. 求交集
retainAll(Collection c):保留ArrayList中在指定集合中也存在的那些元素。collection - 集合参数;
返回值:如果集合中删除了元素则返回 true;
如果集合中存在的元素与指定
Collection的类中元素不兼容,则抛出ClassCastException异常;如果集合包含 null 元素,并且指定
Collection不允许 null 元素,则抛出NullPointerException。
8. 判断集合是否相等
eauqls(Collection c):判断两个集合是否相等。- collection - 集合参数;
- 返回值:如果两个集合相等则返回 true。
9. 转换成数组
toArray(T[] arr):将集合对象转换为数组。T [] arr(可选参数)- 用于存储数组元素的数组;
返回值:如果参数 T[] arr 作为参数传入到方法,则返回 T 类型的数组;
如果未传入参数,则返回 Object 类型的数组。
10. 获取集合对象的哈希值
hashCode():返回集合哈希值。
11. 遍历集合
iterator():返回Iterator接口的实例,用于遍历集合。
二、使用 Iterator 接口遍历集合
在 Java 程序中,Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。
GoF 对迭代器的定义为:提供一种方法访问一个容器(container)对象中的各个元素,而又不需要暴露该对象的内部细节。
1. 迭代器常用方法
next():返回迭代器的下一个元素,并且更新迭代器的状态;hasNext():用于检测集合中是否还有元素。有则 true,没有则 false;remove():将迭代器返回的元素删除。
2. 获取一个迭代器
想要使用迭代器对象遍历集合,那么首先就需要获取一个迭代器。可以调用集合的 iterator() 方法获取一个迭代器。
| |
3. 遍历集合
使用迭代器遍历集合实质上就是不断调用 next() 方法的过程。当集合中的元素都已经遍历完后,此时再调用 next() 方法就会抛出 NoSuchElementException错误。
因此推介使用如下方式进行遍历:
| |
三、常用集合类
以下是我们日常开发中,使用较多的四种集合:
LinkedList:该类实现了List接口,允许有 null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List;ArrayList:该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。其插入删除效率低;HashSet:该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个;HashMap:HashMap是一个散列表,它存储的内容是键值对(key-value)映射。该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
1. LinkedList
示例
| |
常用方法
| 方法 | 描述 |
|---|---|
public boolean add(E e) | 链表末尾添加元素,返回是否成功,成功为 true,失败为 false。 |
public void add(int index, E element) | 向指定位置插入元素。 |
public boolean addAll(Collection c) | 将一个集合的所有元素添加到链表后面,返回是否成功,成功为 true,失败为 false。 |
public boolean addAll(int index, Collection c) | 将一个集合的所有元素添加到链表的指定位置后面,返回是否成功,成功为 true,失败为 false。 |
public void addFirst(E e) | 元素添加到头部。 |
public void addLast(E e) | 元素添加到尾部。 |
public boolean offer(E e) | 向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。 |
public boolean offerFirst(E e) | 头部插入元素,返回是否成功,成功为 true,失败为 false。 |
public boolean offerLast(E e) | 尾部插入元素,返回是否成功,成功为 true,失败为 false。 |
public void clear() | 清空链表。 |
public E removeFirst() | 删除并返回第一个元素。 |
public E removeLast() | 删除并返回最后一个元素。 |
public boolean remove(Object o) | 删除某一元素,返回是否成功,成功为 true,失败为 false。 |
public E remove(int index) | 删除指定位置的元素。 |
public E poll() | 删除并返回第一个元素。 |
public E remove() | 删除并返回第一个元素。 |
public boolean contains(Object o) | 判断是否含有某一元素。 |
public E get(int index) | 返回指定位置的元素。 |
public E getFirst() | 返回第一个元素。 |
public E getLast() | 返回最后一个元素。 |
public int indexOf(Object o) | 查找指定元素从前往后第一次出现的索引。 |
public int lastIndexOf(Object o) | 查找指定元素最后一次出现的索引。 |
public E peek() | 返回第一个元素。 |
public E element() | 返回第一个元素。 |
public E peekFirst() | 返回头部元素。 |
public E peekLast() | 返回尾部元素。 |
public E set(int index, E element) | 设置指定位置的元素。 |
public Object clone() | 克隆该列表。 |
public Iterator descendingIterator() | 返回倒序迭代器。 |
public int size() | 返回链表元素个数。 |
public ListIterator listIterator(int index) | 返回从指定位置开始到末尾的迭代器。 |
public Object[] toArray() | 返回一个由链表元素组成的数组。 |
public T[] toArray(T[] a) | 返回一个由链表元素转换类型而成的数组。 |
2. ArrayList
示例
| |
常用方法
| 方法 | 描述 |
|---|---|
add() | 将元素插入到指定位置的 ArrayList中 |
addAll() | 添加集合中的所有元素到 ArrayList中 |
clear() | 删除 ArrayList中的所有元素 |
clone() | 复制一份 ArrayList |
contains() | 判断元素是否在 ArrayList |
get() | 通过索引值获取 ArrayList中的元素 |
indexOf() | 返回 ArrayList中元素的索引值 |
removeAll() | 删除存在于指定集合中的 ArrayList里的所有元素 |
remove() | 删除 ArrayList里的单个元素 |
size() | 返回 ArrayList里元素数量 |
isEmpty() | 判断 ArrayList是否为空 |
subList() | 截取部分 ArrayList的元素 |
set() | 替换 ArrayList中指定索引的元素 |
sort() | 对 ArrayList元素进行排序 |
toArray() | 将 ArrayList转换为数组 |
toString() | 将 ArrayList转换为字符串 |
ensureCapacity() | 设置指定容量大小的 ArrayList |
lastIndexOf() | 返回指定元素在 ArrayList中最后一次出现的位置 |
retainAll() | 保留 ArrayList中在指定集合中也存在的那些元素 |
containsAll() | 查看 ArrayList是否包含指定集合中的所有元素 |
trimToSize() | 将 ArrayList中的容量调整为数组中的元素个数 |
removeRange() | 删除 ArrayList中指定索引之间存在的元素 |
replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
removeIf() | 删除所有满足特定条件的 ArrayList元素 |
forEach() | 遍历 ArrayList中每一个元素并执行特定操作 |
3. HashSet
示例
| |
常用方法
| 方法 | 描述 |
|---|---|
add() | 添加元素 |
remove() | 删除元素 |
clear() | 删除所有元素 |
contains() | 是否包含指定元素 |
isEmpty() | 判断是否为空 |
size() | 获取集合中元素个数 |
4. HashMap
示例
| |
常用方法
| 方法 | 描述 |
|---|---|
clear() | 删除 HashMap 中的所有键/值对 |
| clone() | 复制一份 HashMap |
isEmpty() | 判断 HashMap是否为空 |
size() | 计算 HashMap中键/值对的数量 |
put() | 将键/值对添加到 HashMap中 |
putAll() | 将所有键/值对添加到 HashMap中 |
putIfAbsent() | 如果 HashMap中不存在指定的键,则将指定的键/值对插入到 HashMap中。 |
remove() | 删除 HashMap中指定键 key 的映射关系 |
containsKey() | 检查 HashMap中是否存在指定的 key 对应的映射关系。 |
containsValue() | 检查 HashMap中是否存在指定的 value 对应的映射关系。 |
replace() | 替换 HashMap中是指定的 key 对应的 value。 |
replaceAll() | 将 HashMap中的所有映射关系替换成给定的函数所执行的结果。 |
get() | 获取指定 key 对应对 value |
getOrDefault() | 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值 |
forEach() | 对 HashMap中的每个映射执行指定的操作。 |
entrySet() | 返回 HashMap中所有映射项的集合集合视图。 |
keySet() | 返回 HashMap中所有 key 组成的集合视图。 |
values() | 返回 HashMap中存在的所有 value 值。 |
merge() | 添加键值对到 HashMap中 |
compute() | 对 HashMap中指定 key 的值进行重新计算 |
computeIfAbsent() | 对 HashMap中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 HashMap中 |
computeIfPresent() | 对 HashMap中指定 key 的值进行重新计算,前提是该 key 存在于 HashMap中。 |