week 3 - More on Collections - Lecture 3
一、Motivation
1. Java支持哪种类型的一维数据结构?
Java中用于在单一维度中存储数据的数据结构,如arrays or ArrayLists.
2. 如何在Java下创建一维数据结构?(1-dimensional data structure)
定义和初始化这些一维数据结构
int[] arr = new int[10];
int[] numbers = {1, 2, 3, 4, 5}; // 使用初始化语法创建并赋值
<Integer> list = new ArrayList<>();用于动态列表
3. 我们如何使用它们?如何maintain它们?
数组或列表中添加、删除或访问元素。
维数据结构主要包括对其进行动态管理和更新,包括扩展大小、添加新元素、删除元素、检查元素等操作
4. 我们可以在Java下迭代一维数据结构吗?
for或for-each这样的循环来遍历一维结构(如数组或列表)中的元素。
• 数组用于固定大小的数据存储,适用于已知大小且不需要频繁扩展的场景。
• ArrayList 用于动态大小的数据存储,适用于需要频繁修改数据的场景。
二、Menu
• Collections and List
• Using List and ArrayList
• Iterators
三、Comments on code style 代码风格的注释
1. 省略 this. 关键字
一般情况下,我们不需要在方法调用前加上 this.,除非在构造函数或方法内部需要明确区分实例变量和局部变量时才使用。
• 不推荐的写法:this.loadFromFile(fname);
• 推荐的写法:loadFromFile(fname);
• Explanation: 在 Java 中,如果没有命名冲突,通常不需要使用 this 关键字来调用实例方法或访问实例变量。
2. 省略包含单一语句的花括号 {}
如果 if、while 等控制语句只包含一个语句,那么可以省略 {},使代码更加简洁。
• 不推荐的写法:
while (i < name.length) {
name[i] = null;
}
• 推荐的写法:
while (i < name.length)
name[i] = null;
四、集合类型 (Collection Types)
Java 集合框架 的接口和类的层次结构,并展示了如何使用它们来处理数据。
1. 接口
Collection 是一个通用接口,表示一个元素集合,所有 Java 集合框架的实现都继承自该接口。
List 是 Collection 接口的子接口,表示一种有序集合,允许重复的元素。
2. 类
ArrayList 和 LinkedList 是实现了 List 接口的具体类,分别基于动态数组和链表结构。
3. 接口的继承关系
• List 继承自 Collection,并且它实现了多种有序的集合操作。例如,ArrayList<E> 是基于动态数组实现的,而 LinkedList<E> 是基于链表实现的。
4. 子接口扩展
• 子接口(如 List)会继承父接口(如 Collection)的方法,并且可以添加自己的特有方法。
The sub interface has all the methods of the super interface
五、Methods on Collection and List
1. Collection 接口中的方法
• isEmpty(): 判断集合是否为空,返回 boolean 类型。
• size(): 返回集合中元素的个数,返回 int 类型。
• contains(E elem): 判断集合中是否包含指定元素,返回 boolean 类型。
• add(E elem): 向集合中添加元素,返回 boolean 类型,表示是否成功添加。
• remove(E elem): 移除集合中的指定元素,返回 boolean 类型,表示是否成功移除。
• iterator(): 返回一个迭代器对象,用于遍历集合中的元素。
// 获取 Iterator 对象
Iterator<String> iterator = list.iterator();
// 使用迭代器遍历元素
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
Iterator 接口 定义了三个常用方法:
1. hasNext():检查是否还有下一个元素。
2. next():获取下一个元素。
3. remove():删除当前元素(可选操作)。
2. List 接口中的方法
E 代表的是 “元素”(Element)的泛型类型参数。它是一个通用的类型参数,通常用于表示集合中存储的对象类型。比如,List<E> 就表示 一个可以存储任意类型元素的列表
• add(int index, E elem): 在指定位置 index 插入元素 elem。
• remove(int index): 移除指定位置的元素,返回被移除的元素。
• get(int index): 获取指定位置的元素,返回该元素。
• set(int index, E elem): 替换指定位置的元素,返回被替换的元素。
• indexOf(E elem): 返回指定元素在列表中的位置(索引),如果元素不存在则返回 -1。
• subList(int from, int to): 返回一个新的子列表,从 from 索引到 to 索引之间的元素。
六、使用集合类型 (Using a collection type)
1. 声明集合类型变量
变量或字段应声明为接口类型,而不是具体实现类。这是为了使代码更加灵活,可以随时更换具体的实现类(例如从 ArrayList 切换到 LinkedList)。
List 是一个接口,代表有序集合,它有多个具体的实现类,如 ArrayList 和 LinkedList。当你声明一个集合类型时,最好使用接口类型(例如 List),而不是具体的实现类(例如 ArrayList 或 LinkedList)。
• 示例:The type between “<“ and “>” is the type of the elements
// 声明为 List 接口类型,具体实现可以是 ArrayList 或 LinkedList
private List<Task> tasks;
// 创建具体实现对象时,可以选择不同的实现类
tasks = new ArrayList<Task>(); // 使用 ArrayList 实现
// 或者
tasks = new LinkedList<Task>(); // 使用 LinkedList 实现
这里的 List<Task> 表示任务的集合,Task 是任务对象的类型。
2. 创建集合对象
使用实现了集合接口的类来创建对象。比如,通过 ArrayList 或 LinkedList 来实现 List 接口。
• 示例:
tasks = new ArrayList<Task>();
• 这行代码创建了一个 ArrayList 类型的 tasks 集合,存储 Task 类型的元素。
3. 操作集合中的元素
• 一旦创建了集合对象,就可以调用集合方法来访问或修改集合中的元素,例如:
• add() 用于添加元素,
• remove() 用于删除元素,
• get() 用于获取元素等。
七、Example
1. TodoList – 任务的集合
• TodoList 是一个任务集合,用于按顺序管理需要完成的任务。任务按照它们应该完成的顺序存储在集合中。
集合的类型是 List,其中 Task 是任务对象的类型。
Collection type: List of tasks
2. TodoList 的要求
• 从文件中读取任务列表: 可以通过文件存储任务,并从中读取任务列表。
• 显示所有任务: 提供一个方法来显示当前所有的任务,确保任务列表是清晰的。
• 添加任务: 可以在列表的末尾添加新任务,或者在指定的位置插入任务。
• 删除任务: 从列表中删除指定的任务。
• 移动任务: 将任务从一个位置移动到另一个位置,确保任务按顺序执行。
实现了 ActionListener 接口的 TodoList 类。它的作用是从文件中读取任务列表并存储在 List<Task> 类型的集合中
public class TodoList implements ActionListener{
private List<Task> tasks;
public void readTasks(String fname){
try {
Scanner sc = new Scanner(new File(fname));
tasks = new ArrayList<Task>();
while ( sc.hasNext() )
tasks.add(new Task(sc.next()));
sc.close();
} catch(IOException e){…}
displayTasks();
}
askTask() 和 askIndex() 方法用于向用户询问任务内容或索引值。
3. Iterator 在 Java 中的应用
(1) for-each 循环转为 Iterator:
for (Task task : tasks){
textArea.append(task + "\n");
for-each 循环 本质上是 Iterator 的一种简化写法。
Iterator<Task> iter = tasks.iterator();
while (iter.hasNext()) {
Task task = iter.next();
textArea.append(task + "\n");
}
(2) Iterator 接口:
• Iterator 接口有两个主要方法:
• hasNext():检查是否有下一个元素。
• next():返回下一个元素。
public interface Iterator<E> {
public boolean hasNext();
public E next();
}
使用 Iterator 遍历 List<String> 中的元素。
for ( String str : items) System.out.print(str + “, “);
Iterator<String> iter = items.iterator();
while (iter.hasNext()){
String str = iter.next();
System.out.print(str + “, “);
}
八、List 与数组(Array)的对比
1. List 的优势:
• 没有大小限制,可以根据需要自动增长。
• 提供了很多内置方法,如 add()、get()、remove() 等,操作更加方便。
2. 数组的局限性:
• 数组大小固定,不能动态扩展。如果需要改变数组的大小,必须创建新的数组。
• 数组操作比较麻烦,尤其是需要处理元素的添加、删除时,必须手动处理大小和位置的变动。
相关文章:

week 3 - More on Collections - Lecture 3
一、Motivation 1. Java支持哪种类型的一维数据结构? Java中用于在单一维度中存储数据的数据结构,如arrays or ArrayLists. 2. 如何在Java下创建一维数据结构?(1-dimensional data structure) 定义和初始化这些一…...
Pwntools 的详细介绍、安装指南、配置说明
Pwntools:Python 开源安全工具箱 一、Pwntools 简介 Pwntools 是一个由 Security researcher 开发的 高效 Python 工具库,专为密码学研究、漏洞利用、协议分析和逆向工程设计。它集成了数百个底层工具的功能,提供统一的 Python API 接口&am…...

PLC(电力载波通信)网络机制介绍
1. 概述 1.1 什么是PLC 电力载波通讯即PLC,是英文Power line Carrier的简称。 电力载波是电力系统特有的通信方式,电力载波通讯是指利用现有电力线,通过载波方式将模拟或数字信号进行高速传输的技术。最大特点是不需要重新架设网络…...

Qt监控系统远程回放/录像文件远程下载/录像文件打上水印/批量多线程极速下载
一、前言说明 在做这个功能的时候,着实费了点心思,好在之前做ffmpeg加密解密的时候,已经打通了极速加密保存文件,主要就是之前的类中新增了进度提示信号,比如当前已经处理到哪个position位置,发个信号出来…...
自学微信小程序的第八天
DAY8 1、使用动画API即可完成动画效果的制作,先通过wx.createAnimation()方法获取Animation实例,然后调用Animation实例的方法实现动画效果。 表40:wx.createAnimation()方法的常用选项 选项 类型 说明 duration number 动画持续时间,单位为毫秒,默认值为400毫秒 timing…...

【java】@Transactional导致@DS注解切换数据源失效
最近业务中出现了多商户多租户的逻辑,所以需要分库,项目框架使用了mybatisplus所以我们自然而然的选择了同是baomidou开发的dynamic.datasource来实现多数据源的切换。在使用初期程序运行都很好,但之后发现在调用com.baomidou.mybatisplus.ex…...
003 SpringBoot集成Kafka操作
4.SpringBoot集成Kafka 文章目录 4.SpringBoot集成Kafka1.入门示例2.yml完整配置3.关键配置注释说明1. 生产者优化参数2. 消费者可靠性配置3. 监听器高级特性4. 安全认证配置 4.配置验证方法5.不同场景配置模板场景1:高吞吐日志收集场景2:金融级事务消息…...

Android SystemUI开发(一)
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUI.java frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java 关键文件 SystemUI 关键服务 简介 Dependency.class:处理系统依赖关系,提供资源或服…...

C#贪心算法
贪心算法:生活与代码中的 “最优选择大师” 在生活里,我们常常面临各种选择,都希望能做出最有利的决策。比如在超市大促销时,面对琳琅满目的商品,你总想用有限的预算买到价值最高的东西。贪心算法,就像是一…...

Vue程序下载
Vue是一个基于JavaScript(JS)实现的框架,想要使用它,就得先拿到Vue的js文件 Vue官网 Vue2:Vue.js Vue3:Vue.js - 渐进式 JavaScript 框架 | Vue.js 下载并安装vue.js 第一步:打开Vue2官网&a…...

【UCB CS 61B SP24】Lecture 17 - Data Structures 3: B-Trees学习笔记
本文以 2-3-4 树详细讲解了 B 树的概念,逐步分析其操作,并用 Java 实现了标准的 B 树。 1. 2-3 & 2-3-4 Trees 上一节课中讲到的二叉搜索树当数据是随机顺序插入的时候能够使得树变得比较茂密,如下图右侧所示,时间复杂度也就…...

机器学习决策树
一、香农公式 熵: 信息增益: 信息增益信息熵-条件熵 前者是初始信息熵大小,后者是因为条件加入后带来的确定性增加 信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度 信息增益越大说明影响越大 二、代码 ""&…...
Spring Boot + MyBatis 实现 RESTful API 的完整流程
后端开发:Spring Boot 快速开发实战 引言 在现代后端开发中,Spring Boot 因其轻量级、快速开发的特性而备受开发者青睐。本文将带你从零开始,使用 Spring Boot MyBatis 实现一个完整的 RESTful API,并深入探讨如何优雅地处理异…...
通过 ANSYS Discovery 进行 CFD 分析,增强工程设计
概括 工程师使用计算流体动力学 (CFD) 分析来研究和优化各种应用中的流体流动和传热分析。ANSYS Discovery 是一个用户友好的软件平台,使工程师能够轻松设置和解决 CFD 模型,并能够通知设计修改 在这篇博文中,我们将重点介绍在 Ansys Disc…...

家用可燃气体探测器——家庭燃气安全的坚实防线
随着社会的发展和变迁,天然气为我们的生活带来了诸多便利,无论是烹饪美食,还是温暖取暖,都离不开它的支持。然而,燃气安全隐患如影随形,一旦发生泄漏,可能引发爆炸、火灾等严重事故,…...

ListControl双击实现可编辑
为Edit Control控件添加丢失输入焦点事件,可见设为false 为List Control控件添加双击事件 控件和成员变量之间交换数据 CListCtrl ListPrint1; //列表输出 CEdit...

ave-form.vue 组件中 如何将产品名称发送给后端 ?
如何将产品名称发送给后端。 在这段代码中,产品名称(productName)的处理和发送主要发生在 save() 方法中。让我逐步分析: 产品ID的选择: <w-form-selectv-model"form.productId"label"涉及产品&q…...

DeepSeek行业应用实践报告-智灵动力【112页PPT全】
DeepSeek(深度搜索)近期引发广泛关注并成为众多企业/开发者争相接入的现象,主要源于其在技术突破、市场需求适配性及生态建设等方面的综合优势。以下是关键原因分析: 一、技术核心优势 开源与低成本 DeepSeek基于开源架构…...

【Markdown 语法简洁讲解】
Markdown 语法简洁语法讲解 什么是 Markdown1. 标题2. 列表3.文本样式4. 链接与图片5. 代码6. 表格7. 分割线8. 流程图9. 数学公式10. 快捷键11. 字体、字号与颜色 什么是 Markdown Markdown 是一种轻量级标记语言,通过简单的符号实现排版格式化,专注于…...

250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示
A. 最终效果 B. 火山方舟配置(一定要点击添加) C. 硅基流动配置(最好要点击添加,否则会自动弹出所有模型) D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 设置步骤: 在Functions函…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...