【第六章】集合类:List、Iterator迭代器

目录

1.集合类

[1.1 什么是集合类](#1.1 什么是集合类)

[1.2 集合类的分类](#1.2 集合类的分类)

2.Collection接口

3.List集合

[3.1 ArrayList集合](#3.1 ArrayList集合)

[3.2 LinkedList集合](#3.2 LinkedList集合)

[3.3 ArrayList和LinkedList对比](#3.3 ArrayList和LinkedList对比)

[3.4 创建List对象](#3.4 创建List对象)

[4 Iterator接口](#4 Iterator接口)

[5 foreach循环](#5 foreach循环)

[6 代码练习](#6 代码练习)


1.集合类

1.1 什么是集合类

集合类就像一个容器,相当于一个动态数组。

为了在程序中可以保存数目不确定的对象,Java提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,这些类被统称为集合。集合类都位于java.util包中,使用时必须导包。

1.2 集合类的分类

集合按照其存储结构可以分为两大类,单列集合Collection和双列集合Map,这两种集合的特点具体如下:

● Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有ArrayList和LinkedList,Set接口的主要实现类有HashSet和TreeSet。

● Map:双列集合类的根接口,用于存储具有键(Key)、值(Value)映射关系的元素,每个元素都包含一对键值,其中键值不可重复并且每个键最多只能映射到一个值,在使用Map集合时可以通过指定的Key找到对应的Value。例如,根据一个学生的学号就可以找到对应的学生。Map接口的主要实现类有HashMap和TreeMap。

整个集合类的继承体系如下图。

2.Collection****接口

Collection是所有单列集合的父接口,它定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。Collection接口的常用如下表。

|-----------------------------------------------|-------------------------------------------|
| 方法声明 | 功能描述 |
| boolean add(Object o) | 向集合中添加一个元素 |
| boolean addAll(Collection c) | 将指定Collection中的所有元素添加到该集合中 |
| void clear() | 删除该集合中的所有元素 |
| boolean****remove(Object o) | 删除该集合中指定的元素 |
| boolean removeAll(Collection c) | 删除指定集合中的所有元素 |
| boolean isEmpty**()** | 判断该集合是否为空 |
| boolean contains(Object o) | 判断该集合中是否包含某个元素 |
| boolean containsAll**(Collection c)** | 判断该集合中是否包含指定集合中的所有元素 |
| Iterator iterator() | 返回在该集合的元素上进行迭代的迭代器(Iterator), 用于遍历该集合所有元素 |
| int size() | 获取该集合元素个数 |

3.List集合

List接口继承自Collection接口,是单列集合的一个重要分支。

List集合允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引访问List集合中的指定元素。

另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

|---------------------------------------------------------------|------------------------------------------------|
| 方法声明 | 功能描述 |
| void add(int index,Object element) | 将元素element插入在List集合的index处 |
| boolean addAll**(int **index,Collectionc)** | 将集合c所包含的所有元素插入到List集合的index处 |
| Object get(int index) | 返回集合索引index处的元素 |
| Object remove(int index) | 删除index索引处的元素 |
| Object set(int index, Object element) | 将索引index处元素替换成element对象, 并将替换后的元素返回 |
| **int
indexOf**(Object o)** | 返回对象o在List集合中出现的位置索引 |
| int lastIndexOf(Object o) | 返回对象o在List集合中最后一次出现的位置索引 |
| List subList (int fromIndex, int toIndex) | 返回从索引fromIndex(包括)到 toIndex(不包括) 处所有元素集合组成的子集合 |

3.1 ArrayList集合

ArrayList是List接口的一个实现类,它是程序中最常见的一种集合。在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。

由于ArrayList集合的底层是使用一个数组来保存元素,在增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作。因为这种数组的结构允许程序通过索引的方式来访问元素,所以使用ArrayList集合查找元素很便捷。

3.2 LinkedList****集合

ArrayList集合在查询元素时速度很快,但在增删元素时效率较低。为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。LinkedList集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。正因为这样的存储结构,所以LinkedList集合对于元素的增删操作具有很高的效率。

LinkedList集合添加元素和删除元素的过程如下图。

3.3 ArrayList和LinkedList对比

3.4 创建List对象

4 Iterator****接口

在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,Java专门提供了一个接口Iterator。

Iterator接口也是集合中的一员,但它与Collection、Map接口有所不同。

Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

接下来通过一个案例学习如何使用Iterator迭代集合中的元素。

java 复制代码
1 import java.util.*;
2 public class Example03 {
3    public static void main(String[] args) {
4        ArrayList list = new ArrayList(); // 创建ArrayList集合
5        list.add("张三");                     // 向该集合中添加字符串
6        list.add("李四");
7        list.add("王五");
8        list.add("赵六");
9 Iterator it = list.iterator(); // 获取Iterator对象
10        while (it.hasNext()) {           // 判断ArrayList集合中是否存在下一个元素
11            Object obj = it.next();     // 取出ArrayList集合中的元素
12            System.out.println(obj);
13        }
14    }
15 }

5 foreach****循环

从上面的格式可以看出,与for循环相比,foreach循环不需要获得容器的长度,也不需要根据索引访问容器中的元素,但它会自动遍历容器中的每个元素。接下来通过一个案例演示foreach循环的用法。

java 复制代码
1 import java.util.*;
2 public class Example05 {
3	public static void main(String[] args) {
4		ArrayList list = new ArrayList();// 创建ArrayList集合
5		list.add("aaa");		// 向ArrayList集合中添加字符串元素
6		list.add("bbb");
7		list.add("ccc");		
8		for (Object obj : list) {	   // 使用foreach循环遍历ArrayList对象
9			System.out.println(obj); // 取出并打印ArrayList集合中的元素
10		}
11	}
12 }

6 代码练习

1.在LinkedList中添加和移除元素:创建一个字符串类型的LinkedList,依次添加元素"A"、"B"、"C"到列表中,然后移除第二个元素,最后输出修改后的LinkedList。

提示:remove()

java 复制代码
import java.util.LinkedList;
import java.util.Collections;
public class Main {
    public static void main(String[] args) {
        LinkedList<String> StringlinkedList = new LinkedList<>();
        StringlinkedList.add("A");
        StringlinkedList.add("B");
        StringlinkedList.add("C");
        StringlinkedList.remove("B");
        System.out.println("修改后的linkedList: " + StringlinkedList);
    }
}

2.ArrayList反转元素顺序:创建一个字符类型的ArrayList,将列表中的元素顺序反转,然后输出反转后的ArrayList。

提示:循环或者reverse()

java 复制代码
public class Main {
    public static void main(String[] args) {
        ArrayList<Character> charList = new ArrayList<>();
        charList.add('c');
        charList.add('o');
        charList.add('k');
        charList.add('e');
        Collections.reverse(charList);
        System.out.println(charList);
    }
}
相关推荐
shymoy19 分钟前
Radix Sorts
数据结构·算法·排序算法
木向2 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越2 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
小爬虫程序猿4 小时前
如何利用Python解析API返回的数据结构?
数据结构·数据库·python
pianmian18 小时前
python数据结构基础(7)
数据结构·算法
ChoSeitaku11 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
偷心编程11 小时前
双向链表专题
数据结构
香菜大丸11 小时前
链表的归并排序
数据结构·算法·链表
jrrz082811 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
@小博的博客12 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习