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. 集合的线程安全性

  • 大多数集合类(如 ArrayListHashMap)是线程不安全的。

  • 如果需要线程安全的集合,可以使用以下方式:

    • 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 "";}}
}

代码整体功能

这段代码的主要功能是:

  1. 输入一周七天的气温(从周一到周日)。

  2. 计算平均气温

  3. 找出最高气温和最低气温对应的天数

  4. 比较每一天的气温与平均气温,输出哪些天高于、低于或等于平均气温。

  5. 输出结果,包括平均气温、最高气温和最低气温对应的天数,以及每一天的气温比较结果。


代码结构

代码分为以下几个部分:

  1. 变量声明和初始化

  2. 输入气温数据

  3. 计算平均气温

  4. 寻找最高气温和最低气温

  5. 输出结果

  6. 辅助方法 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天)。


总结

这段代码通过以下步骤实现了功能:

  1. 输入数据:动态生成中文提示词,逐天输入气温。

  2. 计算平均气温:累加气温并计算平均值。

  3. 寻找最高和最低气温:遍历数组,记录最高和最低气温及其对应的天数。

  4. 输出结果:格式化输出平均气温、最高气温和最低气温的天数,以及每一天的气温比较结果。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python游戏编程之赛车游戏6-3

1 “敌人”汽车类的创建 在创建玩家汽车类之后&#xff0c;接下来创建“敌人”汽车类。“敌人”汽车类与玩家类一样&#xff0c;也是包含两个方法&#xff0c;一个是__init__()&#xff0c;另一个是move()。 1.1 __init__()方法 “敌人”汽车类的__init__()方法代码如图1所示…

垂类大模型微调(二):使用LLaMA-Factory

上一篇博文和大家一起安装了LLaMA-Factory工具,并下载了大模型在上面进行了简单的加载和推理,今天尝试通过LoRa技术对大模型进行微调; 一、训练集准备 1.1 介绍训练集结构 这里演示对Qwen2.5-0.5B-Instruct-GPTQ-Int4模型进行LoRA微调, 大家可以根据垂类大模型微调(一)…

什么是MySql的主从复制(主从同步)?

主页还有其他面试题总结&#xff0c;有需要的可以去看一下&#xff0c;喜欢的就留个三连再走吧~ 1.什么是MySql的主从复制原理&#xff1f; 主从复制的核心就是二进制binlog&#xff08;DDL&#xff08;数据定义语言&#xff09;语句和DML&#xff08;数据操纵语言&#xff09…

坐标变换及视图变换和透视变换(相机透视模型)

文章目录 2D transformationScaleReflectionShear&#xff08;切变&#xff09;Rotation around originTranslationReverse变换顺序复杂变换的分解 齐次坐标&#xff08;Homogenous Coordinates&#xff09;3D transformationScale&TranslationRotation Viewing / Camera t…

文字语音相互转换

目录 1.介绍 2.思路 3.安装python包 3.程序&#xff1a; 4.运行结果 1.介绍 当我们使用一些本地部署的语言模型的时候&#xff0c;往往只能进行文字对话&#xff0c;这一片博客教大家如何实现语音转文字和文字转语音&#xff0c;之后接入ollama的模型就能进行语音对话了。…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 &#xff08;1&#xff09;提取较亮区域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

PING命令TTL解析

在 ping 命令中&#xff0c;TTL&#xff08;Time to Live&#xff0c;生存时间&#xff09; 是 IP 数据包的核心字段之一&#xff0c;用于控制数据包在网络中的生命周期。以下是针对 TTL 的简明解析&#xff1a; 1. TTL 的核心作用 防循环机制&#xff1a;TTL 是一个计数器&a…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

(七)趣学设计模式 之 适配器模式!

目录 一、 啥是适配器模式&#xff1f;二、 为什么要用适配器模式&#xff1f;三、 适配器模式的实现方式1. 类适配器模式&#xff08;继承插座 &#x1f468;‍&#x1f469;‍&#x1f467;‍&#x1f466;&#xff09;2. 对象适配器模式&#xff08;插座转换器 &#x1f50c…

【NLP】注意力机制

目录 一、认识注意力机制 1.1 常见注意力计算规则 1.2 注意力机制的作用 1.3 注意力机制代码实现 二、注意力机制原理 2.1 attention计算过程 2.2 attention的计算逻辑 2.3 有无attention模型对比 2.3.1 无attention机制的模型 2.3.2 有attention机制的模型 三、Se…

Spring Boot 整合 Druid 并开启监控

文章目录 1. 引言2. 添加依赖3. 配置数据源4. 开启监控功能5. 自定义 Druid 配置&#xff08;可选&#xff09;6. 访问监控页面7. 注意事项8. 总结 Druid 是一个由阿里巴巴开源的高性能数据库连接池&#xff0c;它不仅提供了高效的连接管理功能&#xff0c;还自带了强大的监控…

红帽7基于kickstart搭建PXE环境

Kickstart 文件是一种配置文件&#xff0c;用于定义 Linux 系统安装过程中的各种参数&#xff0c;如分区、网络配置、软件包选择等。system-config-kickstart 提供了一个图形界面&#xff0c;方便用户快速生成这些配置文件。 用户可以通过图形界面进行系统安装的详细配置&…

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…

MongoDB 简介

MongoDB 是一种高性能、开源的 NoSQL 数据库&#xff0c;以其灵活的文档模型和强大的扩展性而闻名。 1.MongoDB 是什么 MongoDB 是一种 NoSQL 数据库&#xff0c;采用 文档模型 存储数据&#xff0c;支持灵活的 JSON 格式文档。它无需预定义表结构&#xff0c;能够动态调整数据…

记录首次安装远古时代所需的运行环境成功npm install --save-dev node-sass

最开始的报错&#xff1a; 最后根据报错一步步 安装所需要的pythong之类的环境&#xff0c;最后终于成功了&#xff0c;得以让我在github上拉的vuehr项目&#xff08;狗头18年还是20年的远古项目&#xff09;成功本地运行&#xff0c;最后附上本地运行成功的贴图。如果大家也在…

华为guass在dbever和springboot配置操作

下面记录华为guass在dbever和springboot配置操作&#xff0c;以备忘。 1、安装dbeaver-ce-23.2.0-x86_64-setup.exe和驱动程序 Download | DBeaver Community 2、配置高斯数据库驱动 3、新建数据库连接 4、操作指引 opengauss官方文档 https://docs-opengauss.osinfra.cn/zh…

今日运维之-Mac笔记本python环境问题

1. 问题&#xff1a;MAC升级系统后git报错&#xff1f; Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…

c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)

数据库连接池是在应用程序启动时创建一定数量的数据库连接&#xff0c;并将这些连接存储在池中。当应用程序需要与数据库通信时&#xff0c;它可以向池中请求一个连接&#xff0c;使用完后将连接归还给池&#xff0c;而不是关闭连接。这样可以减少创建和关闭连接的开销&#xf…

数仓搭建实操(传统数仓oracle):DWD数据明细层

数据处理思路 DWD层, 数据明细层>>数据清洗转换, 区分事实表,维度表 全是事实表,没有维度表>>不做处理 数据清洗>>数据类型varchar 变成varchar2, 日期格式统一(时间类型变成varchar2); 字符数据去空格 知识补充: varchar 存储定长字符类型 ; 存储的数据会…

2.1 第一个程序:从 Hello World 开始

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 同大多数编程语言教程一样&#xff0c;本书第一个代码也是输出&#xff1a;Hello world! 这似乎也是惯例。我们也先从这个简单的代码…