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. 状态机编程 状态机通过定义系统…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...