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

news/2024/9/23 4:20:23/

目录

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/news/1431122.html

相关文章

云原生周刊:Kubernetes v1.30 发布 | 2024.4.22

开源项目推荐 pv-migrate pv-migrate 是一个 CLI 工具/kubectl 插件&#xff0c;可轻松将一个 Kubernetes 的内容迁移 PersistentVolumeClaim 到另一个 Kubernetes。 Claudie Claudie 是一个云原生的 Kubernetes 管理平台&#xff0c;具备跨多个云提供商和本地数据中心的多…

TCP/IP协议(二)

一、TCP-选项 1.简介 在TCP/IP报文中&#xff0c;固定头部下边就是 "选项"部分。 (1)TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计的 (2)大多数的TCP选项部分出现在TCP连接建立阶段 2.构成 2.1 最大报文传输段 最大报文传输段(Ma…

vue中如何控制一个全局接口的调用频率

业务说明 在app.vue&#xff0c;created中调用了一个同步用户信息的接口&#xff0c;但不希望每个页面刷新都会调用&#xff0c;并限制在页面的调用频率 具体实现 /*** 判断是否应该调用接口 白名单下的直接调用* param {String} api_name 接口名字* param {String} router_…

Python基于Django的旅游城市关键词分析和提取,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

苹果App Store政策调整,模拟器游戏或成为新机遇

随着智能手机的普及和技术的飞速发展&#xff0c;iPhone和Android手机已深入我们的日常生活&#xff0c;成为不可或缺的一部分。然而&#xff0c;两大系统在应用商店的运营模式上一直存在明显的差异。苹果的App Store以其封闭性和安全性而著称&#xff0c;而Android平台则以其开…

MongoDB 与MySQL的区别?优势?

MongoDB 与 MySQL 是两种不同类型的数据库管理系统&#xff0c;它们各自有独特的数据模型、查询语言、扩展方式以及适用场景。以下是它们的主要区别与各自的优势&#xff1a; 区别&#xff1a; 数据模型&#xff1a; MySQL&#xff1a;基于关系模型&#xff0c;使用表格&#…

【QT进阶】Qt http编程之json解析的简单介绍

往期回顾 【QT进阶】Qt http编程之后端API测试工具postman使用介绍-CSDN博客 【QT进阶】Qt http编程之http相关类的简单介绍-CSDN博客 【QT进阶】Qt http编程之用户登录注册功能实现-CSDN博客 【QT进阶】Qt http编程之json解析的简单介绍 一、JSON字符串 1、基本概念 JSON字…

【Node.js】json-server

概述 json-server 主要用于快速开启一个后端服务&#xff0c;并手动设置模拟接口数据。 以下来源于 json-server - npm (npmjs.com) 安装 npm install json-server用法 创建文件db.json {"posts": [{ "id": "1", "title": "a…