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. 状态机编程 状态机通过定义系统…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
