JavaSE学习笔记26-集合(Collection)

news2025/2/26 5:12:32

集合

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Open WebUI下载的模型文件(Model)默认存放在哪里?

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月21日21点21分 &#x1f004;️文章质量&#xff1a;95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下…

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(…

蓝桥杯单片机组第十二届省赛第二批次

前言 第十二届省赛涉及知识点&#xff1a;NE555频率数据读取&#xff0c;NE555频率转换周期&#xff0c;PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少&#xff0c;题目不难&#xff0c;基本上准备充分的都能完整的实现每一个功能&#xff0c;并…

AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自动收发消息)

1.本地部署 1.1 ollama Ollama软件通过其高度优化的推理引擎和先进的内存管理机制&#xff0c;显著提升了大型语言模型在本地设备上的运行效率。其核心采用了量化技术&#xff08;Quantization&#xff09;以降低模型的计算复杂度和存储需求&#xff0c;同时结合张量并行计算&…

华为2025年技术发布会:智能汽车核心技术大爆发

近日&#xff0c;华为在鸿蒙智行尊界技术发布会上发布了多项智能汽车核心技术&#xff0c;涵盖智能驾驶、安全防护、通信系统、座舱交互及电池技术等领域&#xff0c;标志着其从“被动智能”向“自主智能”的战略升级。 以下是核心技术的综合梳理&#xff1a; 六大核心创新 途…

SeaCMS V9海洋影视管理系统报错注入

漏洞背景 SQL 注入攻击是当前网络安全中最常见的一种攻击方式&#xff0c;攻击者可以利用该漏洞访问或操作数据库&#xff0c;造成数据泄露或破坏。通常发生在开发人员未能正确处理用户输入时。 在 SeaCMS V9 中&#xff0c;用户输入&#xff08;如登录、评论、分页、ID 等&a…

vue3父子组件props传值,defineprops怎么用?(组合式)

目录 1.基础用法 2.使用解构赋值的方式定义props 3.使用toRefs的方式解构props (1).通过ref响应式变量&#xff0c;修改对象本身不会触发响应式 1.基础用法 父组件通过在子组件上绑定子组件中定义的props&#xff08;:props“”&#xff09;传递数据给子组件 <!-- 父组件…

Django-Vue 学习-VUE

主组件中有多个Vue组件 是指在Vue.js框架中&#xff0c;主组件是一个父组件&#xff0c;它包含了多个子组件&#xff08;Vue组件&#xff09;。这种组件嵌套的方式可以用于构建复杂的前端应用程序&#xff0c;通过拆分功能和视图&#xff0c;使代码更加模块化、可复用和易于维…

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的时候&#xff0c;由于使用了HTTP的方式&#xff0c;所以需要使用Zabbix 自带的HttpRequest库进行请求&#xff0c;产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…

Redis 集群的三种模式:一主一从、一主多从和多主多从

本文记述了博主在学习 Redis 在大型项目下的使用方式&#xff0c;包括如何设置Redis主从节点&#xff0c;应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后&#xff0c;进而想要了解 Redis 集群如何使用&#xff0c;如何正确使用&#xf…

网络工程知识笔记

1. 什么是网络&#xff1f; 网络是由多个节点&#xff08;如计算机、打印机、路由器等&#xff09;通过物理或逻辑连接组成的系统&#xff0c;用于数据的传输和共享。这些节点可以通过有线&#xff08;如以太网&#xff09;或无线&#xff08;如 Wi-Fi&#xff09;方式进行连接…

初识.git文件泄露

.git 文件泄露 当在一个空目录执行 git init 时&#xff0c;Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库&#xff0c;只需把这个目录拷贝至另一处就可以了 这是一种常见的安全漏洞&#xff0c;指的是网站的 .git 目录…

政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio&#xff08;UI&#xff09; 运…

(六)趣学设计模式 之 代理模式!

目录 一、啥是代理模式&#xff1f;二、为什么要用代理模式&#xff1f;三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&a…

力扣LeetCode:1656 设计有序流

题目&#xff1a; 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) 对&#xff0c;并在多次调用时 按 id 递增的顺序…

鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载)

鸿蒙开发深入浅出03&#xff08;封装通用LazyForEach实现懒加载&#xff09; 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代码&#xff0c;部分参考于网友们的博客&#xf…

2025asp.net全栈技术开发学习路线图

2025年技术亮点‌&#xff1a; Blazor已全面支持WebAssembly 2.0标准 .NET 8版本原生集成AI模型部署能力 Azure Kubernetes服务实现智能自动扩缩容 EF Core新增向量数据库支持特性 ‌ASP.NET 全栈开发关键技术说明&#xff08;2025年视角&#xff09;‌ 以下技术分类基于现…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…