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

server/2024/9/23 11:15:22/

目录

1.集合类

1.1 什么是集合类

1.2 集合类的分类

 2.Collection接口

 3.List集合

 3.1 ArrayList集合

3.2 LinkedList集合

3.3 ArrayList和LinkedList对比

3.4 创建List对象

4 Iterator接口

5 foreach循环

6 代码练习


1.集合类

1.1 什么是集合类

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

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

1.2 集合类的分类

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

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

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

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

 2.Collection接口

Collection是所有单列集合的父接口,它定义了单列集合(ListSet)通用的一些方法,这些方法可用于操作所有的单列集合。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,Collection c)

将集合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)

返回对象oList集合中出现的位置索引

int lastIndexOf(Object o)

返回对象oList集合中最后一次出现的位置索引

List subList

(int fromIndex, int toIndex)

返回从索引fromIndex(包括)到 toIndex(不包括)

处所有元素集合组成的子集合

 3.1 ArrayList集合

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

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

3.2 LinkedList集合

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

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

3.3 ArrayListLinkedList对比

3.4 创建List对象

Iterator接口

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

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

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

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

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 }

foreach循环

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

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()

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()

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);}
}


http://www.ppmy.cn/server/10073.html

相关文章

Leetcode 1047:删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 import java.util.Stack;public…

代码随想录算法训练营Day6 | 242.有效的字母异位词 ●349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

基础&#xff1a; 1.哈希表是根据关键值进行直接访问的数据结构&#xff0c;时间复杂度是O(1)&#xff0c;也就是通过数组的索引下标&#xff0c;直接访问数组中的元素哈希表的作用就是用来快速判断一个元素是否出现在集合里。 2.常见的哈希结构&#xff1a; 数组set &#…

【LLM】向量知识库

文章目录 认识向量知识库向量Embeddings向量数据库向量数据库的作用向量数据库与传统数据库的区别 Embedding API使用公有Embedding API自定义一个Embeedding API 常见文本数据的预处理搭建并使用向量数据库思考向量数据库在LLM中的价值体现向量的妙用&#xff0c;可行&#xf…

linux入门到精通-第十一章-进程间通信(无名管道)

目录 参考概念**进程通信的目的&#xff1a;**Linux 操作系统支持的主要进程间通信的通信机制: 无名管道概述pipe函数建立无名管道父子进程使用无名管道通信 管道读写特点设置非阻塞的方法查看管道缓冲区命令查看管道缓冲区函数 参考 视频教程 概念 进程是一个独立的资源分配…

Ubuntu22.04.4 - Redis - 笔记

一、安装 sudo apt update sudo apt install redis-serverrootzheng:/etc# redis-cli --version redis-cli 6.0.16二、配置文件修改 配置文件地址 /etc/redis/redis.conf 1、开启远程访问 # 注释掉绑定地址#bind 127.0.0.1&#xff0c;让Redis可远程访问 # bind 127.0.0.1 …

css:echarts渐变色转换为css渐变色

通过一个下拉框来选择渐变类型&#xff0c;为了简化&#xff0c;我设置了三种&#xff1a;水平方向的渐变、垂直方向的渐变和径向渐变用&#xff0c;表格来配置echarts渐变色的百分比位置和颜色。 config是表格里的数据格式如下&#xff1a; offset是百分比位置&#xff0c;co…

一文详解affine_grid 与 grid_sample以及与opencv坐标系的关系

前言 网上资料乱七八糟&#xff0c;本文通过坐标系和变换的角度&#xff0c;系统梳理两个操作的作用 基本仿射变换 二维仿射变换&#xff0c;我们可以综合为一个2x2的旋转矩阵R和一个2x1的平移矩阵t&#xff0c;[R,t]组合起来就是2x3的矩阵 我们可以增广为3x3的矩阵&#xf…

富格林:养成可信操作稳健出金

富格林认为&#xff0c;在黄金投资过程中&#xff0c;有许多方法、技能和基础知识是影响投资者稳健出金的关键因素。因此&#xff0c;投资者需要养成对这些可信知识的掌握有助于获得更稳定的盈利出金。以下是黄金现货投资过程中需要了解的一些可信操作技巧。相信学习了这些富格…