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)提供了一套丰富的接口和类,用于处理各种数据结构,如列…...
使用Open WebUI下载的模型文件(Model)默认存放在哪里?
🏡作者主页:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2025年2月21日21点21分 🀄️文章质量:95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下…...
Django数据库操作
1、ORM 创建、删除、修改数据库的表中的数据,但不能创建数据库往数据库表中写入数据 表名:app名称_类名的小写 2、操作表数据 from django.db import modelsclass Department(models.Model):title models.CharField(verbose_name"部门", …...
005:Cesium.viewer 知识详解、示例代码
查看本专栏目录 - 本文是第 005个API内容详解 vue+cesium 示例教程200+目录 文章目录 一、Cesium.Viewer 知识详解1. 主要用途2. 构造函数与参数3. 常用属性(1)`viewer.scene`(2)`viewer.camera`(3)`viewer.entities`(4)`viewer.clock`4. 常用方法(1)`viewer.zoomTo(…...
蓝桥杯单片机组第十二届省赛第二批次
前言 第十二届省赛涉及知识点:NE555频率数据读取,NE555频率转换周期,PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少,题目不难,基本上准备充分的都能完整的实现每一个功能,并…...
AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自动收发消息)
1.本地部署 1.1 ollama Ollama软件通过其高度优化的推理引擎和先进的内存管理机制,显著提升了大型语言模型在本地设备上的运行效率。其核心采用了量化技术(Quantization)以降低模型的计算复杂度和存储需求,同时结合张量并行计算&…...
Git 常用指令及其说明
配置相关 # 配置全局用户名 git config --global user.name "YourUsername"# 配置全局邮箱 git config --global user.email "your.emailexample.com"说明:这两条命令用于设置 Git 全局的用户名和邮箱,在提交代码时,这些…...
华为2025年技术发布会:智能汽车核心技术大爆发
近日,华为在鸿蒙智行尊界技术发布会上发布了多项智能汽车核心技术,涵盖智能驾驶、安全防护、通信系统、座舱交互及电池技术等领域,标志着其从“被动智能”向“自主智能”的战略升级。 以下是核心技术的综合梳理: 六大核心创新 途…...
SeaCMS V9海洋影视管理系统报错注入
漏洞背景 SQL 注入攻击是当前网络安全中最常见的一种攻击方式,攻击者可以利用该漏洞访问或操作数据库,造成数据泄露或破坏。通常发生在开发人员未能正确处理用户输入时。 在 SeaCMS V9 中,用户输入(如登录、评论、分页、ID 等&a…...
vue3父子组件props传值,defineprops怎么用?(组合式)
目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量,修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props(:props“”)传递数据给子组件 <!-- 父组件…...
Django-Vue 学习-VUE
主组件中有多个Vue组件 是指在Vue.js框架中,主组件是一个父组件,它包含了多个子组件(Vue组件)。这种组件嵌套的方式可以用于构建复杂的前端应用程序,通过拆分功能和视图,使代码更加模块化、可复用和易于维…...
Ollama部署本地大模型DeepSeek-R1-Distill-Llama-70B
文章目录 一、下模二、转模1. 下载转换工具2. 安装环境依赖3. llama.cpp1. 转换脚本依赖2. llama.cpp安装依赖包3. llama.cpp编译安装4. 格式转换 三、Ollama部署1. 安装启动Ollama2. 添加模型3. 测试运行 一、下模 #模型下载 from modelscope import snapshot_download model…...
Zabbix问题记录2--踩坑HttpRequest,header添加无效
背景 在试图尝试通过Zabbix接入DeepSeek API的时候,由于使用了HTTP的方式,所以需要使用Zabbix 自带的HttpRequest库进行请求,产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…...
MTK Android12 预装apk可卸载
文章目录 需求解决方法1、device/mediatek/mt6761/device.mk2、/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt3、路径:4、Android.mk 需求 近期,客户需要预装一个apk,同时该apk要可卸载。解…...
Redis 集群的三种模式:一主一从、一主多从和多主多从
本文记述了博主在学习 Redis 在大型项目下的使用方式,包括如何设置Redis主从节点,应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后,进而想要了解 Redis 集群如何使用,如何正确使用…...
网络工程知识笔记
1. 什么是网络? 网络是由多个节点(如计算机、打印机、路由器等)通过物理或逻辑连接组成的系统,用于数据的传输和共享。这些节点可以通过有线(如以太网)或无线(如 Wi-Fi)方式进行连接…...
FFmpeg进化论:从av_register_all手动注册到编译期自动加载的技术跃迁
介绍 音视频开发都知道 FFmpeg,因此对 av_register_all 这个 API 都很熟悉,但ffmpeg 4.0 版本开始就已经废弃了,是旧版本中用于全局初始化的重要接口。 基本功能 核心作用:av_register_all() 用于注册所有封装器(muxer)、解封装器(demuxer)和协议处理器(protocol),…...
初识.git文件泄露
.git 文件泄露 当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库,只需把这个目录拷贝至另一处就可以了 这是一种常见的安全漏洞,指的是网站的 .git 目录…...
运行测试用例
python odoo-bin -d <database_name> -i my_module --test-tagsmy_module:TestOptimalRouteSelection.test_route_profit_calculation --stop-after-init-d <database_name>:指定 Odoo 使用的数据库名称。 -i my_module:加载和初始化要测试的…...
政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio(UI) 运…...
[250224] Yaak 2.0:Git集成、WebSocket支持、OAuth认证等 | Zstandard v1.5.7 发布
目录 Yaak 2.0 发布:Git 集成、WebSocket 支持、OAuth 认证等众多功能!Zstandard v1.5.7 发布:性能提升,稳定性增强 Yaak 2.0 发布:Git 集成、WebSocket 支持、OAuth 认证等众多功能! Yaak,一款…...
(六)趣学设计模式 之 代理模式!
目录 一、啥是代理模式?二、为什么要用代理模式?三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 🌟我的其他文章也讲解的比较有趣😁&a…...
力扣LeetCode:1656 设计有序流
题目: 有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数,value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流,以 任意 顺序获取 n 个 (id, value) 对,并在多次调用时 按 id 递增的顺序…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Ads Kit(2)
1.问题描述: 应用需要获取一个唯一不变的标识生成deviceID。 当前通过OAID生成,但每次重启PC样机,获取到的OAID都会变化,无法满足唯一不变的需求。 解决方案: 需要获取一个唯一不变的标识,可以尝试使用O…...
鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载)
鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载) 1、效果展示2、ets/models/BasicDataSource.ets3、ets/models/HomeData.ets4、ets/api/home.ets5、ets/pages/Home.ets6、ets/views/Home/SwiperLayout.ets7、后端代码 1、效果展示 2、ets/models/Ba…...
DSP芯片C6678的SRIO及其中断跳转的配置
C6678SRIO读写测试门铃中断跳转测试 SRIO简述代码前言SRIO配置原始代码1.使能电源2.初始化SRIO回环修改 3.SRIO测试 Doorbell门铃中断1.初始化中断函数2.中断向量表建立3.中断向量表的链接 本博客基于创龙“678ZH产品线”的SRIO代码,部分参考于网友们的博客…...
2025asp.net全栈技术开发学习路线图
2025年技术亮点: Blazor已全面支持WebAssembly 2.0标准 .NET 8版本原生集成AI模型部署能力 Azure Kubernetes服务实现智能自动扩缩容 EF Core新增向量数据库支持特性 ASP.NET 全栈开发关键技术说明(2025年视角) 以下技术分类基于现…...
DeepSeek开源周首日:发布大模型加速核心技术可变长度高效FlashMLA 加持H800算力解码性能狂飙升至3000GB/s
FlashMLA的核心技术特性包括对BF16精度的全面支持,以及采用块大小为64的页式键值缓存(Paged KV Cache)系统,实现更精确的内存管理。在性能表现方面,基于CUDA12.6平台,FlashMLA在H800SXM5GPU上创下了显著成绩…...
01 冲突域和广播域的划分
目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…...
nodejs npm install、npm run dev运行的坎坷之路
1、前面的种种都不说了,好不容易运行起来oap-portal项目,运行idm-ui项目死活运行不起来,各种报错,各种安装,各种卸载nodejs,卸载nvm,重装,都不好使。 2、甚至后来运行npm install会…...
