JavaSE学习笔记26-集合(Collection)
集合
Java 中的集合(Collection)是 Java 标准库中非常重要的一部分,用于存储和操作一组对象。Java 集合框架(Java Collections Framework)提供了一套丰富的接口和类,用于处理各种数据结构,如列表、集合、队列、映射等。以下是 Java 集合框架的详细介绍:
1. 集合框架的核心接口
Java 集合框架的核心接口位于 java.util 包中,主要包括以下几种:
(1) Collection 接口
-
是所有集合类的根接口。
-
定义了集合的基本操作,如添加、删除、遍历等。
-
主要子接口:
-
List:有序集合,允许重复元素。 -
Set:无序集合,不允许重复元素。 -
Queue:队列,遵循先进先出(FIFO)或优先级规则。
-
(2) Map 接口
-
存储键值对(key-value pairs)。
-
键不允许重复,值可以重复。
-
主要实现类:
-
HashMap:基于哈希表实现,无序。 -
TreeMap:基于红黑树实现,键有序。 -
LinkedHashMap:基于哈希表和链表实现,保持插入顺序。
-
2. 常用集合类
以下是 Java 集合框架中常用的实现类:
(1) List 接口的实现类
-
ArrayList:-
基于动态数组实现。
-
支持快速随机访问,但插入和删除元素较慢。
-
线程不安全。
-
-
LinkedList:-
基于双向链表实现。
-
插入和删除元素较快,但随机访问较慢。
-
可以用作队列或栈。
-
-
Vector:-
类似于
ArrayList,但线程安全。 -
性能较低,通常不推荐使用。
-
(2) Set 接口的实现类
-
HashSet:-
基于哈希表实现。
-
无序,不允许重复元素。
-
性能较高。
-
-
TreeSet:-
基于红黑树实现。
-
元素有序(自然顺序或自定义顺序)。
-
性能略低于
HashSet。
-
-
LinkedHashSet:-
基于哈希表和链表实现。
-
保持插入顺序。
-
(3) Queue 接口的实现类
-
LinkedList:-
可以用作队列或双端队列。
-
-
PriorityQueue:-
基于堆实现。
-
元素按优先级排序。
-
(4) Map 接口的实现类
-
HashMap:-
基于哈希表实现。
-
键无序,性能较高。
-
-
TreeMap:-
基于红黑树实现。
-
键有序。
-
-
LinkedHashMap:-
基于哈希表和链表实现。
-
保持插入顺序或访问顺序。
-
3. 集合的常用操作
以下是集合的常见操作示例:
(1) List 示例
import java.util.ArrayList;
import java.util.List;public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Cherry");// 遍历列表for (String fruit : list) {System.out.println(fruit);}// 获取元素System.out.println("第一个元素: " + list.get(0));// 删除元素list.remove("Banana");System.out.println("删除后的列表: " + list);}
}
(2) Set 示例
import java.util.HashSet;
import java.util.Set;public class SetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("Apple");set.add("Banana");set.add("Cherry");// 尝试添加重复元素set.add("Apple");// 遍历集合for (String fruit : set) {System.out.println(fruit);}}
}
(3) Map 示例
import java.util.HashMap;
import java.util.Map;public class MapExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("Apple", 10);map.put("Banana", 20);map.put("Cherry", 30);// 遍历映射for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}// 获取值System.out.println("Apple 的数量: " + map.get("Apple"));}
}
4. 集合的线程安全性
-
大多数集合类(如
ArrayList、HashMap)是线程不安全的。 -
如果需要线程安全的集合,可以使用以下方式:
-
Collections.synchronizedList():将List转换为线程安全的集合。 -
Vector:线程安全的List实现(不推荐使用)。 -
ConcurrentHashMap:线程安全的Map实现。 -
CopyOnWriteArrayList:线程安全的List实现。
-
5. 集合的排序
-
自然排序:
-
集合中的元素必须实现
Comparable接口。 -
例如:
TreeSet和TreeMap会自动对元素进行排序。
-
-
自定义排序:
-
使用
Comparator接口实现自定义排序规则。 -
例如:
Collections.sort(list, comparator)。
-
6. 集合的性能比较
| 集合类 | 实现方式 | 随机访问 | 插入/删除 | 线程安全 | 有序性 |
|---|---|---|---|---|---|
ArrayList | 动态数组 | 快 | 慢 | 不安全 | 插入顺序 |
LinkedList | 双向链表 | 慢 | 快 | 不安全 | 插入顺序 |
HashSet | 哈希表 | - | 快 | 不安全 | 无序 |
TreeSet | 红黑树 | - | 中等 | 不安全 | 有序 |
HashMap | 哈希表 | 快 | 快 | 不安全 | 无序 |
TreeMap | 红黑树 | 中等 | 中等 | 不安全 | 有序 |
练习代码1-平均气温
输入周一到周日七天的温度,输出这周的平均温度,这周温度最高的是哪天,最低的是哪天
使用List接口的ArrayList来存储最高和最低气温
package com.chao.array;
import java.util.*;//输入一周的气温,求平均气温,哪些天大于平均气温,哪些天小于平均气温
public class AverageTemperature {public static void main(String args[ ]) {//声明用到的变量int count;double sum,average;sum=0;double [ ]temperature=new double[7];//创建一个 Scanner 类的对象,用它来获得用户的输入Scanner sc=new Scanner(System.in);System.out.println("请输入七天的温度(从周一到周日):");for(count=0;count<temperature.length;count++){System.out.print(getDayOfWeek(count + 1) + "的气温:");//读取用户输入temperature[count]=sc.nextDouble();sum+=temperature[count];}average=sum/7;System.out.println("本周的平均气温为:"+average);//寻找最高和最低气温的天数double maxTemp = temperature[0];//最高气温double minTemp = temperature[0];//最低气温List<String> maxDays = new ArrayList<>();maxDays.add("周一");List<String> minDays = new ArrayList<>();minDays.add("周一");for (int i = 0; i < temperature.length; i++) {double current = temperature[i];//处理最高气温if (current > maxTemp) {maxTemp = current;maxDays.clear();maxDays.add(getDayOfWeek(i + 1));} else if (current == maxTemp) {maxDays.add(getDayOfWeek(i + 1));}//处理最低气温if (current < minTemp) {minTemp = current;minDays.clear();minDays.add((getDayOfWeek(i + 1)));} else if (current == minTemp) {minDays.add(getDayOfWeek(i + 1));}}//输出最高气温的天数System.out.print("最高气温出现在:");for (int i = 0; i < maxDays.size(); i++) {if (i > 0) {System.out.println("、");}System.out.println(maxDays.get(i));}
// System.out.println();// 输出最低气温的天数System.out.print("最低气温出现在:");for (int i = 0; i < minDays.size(); i++) {if (i > 0) {System.out.print("、");}System.out.print(minDays.get(i));}System.out.println();//比较各天气温与平均气温for (count = 0; count < temperature.length; count++) {String dayOfWeek = getDayOfWeek(count + 1);if (temperature[count] < average)System.out.println(dayOfWeek + "的气温低于平均气温");else if (temperature[count] > average)System.out.println(dayOfWeek + "的气温高于平均气温");elseSystem.out.println(dayOfWeek + "的气温等于平均气温");}}// 根据天数返回星期几private static String getDayOfWeek(int day) {switch (day) {case 1:return "周一";case 2:return "周二";case 3:return "周三";case 4:return "周四";case 5:return "周五";case 6:return "周六";case 7:return "周日";default:return "";}}
}
代码整体功能
这段代码的主要功能是:
-
输入一周七天的气温(从周一到周日)。
-
计算平均气温。
-
找出最高气温和最低气温对应的天数。
-
比较每一天的气温与平均气温,输出哪些天高于、低于或等于平均气温。
-
输出结果,包括平均气温、最高气温和最低气温对应的天数,以及每一天的气温比较结果。
代码结构
代码分为以下几个部分:
-
变量声明和初始化。
-
输入气温数据。
-
计算平均气温。
-
寻找最高气温和最低气温。
-
输出结果。
-
辅助方法
getDayOfWeek。
详细解释
1. 变量声明和初始化
int count;
double sum, average;
sum = 0;
double[] temperature = new double[7];
-
count:用于循环计数。 -
sum:用于累加七天气温的总和。 -
average:用于存储平均气温。 -
temperature:一个长度为7的数组,用于存储每天的气温(从周一到周日)。
2. 输入气温数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入七天的温度(从周一到周日):");for (count = 0; count < temperature.length; count++) {System.out.print(getDayOfWeek(count + 1) + "的气温:");temperature[count] = sc.nextDouble();sum += temperature[count];
}
-
Scanner sc = new Scanner(System.in):创建一个Scanner对象,用于从控制台读取用户输入。 -
System.out.println("请输入七天的温度(从周一到周日):"):提示用户输入七天的气温。 -
for循环:-
循环7次(
temperature.length为7),依次输入每天的气温。 -
getDayOfWeek(count + 1):调用辅助方法getDayOfWeek,将天数(1到7)转换为星期几(如“星期一”)。 -
System.out.print(getDayOfWeek(count + 1) + "的气温:"):动态生成每一天的输入提示(如“星期一的气温:”)。 -
temperature[count] = sc.nextDouble():读取用户输入的气温,并存储到temperature数组中。 -
sum += temperature[count]:累加每天的气温,用于后续计算平均气温。
-
3. 计算平均气温
average = sum / 7;
System.out.println("平均气温为:" + average);
-
average = sum / 7:计算七天的平均气温。 -
System.out.println("平均气温为:" + average):输出平均气温。
4. 寻找最高气温和最低气温
double maxTemp = temperature[0];
double minTemp = temperature[0];
List<String> maxDays = new ArrayList<>();
maxDays.add(getDayOfWeek(1));
List<String> minDays = new ArrayList<>();
minDays.add(getDayOfWeek(1));for (int i = 1; i < temperature.length; i++) {double current = temperature[i];// 处理最高气温if (current > maxTemp) {maxTemp = current;maxDays.clear();maxDays.add(getDayOfWeek(i + 1));} else if (current == maxTemp) {maxDays.add(getDayOfWeek(i + 1));}// 处理最低气温if (current < minTemp) {minTemp = current;minDays.clear();minDays.add(getDayOfWeek(i + 1));} else if (current == minTemp) {minDays.add(getDayOfWeek(i + 1));}
}
-
maxTemp和minTemp:分别用于存储最高气温和最低气温的初始值(初始值为第一天的气温)。 -
maxDays和minDays:分别用于存储最高气温和最低气温对应的天数(星期几)。 -
for循环:-
从第二天开始遍历气温数组。
-
处理最高气温:
-
如果当前气温
current大于maxTemp,则更新maxTemp,并清空maxDays列表,将当前天数加入列表。 -
如果当前气温等于
maxTemp,则将当前天数加入maxDays列表。
-
-
处理最低气温:
-
如果当前气温
current小于minTemp,则更新minTemp,并清空minDays列表,将当前天数加入列表。 -
如果当前气温等于
minTemp,则将当前天数加入minDays列表。
-
-
5. 输出结果
// 输出最高气温的天数
System.out.print("最高气温出现在:");
for (int i = 0; i < maxDays.size(); i++) {if (i > 0) {System.out.print("、");}System.out.print(maxDays.get(i));
}
System.out.println();// 输出最低气温的天数
System.out.print("最低气温出现在:");
for (int i = 0; i < minDays.size(); i++) {if (i > 0) {System.out.print("、");}System.out.print(minDays.get(i));
}
System.out.println();// 比较各天气温与平均气温
for (count = 0; count < temperature.length; count++) {String dayOfWeek = getDayOfWeek(count + 1);if (temperature[count] < average)System.out.println(dayOfWeek + "的气温低于平均气温");else if (temperature[count] > average)System.out.println(dayOfWeek + "的气温高于平均气温");elseSystem.out.println(dayOfWeek + "的气温等于平均气温");
}
-
输出最高气温的天数:
-
遍历
maxDays列表,输出所有最高气温对应的星期几。 -
如果有多天,用顿号(“、”)分隔。
-
-
输出最低气温的天数:
-
遍历
minDays列表,输出所有最低气温对应的星期几。 -
如果有多天,用顿号(“、”)分隔。
-
-
比较各天气温与平均气温:
-
遍历气温数组,依次比较每一天的气温与平均气温。
-
根据比较结果,输出“低于”、“高于”或“等于”平均气温。
-
6. 辅助方法 getDayOfWeek
private static String getDayOfWeek(int day) {switch (day) {case 1:return "星期一";case 2:return "星期二";case 3:return "星期三";case 4:return "星期四";case 5:return "星期五";case 6:return "星期六";case 7:return "星期日";default:return "";}
}
-
功能:将天数(1到7)转换为对应的星期几(如“星期一”)。
-
实现:
-
使用
switch语句,根据输入的day值返回对应的星期几。 -
如果
day不在1到7范围内,返回空字符串(不会发生,因为输入已经限制为7天)。
-
总结
这段代码通过以下步骤实现了功能:
-
输入数据:动态生成中文提示词,逐天输入气温。
-
计算平均气温:累加气温并计算平均值。
-
寻找最高和最低气温:遍历数组,记录最高和最低气温及其对应的天数。
-
输出结果:格式化输出平均气温、最高气温和最低气温的天数,以及每一天的气温比较结果。
相关文章:
JavaSE学习笔记26-集合(Collection)
集合 Java 中的集合(Collection)是 Java 标准库中非常重要的一部分,用于存储和操作一组对象。Java 集合框架(Java Collections Framework)提供了一套丰富的接口和类,用于处理各种数据结构,如列…...
本地开发用ASP.NET Core Web API项目创建及测试
1. 服务端代码(C#) 1.1 创建ASP.NET Core Web API项目 打开Visual Studio 2022。 选择“创建新项目”。 选择“ASP.NET Core Web API”模板,点击“下一步”。 输入项目名称(如OracleApi),选择项目位置&…...
Redis——用户签到BitMap,UV统计
目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器(Bloom Filter) BitMap介绍 Redis中的使用 Redis功能示例 添加: 获取: 批量获取: java中实现 统计本月连续签到次数 UV统计 UV 统计…...
一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系
对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…...
Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果
目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 (1)提取较亮区域 - pass1 (2)高斯模糊 - pass2&3 (3ÿ…...
小迪安全-24天-文件管理,显示上传,黑白名单,访问控制
上节课回顾,token问题 没有更新token值,造成了复用 加上这段代码就好了,就不会复用了 文件管理-文件上传 upload.html文件,找ai生成就行 uoload.php接受文件上传的信息 这里在写个临时文件存储换个地方 因为上面临时文件存在c盘…...
java23种设计模式-建造者模式
建造者模式(Builder Pattern)学习笔记 1. 模式定义 建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。 2. 适用场景 ✅ 需要创建包含多个…...
JMeter 中实现 100 个用户在 3 秒内并发登录
在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3...
SOME/IP-SD -- 协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…...
IntelliJ IDEA中Maven配置全指南
一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…...
第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离
Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作,直到字符串恰好包含 两个 数字: 从第一个数字开始,对于 s 中的每一对连续数字,计算这两个数字的和 模 10。用计算得到的新…...
20-R 绘图 - 饼图
R 绘图 - 饼图 R 语言提供来大量的库来实现绘图功能。 饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图,语法格式如下: pie(x, l…...
【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新
note (1)未来的工作需亟待解决: 支持大规模 RL 训练(PPO、GRPO 等)的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比(难度、领域、任务等)基于 Instruct 模型训练 R…...
Linux 内核网络设备驱动编程:私有协议支持
一、struct net_device的通用性与私有协议的使用 struct net_device是Linux内核中用于描述网络设备的核心数据结构,它不仅限于TCP/IP协议,还可以用于支持各种类型的网络协议,包括私有协议。其原因如下: 协议无关性:struct net_device的设计是通用的,它本身并不依赖于任何…...
20241130 RocketMQ本机安装与SpringBoot整合
目录 一、RocketMQ简介 ???1.1、核心概念 ???1.2、应用场景 ???1.3、架构设计 2、RocketMQ Server安装 3、RocketMQ可视化控制台安装与使用 4、SpringBoot整合RocketMQ实现消息发送和接收? ? ? ? ? 4.1、添加maven依赖 ???4.2、yaml配置 ???4.3、…...
FFmpeg进化论:从av_register_all手动注册到编译期自动加载的技术跃迁
介绍 音视频开发都知道 FFmpeg,因此对 av_register_all 这个 API 都很熟悉,但ffmpeg 4.0 版本开始就已经废弃了,是旧版本中用于全局初始化的重要接口。 基本功能 核心作用:av_register_all() 用于注册所有封装器(muxer)、解封装器(demuxer)和协议处理器(protocol),…...
Http升级为Https - 开发/测试服环境
1.应用场景 主要用于开发/测试服环境将http升级为https, 防止前端web(浏览器)出现Mixed Content报错; 2.学习/操作 1.文档阅读 deepseek 问答; 2.整理输出 报错信息: Mixed Content: The page at <URL> was loaded over HTTPS, but requested an insecure XMLHttpRequ…...
C语言预编译
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、预处理的作用与流程…...
算法刷题-字符串-151.反转单词
题目 给一串字符串,里面有若干单词,以空格界定单词的结束,翻转其中的单词 输入:s " hello world " 输出:“world hello” 需要注意的是,给定的字符串可能存在头空格、尾空格以及中间的空格数量…...
单片机裸机编程:状态机与其他高效编程框架
在单片机裸机编程中,状态机是一种非常强大的工具,能够有效管理复杂的逻辑和任务切换。除了状态机,还有其他几种编程模式可以在不使用 RTOS 的情况下实现高效的程序设计。以下是一些常见的方法: 1. 状态机编程 状态机通过定义系统…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【根据当天日期输出明天的日期(需对闰年做判定)。】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:…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
