Java语言程序设计——篇十一(2)


🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿
- 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻
🚩集合——List
- 集合框架
- List接口及实现类
- List的操作
- ArrayList类
- 实战演练
- 遍历集合元素
- 实战演练
- 数组转换为List对象
- 综合实例
集合框架
- 集合框架是Java以类库的形式提供了用户开发程序时可直接使用的各种数据结构。
- 数据结构:以某种形式将数据组织在一起,不仅支持存储数据,还支持访问和处理数据。
- 在面向对象思想里,一种数据结构被认为是一个容器(集合)。
- Java集合框架提供了一些现成的数据结构可供使用,这些数据结构是可以存储对象的集合,在这里对象也称为元素。
- Java集合框架由两种类型构成:
1️⃣Collection,用于存放一组对象。
2️⃣Map ,用于存放一组“关键字/值”的对象。

- 基本操作
boolean add(E e):向集合中添加元素e
boolean remove(Object o):从集合中删除指定的元素o
boolean contains(Object o):返回集合中是否包含指定元素
boolean isEmpty():判空
int size():返回集合中所包含元素的个数
Iterator iterator():返回包含所有元素的迭代器对象 - 批量操作
boolean addAll(Collection<? extends E> c) 功能:将集合c中的所有元素添加到当前集合中 boolean removeAll(Collection<?> c)
功能:从当前集合中删除集合c中的所有元素
default boolean removeIf(Predicate<? super E> filter)
功能:从当前集合中删除满足谓词的所有元素 - 数组操作
Object[] toArray() :用来返回包含集合中所有元素的Object型数组
eg: Object[] a = c.toArray();
T[] toArray(T[] a):用来返回包含集合中所有元素的指定类型的数组
eg: String[] a = c.toArray(new String[0]); - 流(Stream)操作
default Stream stream()
功能:以当前集合作为源返回一个顺序Stream对象
default Stream parallelStream()
功能:以当前集合作为源返回一个并行Stream对象
List接口及实现类
- 列表接口List是Collection的子接口,它是一种包含有序元素的线性表,其中的元素可重复,也可以是空值null。
- 存放在List中的元素有一个下标(从0开始),可通过下标访问List中的元素。


List的操作
- 因为List接口为Collection的子接口,所以List接口拥有Collection接口提供的所有常用方法。
- List是列表类型,它还提供了一些适合于自身的常用方法,如下页表所示。
| 方 法 名 称 | 功 能 简 介 |
|---|---|
| void add(int index, E obj) | 用来向列表的指定索引位置添加对象,其他对象的索引位置相对后移一位。索引位置从0开始 |
| E remove(int index) | 用来清除列表中指定索引位置的对象 |
| E set(int index, E obj) | 用来将列表中指定索引位置的对象修改为指定的对象 |
| E get(int index) | 用来获得指定索引位置的对象 |
| int indexOf(Object obj) | 用来获得指定对象的第一个索引位置。当不存在时,返回-1 |
| int lastIndexOf(Object obj) | 用来获得指定对象的最后一个索引位置。当不存在时,返回-1 |
| List <?> subList(int from, int to) | 返回从from(包含)到to(不包含)的一个List列表 |
| listIterator() | 用来获得一个包含所有对象的ListIterator型实例 |
ArrayList类
- List接口的常用实现类有ArrayList和LinkedList,在使用线性表时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList。
- 例如:
// 利用ArrayList类实例化List
List<String> list1 = new ArrayList<String>();
// 利用LinkedList类实例化List
List<String> list2 = new LinkedList<String>();
- ArrayList类是通过数组实现的集合对象,它实际上实现了一个变长的对象数组,元素可以动态的增加和删除。
- 数组结构的优点是便于对列表进行快速的随机访问, 如果经常需要根据索引位置访问集合中的对象,使用ArrayList类实现的列表的效率较高。
- 数组结构的缺点是向指定索引位置插入对象、删除指定索引位置对象的速度较慢。
- 当在指定索引位置插入对象时,会将指定索引位置及其后的所有元素相应地向后移动一位,如下图所示:

- 当删除指定索引位置的对象时,会将指定索引位置之后的所有元素相应地向前移动一位,如下图所示:

- 进行插入、删除操作时,如果在指定的索引位置之后有大量的对象,将严重影响对集合的操作效率。
- ArrayList类的构造方法
public ArrayList():创建初始容量为10的空数组列表
public ArrayList(int i):创建初始容量为i的空数组列表
public ArrayList(Collection c):创建包含容器c中所有元素的数组列表
实战演练
例:TestArrayList.java
import java.util.ArrayList;
public class TestArrayList {
public static void main(String[] args) {ArrayList<String> cityList = new ArrayList<>();//add some cities in the listcityList.add("Beijing");//cityList now contains[Beijing]cityList.add("London");//cityList now contains[Beijing,London]cityList.add("Shanghai");//cityList now contains[Beijing,London,Shanghai]cityList.add(" Beijing");//cityList now contains[Beijing,London,Shanghai, Beijing]cityList.add("Taiyuan");//cityList now contains[Beijing,London,Shanghai, Beijing,Taiyuan]System.out.println("List size="+cityList.size());System.out.println("Is Taiyuan in the list?"+cityList.contains("Taiyuan"));System.out.println("The location of Shanghai in the list?"+cityList.indexOf("Shanghai"));System.out.println("Is the list empty?"+cityList.isEmpty());cityList.add(2, "Xian"); // [Beijing,London,Xian,Shanghai, Beijing,Taiyuan]cityList.remove(“Shanghai"); // [Beijing,London,Xian,Beijing,Taiyuan]cityList.remove(1); // [Beijing,Xian,Beijing,Taiyuan]System.out.println(cityList.toString()); for(int i=cityList.size()-1;i>=0;i--)System.out.print(cityList.get(i)+" ");}
}

遍历集合元素
- 对集合中元素访问时,经常需要按某种次序对每一个元素访问且仅访问一次,这就是遍历,也称迭代。
- 对集合元素遍历有如下4种方式:
a.简单的for循环
for(int i=0; i<array.size(); i++) String o = array.get(i);
b.增强的for循环
for(String elm:array) System.out.println(elm)
c.Iterator迭代器对象
d.ListIterator迭代器对象
c.Iterator迭代器对象
- 每个实现Collection接口的容器对象都可调用iterator()方法返回一个Iterator对象,称为迭代器对象。
- 接口Iterator支持对List对象的从前向后的遍历,该接口定义了3个方法。
- 1)boolean hasNext():返回迭代器是否有下一个元素
2)E next(): 返回下一个元素
3)void remove():删除迭代器中的当前元素
Iterator iterator = array.iterator(); //得到迭代器对象
while(iterator.hasNext())System.out.println(iterator.next());

for(Iterator iterator = array.iterator(); iterator.hasNext();)System.out.println(iterator.next());
d.ListIterator迭代器对象
- 通过List接口提供的listIterator()方法可以返回ListIterator对象,它支持对线性表双向遍历。
- ListIterator是Iterator的子接口,不但继承了Iterator接口中的方法,还定义了多个方法。
boolean hasNext() :返回是否还有下一个元素
boolean hasPrevious() :返回是否还有前一个元素
E next():返回下一个元素
E previous():返回前一个元素
int nextIndex():返回下一个元素的索引
int previousIndex():返回前一个元素的索引
void add(E o):当前位置插入一个元素
void remove():删除当前元素
void set(E o):修改当前元素
实战演练
例:使用ListIterator对象实现反向输出线性表中的元素。
import java.util.*;
public class IteratorDemo{public static void main(String[] args) {List<String> myList = new ArrayList<String>();myList.add("one");myList.add("two");myList.add("three");myList.add("four");ListIterator<String> iterator = myList.listIterator();// 将迭代器指针移动到线性表末尾while(iterator.hasNext()){iterator.next();}// 从后向前访问线性表的每个元素while (iterator.hasPrevious())System.out.println(iterator.previous());}
}

数组转换为List对象
- java.util.Arrays类提供了一个asList()方法,它将数组转换成List对象,定义如下:
public static <T> List<T> asList(T… a)参数可以为数组,可以是数组元素
String[] str = {"one", "two", "three"};
List<String> list = Arrays.asList(str);
List<String> list = Arrays.asList("one", "two", "three");
- Arrays.asList()方法返回的List对象不可变。若要对该List对象进行添加、删除等操作,可以将其作为参数传递给另一个List的构造方法。
List<String> list1 = new ArrayList<>(list);
综合实例
编写程序,实现一个对象栈类MyStack,要求使用ArrayList类实现该栈,该栈类的UML图如下所示。

import java.util.ArrayList;
import java.util.List; public class MyStack<T> { private List<T> list; // 构造函数 public MyStack() { list = new ArrayList<>(); } // 判断栈是否为空 public boolean isEmpty() { return list.isEmpty(); } // 返回栈的大小 public int getSize() { return list.size(); } // 返回栈顶元素但不移除 public T peek() { if (isEmpty()) { throw new IllegalStateException("Stack is empty"); } return list.get(list.size() - 1); } // 弹出栈顶元素 public T pop() { if (isEmpty()) { throw new IllegalStateException("Stack is empty"); } return list.remove(list.size() - 1); } // 元素入栈 public void push(T t) { list.add(t); } // 元素查找方法,返回元素在栈中的位置(从栈底开始计数,即第一个元素位置为0),如果未找到则返回-1 public int search(T t) { for (int i = 0; i < list.size(); i++) { if (list.get(i).equals(t)) { return i; // 注意这里返回的是从栈底开始的位置 } } return -1; // 未找到 } // 可选:打印栈内容(用于调试) public void printStack() { System.out.println("Stack content (bottom to top):"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } // 主函数,用于测试MyStack类 public static void main(String[] args) { MyStack<Integer> stack = new MyStack<>(); stack.push(1); stack.push(2); stack.push(3); System.out.println("Stack size: " + stack.getSize()); System.out.println("Top element: " + stack.peek()); System.out.println("Popped element: " + stack.pop()); System.out.println("Element 2 position: " + stack.search(2)); stack.printStack(); }
}
博主用心写,读者点关注,互动传真情,知识不迷路。
相关文章:
Java语言程序设计——篇十一(2)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...
Linux 应急响应靶场练习 1
靶场在知攻善防实验室公众号中可以获取 前景需要:小王急匆匆地找到小张,小王说"李哥,我dev服务器被黑了",快救救我!! 挑战内容: (1)黑客的IP地址 (2࿰…...
AWS-Lambda的使用
介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…...
python3.12 搭建MinerU 环境遇到的问题解决
报错: AttributeError: module pkgutil has no attribute ImpImporter. Did you mean: zipimporter? ERROR: Exception: Traceback (most recent call last):File "D:\ipa_workspace\MinerU\Lib\site-packages\pip\_internal\cli\base_command.py", …...
基于SpringBoot+Vue的流浪猫狗救助救援网站(带1w+文档)
基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 该流浪猫狗救助救援网站在Windows平台下完成开发,采用java编程语言开发,将应用程序部署于Tomcat上,加之MySQL接口来实现交互式响应服…...
56_AOP
AOP使用案例 如何进行数据库和Redis中的数据同步?/ 你在项目的那些地方使用了aop?答:可以通过Aop操作来实现数据库和Redis中的数据同步。/ 通过Aop操作来实现数据库和Redis中的数据同步。可以定义一个切面类,通过对控制器下的所有…...
安装了h5py,使用报错ImportError: DLL load failed while importing _errors
使用pip 安装了h5py,但是运行代码报错; from . import _errorsImportError: DLL load failed while importing _errors: 找不到指定的程序。 原因: 可能和不正确安装h5py这个包有关系 解决: pip uninstall h5py 换成使用conda…...
BootStrap前端面试常见问题
在前端面试中,关于Bootstrap的问题通常围绕其基本概念、使用方式、特性以及实际应用等方面展开。以下是一些常见的问题及其详细解答: 1. Bootstrap是哪家公司研发的? 回答:Bootstrap是由Twitter的Mark Otto和Jacob Thornton合作…...
在linux运维中为什么第一道防线是云防火墙,而不是waf
在Linux运维和云计算环境中,第一道防线通常是云防火墙(Cloud Firewall),而不是Web应用防火墙(WAF),主要是因为云防火墙提供了更基础和广泛的网络层安全控制。以下是一些关键原因: 1…...
2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛
2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 2024.8.2 12:00————16:00 过题数790/1500 补题数943.33/1500 AB Problem Komorebi的数学课 次佛锅 Setsuna的K数列 Wiki下象棋 黄金律法 天气预报 叠硬币 AB Problem ag…...
多语言海外AEON抢单可连单加额外单源码,java版多语言抢单系统
多语言海外AEON抢单可连单加额外单源码,java版多语言抢单系统。此套是全新开发的java版多语言抢单系统。 后端java,用的若依框架,这套代码前后端是编译后的,测试可以正常使用,语言繁体,英文,日…...
文件上传——springboot大文件分片多线程上传功能,前端显示弹出上传进度框
一、项目搭建 创建 Spring Boot 项目: 创建一个新的 Spring Boot 项目,添加 Web 依赖。 添加依赖: 在 pom.xml 文件中添加以下依赖: <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId&…...
每日学术速递8.2
1.A Scalable Quantum Non-local Neural Network for Image Classification 标题: 用于图像分类的可扩展量子非局部神经网络 作者: Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接:https://arxiv.org/abs/2407.18906 摘要&#x…...
SAP-PLM创建物料主数据接口
FUNCTION zplm_d_0001_mm01. *"---------------------------------------------------------------------- *"*"本地接口: *" EXPORTING *" VALUE(EX_TOTAL) TYPE CHAR4 *" VALUE(EX_SUCCESSFUL) TYPE CHAR4 *" …...
超声波眼镜清洗机哪个品牌好?四款高性能超声波清洗机测评剖析
对于追求高生活质量的用户来说,眼镜的清洁绝对不能马虎。如果不定期清洁眼镜,时间久了,镜片的缝隙中会积累大量的灰尘和细菌,眼镜靠近眼部,对眼部健康有很大影响。在这种情况下,超声波清洗机显得尤为重要。…...
卸载Windows软件的正确姿势,你做对了吗?
前言 今天有小伙伴突然问我:她把软件都卸载了,但是怎么软件都还在运行? 这个问题估计很多小伙伴都是遇到过的,对于电脑小白来说,卸载Windows软件真的真的真的是一件很难的事情。所以,今天咱们就来讲讲&am…...
WEB前端14-Element UI(学生查询表案例/模糊查询/分页查询)
Vue2-Element UI 1.可重用组件的开发 可重用组件 我们一般将可重复使用的组件放在components目录之下,以便父组件的灵活调用 <!--可重用组件一般与css密切相关,使用可重用组件的目的是,将相似的组件放在一起,方便使用-->…...
使用swiftui自定义圆形进度条实现loading
实现的代码如下: // // LoadingView.swift // SwiftBook // // Created by Song on 2024/8/2. //import SwiftUIstruct LoadingView: View {State var process 0.5var body: some View {VStack(spacing: 20) {ZStack {Circle().stroke(.gray.opacity(0.3), lin…...
C# 设计模式之抽象工厂模式
总目录 前言 工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,…...
Javascript前端面试基础(八)
window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕 window.onload 触发时机:window.onload 事件会在整个页面…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
