Lecture 11 - List,Set,Map

List, Set and Map are all interfaces: they define how these respective types 

work, but they don’t provide implementation code

overview

1. List(列表):

(1) 创建、访问和操作列表:ArrayList 和 LinkedList。

Creating, accessing, and manipulating a list (两种实现List接口的具体类)

(2) 在方法中使用列表,或作为类的实例变量使用。

Using lists in methods and as instance variables in a class.

2. Set 和 Map(集合与映射): 它们的特性 (Characteristics)及操作方法(operations),并用于解决实际问题。

一、Array Deficiencies

数组的局限性

静态大小:数组需要在声明时定义大小(size),无法动态扩展(grow arbitrarily)。

二、Java Collections Framework

Java 集合框架

集合框架(Collections Framework)是Java编程语言中一个库,它提供了一套接口和类,用于存储和操作对象集合。通过集合框架,程序员可以更方便地处理数据集合

 提供更强大灵活的工具管理对象集合(object collections),包括:

 List(列表):有序集合,允许重复元素。

 Set(集合):无序集合,元素唯一。

 Map(映射):键值对集合,用于快速查找。

三、 列表(List)

1. 特点

• 列表是一种有序集合(collection of objects),允许重复元素。

• 大小可以动态增减,无需提前定义大小。

grow or shrink dynamically to accommodate their contents

都是 List 接口的实现,提供相同的操作,但底层机制不同:

 ArrayList:基于数组实现,适合频繁读取。 quick access and random reads.

 LinkedList:基于链表实现,适合频繁插入和删除操作。frequent insertions and deletions.

2. Creating Lists

创建方式

泛型类型(Generic Type):

• 列表可以通过泛型 <Type> 来定义存储的数据类型。

泛型类型在尖括号 < > 中声明,确保类型安全。

List<String> list1 = new ArrayList<>();
List<String> list2 = new LinkedList<>();

如果左侧和右侧泛型类型相同,右侧的泛型声明可以省略。

List<String> list1 = new ArrayList<>();
List<String> list2 = new LinkedList<>();

将 ArrayList 替换为 LinkedList 不会导致代码出错。

List<String> list1 = new ArrayList<>();
// Later, replace it with:
List<String> list1 = new LinkedList<>(); 

3. List Operations

4. List 与 ArrayList

 List 是接口(Interface):

• 定义了一组操作(specifies the operationsthat a List must provide),但不能直接通过 new 实例化。

• 需要通过实现该接口的具体类(如 ArrayList 或 LinkedList)来创建实例。

5. Object type / generic type parameter

Object 类型与泛型参数

(1) 泛型限制

• List 是为对象类型(object types)设计的,不能直接存储基本数据类型(primitive types)

 primitive types (lowercase, abbreviated) has an 

equivalent object type (capitalized, fully spelled out)

• 需要使用包装类(Wrapper Class)来替代基本数据类型:

• int → Integer

• double → Double

 (2)自动装箱(Autoboxing)

• Java 会自动将基本类型转换为其对应的包装类。

List<Integer> list = new ArrayList<>();
list.add(10);  // 自动将 int 类型的 10 转为 Integer

(3)自动拆箱(Unboxing)

• Java 会自动将包装类转换回基本类型。

int value = list.get(0);  // 自动将 Integer 转为 int

(4)泛型的作用

• 确保类型安全,避免运行时类型转换错误。

• 泛型通过(angle brackets)尖括号 <> 定义类型。

6. ArrayList 与 LinkedList 比较

(1)ArrayList(动态数组)

• 底层基于动态数组,适合频繁访问元素。

• 插入和删除元素较慢(需要移动其他元素)。

(2) LinkedList(双向链表)

• 底层基于链表,适合频繁插入和删除操作。

• 访问元素较慢(需要从头开始遍历)。

7. Iterate through List

(1)enhanced for loops​​​​​​​

• 用于遍历集合中的每个元素

for (int x : list) {

    System.out.print(x + " ");

}

(2)Demo examples

• 找出列表中的最大值:

int max = Integer.MIN_VALUE;

for (int x : list) {

    if (x > max) {

        max = x;

    }

}

System.out.println(max);

操作文件:

• 读取文件内容,并将结果存储到 List 中。

takes a file name and returns

a List of Student objects generated from the file!

the file contains names of the Student

public static List<Student> readFile(String fileName) { 

        File file = new File(fileName);\\创建了一个指向名为 fileName 的文件的 File 对象

        List<Student> list = new ArrayList<>();

        try {

                Scanner input = new Scanner(file); 

                while (input.hasNextLine()) {

                        String name = input.nextLine();

                        Student student = new Student(name);

                        list.add(student);

                    } 

                input.close(); 

        } catch (IOException ioe) {

                System.out.println(ioe.getMessage());

        } 

        return list;

}

创建 File 对象

1. 封装文件的路径和引用,告诉程序要读取哪个文件。

2. 配合 Scanner 类读取文件内容,因为 Scanner 需要一个具体的文件对象。

存储对象:

• 使用 List 存储对象(如游戏中的角色、学生列表等)。

二、Set and Map

1. Characteristics and Operations of Set

(1) 特性:元素无序且唯一。

(2) 实现:HashSet 和 TreeSet。

• 操作包括:添加(add)、移除(remove)、联合(addAll)、交集(retainAll)和差集(removeAll)。

2. Iterate through Set

enhanced for loops/for each loop to iterate through a Set

public static void main(String[] args) {

        Set<String> set = new HashSet<>();

        set.add("B");

        set.add("C");

        set.add("A");

        System.out.println(set);

        for (String string : set) {

                System.out.println(string);

        }

}

3. Set Operations 

(1)Creating set from list or other set, union, test containment, intersection:

如果直接对 set1 调用 retainAll,set1 中的元素会被修改成与 set3 的交集 

addAll 将列表中的元素逐一添加到集合 set1:

• addAll 方法不会将整个列表作为单一对象添加,而是把列表中的每个元素(这里是 1 和 3)逐一添加到 set1 中。

addAll 方法不能直接传入数组,因为它期望的参数是一个实现了 Collection 接口的对象,而数组是 Java 的基本类型结构,不是 Collection 的子类。

Arrays.asList(1, 3);
Arrays.asList(new Integer[] {1, 3});

• 当你写 Arrays.asList(1, 3) 时:

• Java 会自动把 1 和 3 作为变长参数处理,并创建一个数组。

• 然后,Arrays.asList() 会基于这个数组返回一个 List 对象。

new ArrayList<>() 本质是构造一个空列表,不能直接传元素。如果你需要直接初始化带有元素的列表,推荐使用 Arrays.asList()

List<Integer> list = new ArrayList<>();
list.add(1); // 手动添加元素
list.add(2);
System.out.println(list); // 输出: [1, 2] 

List<Integer> list = new ArrayList<>(10); // 初始容量为10

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); // 初始化带有元素
System.out.println(list); // 输出: [1, 2, 3]

(2)Set difference and remove an element

 

2. Map 的特性和操作

Characteristics and Operations of Map

• 特性:以键值对(key-value pairs)形式存储,键唯一。

Map 的别名:

• 在其他编程语言中,Map 也称为字典 (dictionary) 或符号表 (symbol table)。

Map 的实现类型:

• TreeMap:基于红黑树实现,键按自然顺序或比较器排序。

• HashMap:基于哈希表实现,提供快速的插入和查找(无序)。

• LinkedHashMap:有序哈希表,保持插入顺序。

3. Map Operations

操作包括:添加映射(put)、获取值(get)、移除键值对(remove)、检查键或值(containsKey/containsValue)。

4. Map 应用:统计单词频率

Suppose we have a list of strings of multiple duplicate words, such as

["a", "b", "a", "c", "b", "word", "a", "word"]

 We want to find out which words appear in the list and how many times each one 

appears

import java.util.HashMap;

import java.util.Map;

public class NumWords {

        public Map<String, Integer> wordCount(List<String> list) {

                Map<String, Integer> map = new HashMap<>();

                int num;

                for (String word : list) {

                        if (!map.containsKey(word)) {

                                map.put(word, 1);

                        }

                        else {                

                                num = map.get(word);

                                map.put(word, num + 1);

                        }

                }

                return map;

        }

}

1. 遍历到 "a",map 不包含 "a",添加:{"a": 1}。

2. 遍历到 "b",map 不包含 "b",添加:{"a": 1, "b": 1}。

3. 遍历到第二个 "a",map 包含 "a",更新计数:{"a": 2, "b": 1}。

4. 遍历到 "c",map 不包含 "c",添加:{"a": 2, "b": 1, "c": 1}。

{"a": 3, "b": 2, "c": 1, "word": 2}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35476.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ElfBoard开源项目|基于百度智能云平台的车牌识别项目

本项目基于百度智能云平台&#xff0c;旨在利用其强大的OCR服务实现车牌号码的自动识别。选择百度智能云的原因是其高效的API接口和稳定的服务质量&#xff0c;能够帮助开发者快速实现车牌识别应用。 本项目使用摄像头捕捉图像后&#xff0c;通过集成百度OCR服务的API&#xf…

应对超声波测试挑战,如何选择合适的数字化仪?

一、数字化仪的超声波应用 超声波是频率大于人类听觉范围上限的声学声压&#xff08;声学&#xff09;波。超声波设备的工作频率为20 kHz至几千MHz。表1总结了一些更常见的超声波应用的特征。 每个应用中使用的频率范围都反映了实际情况下的平衡。提高工作频率可以通过提高分…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…

Flink学习连载文章11--双流Join

双流 Join 和两个流合并是不一样的 两个流合并&#xff1a;两个流变为 1 个流 union connect 双流 join: 两个流 join&#xff0c;其实这两个流还是原来的&#xff0c;只是满足条件的数据会变为一个新的流。 可以结合 sql 语句中的 union 和 join 的区别。 在离线 Hive 中&…

vue3+wangeditor富文本编辑器详细教程

一、前言 在这篇教程中&#xff0c;我将指导如何使用 Vue 3 和 WangEditor 创建一个功能丰富的富文本编辑器。WangEditor 是一个轻量级的富文本编辑器&#xff0c;它非常适合集成到 Vue 项目中。这个例子展示了如何配置富文本编辑器&#xff0c;包括工具栏、编辑器配置以及如何…

Python学习39天

my_tools.py文件提供工具函数 """ 此文件编写工具函数&#xff0c;供程序员使用 my_tools """def read_confirm_select():"""让用户输入&#xff1a;Y/N&#xff0c;不区分大小写&#xff0c;将用户输入值转为小写返回&#xff…

LCA - Lowest Common Ancestor

LCA - Lowest Common Ancestor https://www.luogu.com.cn/problem/SP14932 题目描述 A tree is an undirected graph in which any two vertices are connected by exactly one simple path. In other words, any connected graph without cycles is a tree. - Wikipedia T…

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function

发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…

恒创科技:如何区分网站的域名主机名

如何区分网站的域名主机名?它们都是网址机制的一部分&#xff0c;当你在地址栏输入它们&#xff0c;就能访问互联网上想去的地方。你可曾思考过主机名和域名的区别呢? 简单来说&#xff0c;域名就像网址&#xff0c;而主机名用于标识网络中的设备。不过&#xff0c;这只是表面…

【技巧学习】ArcGIS如何计算水库库容量?

ArcGIS如何计算水库库容量? 一、数据获取 DEM数据来源于地理空间数据云&#xff0c;该网站是由中科院计算机网络信息中心于2008年创立的地学大数据平台。 二、填洼 将DEM数据中凹陷的区域填充至与倾斜点同样高度&#xff0c;这里的【Z限制】说的是设定一个特定的值&#x…

机器学习——感知机模型

文章目录 前言1.感知机模型介绍1.1基本概念1.2数学表达1.3几何解释1.4优缺点 2.二分类应用2.1应用介绍2.2准备数据集2.2.1环境检查2.2.2数据集介绍2.2.3获取数据2.2.4划分数据集 2.3可视化训练集2.4训练过程2.4.1首轮梯度下降2.4.2多轮梯度下降 2.5可视化分类结果2.6在验证集验…

11.20[JAVAEXP3]重定向细究【DEBUG】

设置了根域名访问为testServlet,让他重定向到首页为test.jsp&#xff0c;事实上也都触发了&#xff0c;但是最后显示的为什么不是test.jsp生成页面&#xff0c;依然还是index.jsp生成的页面&#xff1f;&#xff1f; 重定向是通过Dispatcher进行的&#xff0c;而不是sendRedir…

YOLOv11模型改进-注意力-引入卷积和注意力融合模块(CAFM) 提升小目标和遮挡检测

本篇文章将介绍一个新的改进机制——卷积和注意力融合模块CAFM&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。首先&#xff0c;CAFM是为了融合卷积神经网络&#xff08;CNNs&#xff09;和 Transformer 的优势&#xff0c;同时对全局和局部特征进行…

APM装机教程(五):测绘无人船

文章目录 前言一、元生惯导RTK使用二、元厚HXF260测深仪使用三、云卓H2pro遥控器四、海康威视摄像头 前言 船体&#xff1a;超维USV-M1000 飞控&#xff1a;pix6c mini 测深仪&#xff1a;元厚HXF160 RTK&#xff1a;元生惯导RTK 遥控器&#xff1a;云卓H12pro 摄像头&#xf…

基于MinIO打造高可靠分布式“本地”文件系统

MinIO是一款高性能的对象存储服务&#xff0c;而S3协议是由亚马逊Web服务&#xff08;AWS&#xff09;制定的一种标准协议&#xff0c;用于云存储服务之间的数据交换。MinIO与S3协议的关系在于&#xff0c;MinIO实现了S3协议的接口&#xff0c;这意味着用户可以使用与AWS S3相同…

Luma 视频生成 API 对接说明

Luma 视频生成 API 对接说明 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平…

基础算法——搜索与图论

搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法&#xff08;朴素版&#xff09;2.2、Dijkstra算法&#xff08;堆优化版&#xff09;2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…

Online Monocular Lane Mapping

IROS 2023 港科大 文章链接&#xff1a;http://arxiv.org/abs/2307.11653 github&#xff1a;GitHub - HKUST-Aerial-Robotics/MonoLaneMapping: Online Monocular Lane Mapping Using Catmull-Rom Spline (IROS 2023) 动机 摆脱高精地图&#xff0c;使用车端的传感器来实现车端…

29.两数相除 python

两数相除 题目题目描述示例 1:示例 2:提示&#xff1a;题目链接 题解解题思路python实现代码解释提交结果 题目 题目描述 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#x…