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 + "的气温高于平均气温");
            else
                System.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 + "的气温高于平均气温");
    else
        System.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. 输出结果:格式化输出平均气温、最高气温和最低气温的天数,以及每一天的气温比较结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业级大模型应用的Java-Python异构融合架构实践

一、后端语言相关技术生态 Python语言 Python在AI计算领域拥有全面的生态支持&#xff1a; 底层工具库: Pandas、NumPy、SciPy、Matplotlib深度学习框架: PyTorch、TensorFlow领域专用框架: HuggingFace Transformers&#xff08;社区生态为主&#xff09; 常见Python框架 …

Apache Doris 索引的全面剖析与使用指南

搞大数据开发的都知道&#xff0c;想要在海量数据里快速查数据&#xff0c;就像在星图里找一颗特定的星星&#xff0c;贼费劲。不过别慌&#xff0c;数据库索引就是咱们的 “定位神器”&#xff0c;能让查询效率直接起飞&#xff01;就拿 Apache Doris 这个超火的分析型数据库来…

HTTP/HTTPS 服务端口监测的简易实现

一 HTTP/HTTPS 服务端口监测的简易实现方法 在当今快节奏的工作环境中&#xff0c;工作忙碌成为了许多职场人的常态。就拿我们团队最近经历的事情来说&#xff0c;工作任务一个接一个&#xff0c;大家都在各自的岗位上争分夺秒地忙碌着。然而&#xff0c;就在这样高强度的工作…

基于数据可视化学习的卡路里消耗预测分析

数据分析实操集合&#xff1a; 1、关于房间传感器监测数据集的探索 2、EEMD-LSTM模型择时策略 — 1.EEMD分解与LSTM模型搭建 3、EEMD-LSTM模型择时策略 — 2. 量化回测 4、国际超市电商销售数据分析 5、基于问卷调查数据的多元统计数据分析与预测&#xff08;因子分析、对应分…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表&#xff1f; 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法&#xff08;时间复杂度O(1)&#xff09; 尾插法&#xff08;时间复杂度O(n)&#xff09; 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

计算机网络:应用层 —— 电子邮件

文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件&#xff08;E-mail&#xff09;是因特网上最早…

AWVS(web)扫描器安装与使用

目录 前言 1. AWVS 简介与功能特性 1.1 什么是 AWVS&#xff1f; 1.2 主要功能特性 2. AWVS 的安装步骤 2.1 系统要求 2.2 安装步骤&#xff08;以 Windows 为例&#xff09; 3. 配置与初始化 3.1 设置扫描目标 3.2 配置扫描选项 4. AWVS 的使用方法 4.1 自动扫描 …

opencv的C++遇到找不到opencv_worldxxxd.dll

如图所示&#xff1a; 将你缺的这个dll文件复制到 C:\Windows\System32 即可

AI提示工程的挑战与演进

目前让AI按照工作流正确的工作依然存在着提示挑战&#xff0c;提示工程实际上是一套逻辑严密的工作。 根据当前技术发展及行业实践&#xff0c;AI按照工作流正确执行任务仍面临显著的提示工程挑战&#xff0c;而提示工程本身也正在从零散经验向系统化、逻辑严密的方法论演进。以…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

蓝桥杯第十六届嵌入式模拟编程题解析

由硬件框图可以知道我们要配置LED 和按键 LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&#xf…

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况&#xff1a;本科就读于电科软院&#xff0c;24年2月开始了解考研&#xff0c;24年3月开始数学&#xff0c;9月决定考本院&#xff08;开始全天候图书馆学习&#xff09;并开始专业课学习&#xff0c;11月底开始政治学习&#xff0c;最后…

基于范围选择的进化多目标优化PESA-II-可用于(汽车发动机多目标优化设计/飞机机翼多目标外形优化/电动汽车充电设施布局优化)

基于范围选择的进化多目标优化 PESA-II&#xff08;Pareto Envelope-Based Selection Algorithm II&#xff09;是一种经典的多目标遗传算法&#xff0c;以下是对它的详细介绍&#xff1a;基于范围选择的进化多目标优化PESA-II-可用于&#xff08;汽车发动机多目标优化设计/飞机…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

鹏哥c语言数组(初阶数组)

前言&#xff1a; 对应c语言视频54集 内容&#xff1a; 一维数组的创建 数组是一组相同元素的集合&#xff0c; 数组的创建方式 type_t就是数组的元素类型&#xff0c;const_n是一个常量表达式&#xff0c;用来指定数组的大小 c99标准之前的&#xff0c;数组的大小必须是…

Oracle 数据变化量查询

1. DBA_HIST_SEG_STAT可以看出对象的使用趋势&#xff0c;构造如下SQL查询出每个时间段内数据库对象的增长量 select c.SNAP_ID,to_char(c.END_INTERVAL_TIME, yyyy-mm-dd) SNAP_TIME,a.OWNER,a.OBJECT_NAME,a.OBJECT_TYPE,b.DB_BLOCK_CHANGES_DELTAfrom dba_objects a,(selec…

Language Models are Unsupervised Multitask Learners,GPT-2详细讲解

1542M1.542B15.42亿个 背景和动机 1.GPT-1在特定自然语言理解任务标注较少情况下&#xff0c;通过利用大量无标注数据&#xff0c;取得较强性能 2.BERT性能超越GPT-1&#xff0c;GPT-2通过构建更大数据集和模型&#xff0c;同时在zero-shot的多任务学习场景中展示不错性能 创…

ultralytics导出engine之后,用tensorrt c++ api加载报Serialization failed

一。问题复现 1.生成engine 在安装了ultralytics之后&#xff0c;或者直接用源码也一样。运行如下代码 (或者用命令行也行&#xff1a;yolo taskdetect modeexport model/home/kv183/tensorrt_starter/ultralytics-main/weights/yolov8s.pt formatengine &#xff09; from…

Milvus x DeepSeek 搭建低成本高精度 RAG 实战

为什么手握海量数据&#xff0c;却用不出真正的“智能”&#xff1f;要么 AI 模型学艺不精&#xff0c;答非所问&#xff1b;要么技术门槛太高&#xff0c;让普通开发者望而却步。现在&#xff0c;使用阿里云 Milvus 向量检索服务、DeepSeek 大模型和 PAI LangStudio 开发工具&…

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…