Java 实例 – 数组获取最大和最小值(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在编程的世界中,数组是一个基础且强大的数据结构。无论是处理学生成绩、温度记录,还是分析销售数据,数组都能高效地存储和组织数据。而获取数组中的最大值和最小值,是数据分析中最常见的操作之一。例如,教师需要快速找到班级的最高分和最低分,气象学家希望统计某地一周内的极端温度。本文将通过 Java 实例 – 数组获取最大和最小值 的主题,从基础概念到实战代码,逐步解析这一操作的实现方法,并通过形象的比喻和案例,帮助读者深入理解。


数组基础回顾:什么是数组?

数组可以想象为一个“有序的储物柜”,每个柜子的位置(索引)对应一个固定的数据类型。例如,一个整型数组就像一排整齐排列的抽屉,每个抽屉里存放一个整数。在 Java 中,数组的声明和初始化通常如下:

int[] numbers = {5, 3, 8, 1, 9}; // 声明并初始化一个整型数组  
String[] names = new String[3]; // 声明一个长度为3的字符串数组  

数组的长度是固定的,这意味着一旦创建,就无法动态扩容或缩容。这种特性使得数组在内存管理上高效,但也需要开发者提前规划数据量。


方法一:手动遍历法(Brute Force Approach)

基本思路:逐个比较

手动遍历法是最直观的方法:从数组的第一个元素开始,逐个与当前已知的最大值或最小值进行比较,不断更新记录。这就像在一堆卡片中寻找最大和最小的数字:

  1. 初始化:假设第一个元素是最大值和最小值。
  2. 循环遍历:从第二个元素开始,依次与当前最大值和最小值比较。
  3. 更新记录:如果当前元素更大,则替换最大值;如果更小,则替换最小值。

代码实现

public class FindMinMax {
    public static void main(String[] args) {
        int[] arr = {12, 5, 9, 20, 3};
        int max = arr[0];
        int min = arr[0];
        
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        System.out.println("最大值:" + max + ",最小值:" + min);
    }
}

代码解析

  • 初始化maxmin 初始值设为数组的第一个元素,避免了空值问题。
  • 循环范围:从索引 1 开始,因为 0 已被初始化使用。
  • 条件判断:每次循环中,同时比较最大值和最小值,减少了循环次数,提升了效率。

方法二:使用 Java 内置工具类

利用排序简化操作

Java 的 Arrays 工具类提供了 sort() 方法,可以将数组按升序排列。排序后,第一个元素即为最小值,最后一个元素即为最大值。这类似于将卡片按顺序排列后,直接取首尾两张卡片。

代码示例

import java.util.Arrays;

public class FindMinMaxWithSort {
    public static void main(String[] args) {
        int[] arr = {12, 5, 9, 20, 3};
        Arrays.sort(arr);
        int max = arr[arr.length - 1];
        int min = arr[0];
        System.out.println("最大值:" + max + ",最小值:" + min);
    }
}

优缺点分析

方法时间复杂度是否改变原数组适用场景
手动遍历法O(n)需要保留原始数据时
排序法O(n log n)不需要保留原始数据时

注意:排序法会修改原数组,若原始数据需保留,需先复制数组再排序。


方法三:Java 8 Stream API 的简洁实现

Java 8 引入的 Stream API 提供了更简洁的语法。通过 max()min() 方法,可以一行代码完成操作,类似于“魔法指令”直接提取结果。

代码示例

import java.util.Arrays;
import java.util.Optional;

public class FindMinMaxWithStream {
    public static void main(String[] args) {
        int[] arr = {12, 5, 9, 20, 3};
        OptionalInt max = Arrays.stream(arr).max();
        OptionalInt min = Arrays.stream(arr).min();
        
        System.out.println("最大值:" + max.getAsInt());
        System.out.println("最小值:" + min.getAsInt());
    }
}

关键点说明

  • Optional 类型max()min() 返回 OptionalInt,避免空值异常。
  • 流式操作Arrays.stream(arr) 将数组转换为流,后续方法链式调用。
  • 性能:时间复杂度仍为 O(n),但代码简洁性显著提升。

处理特殊场景:空数组与负数

场景一:空数组的防御性编程

若数组长度为 0,手动遍历法会抛出 ArrayIndexOutOfBoundsException。因此,在代码中需添加条件判断:

if (arr.length == 0) {
    System.out.println("数组为空,无法获取最大值和最小值");
    return;
}

场景二:负数的比较逻辑

负数的存在不会影响比较逻辑,因为 >< 运算符会自动处理符号。例如,数组 {-5, -2, -10} 的最大值是 -2,最小值是 -10


性能对比与选择建议

时间复杂度对比

方法时间复杂度适用情况
手动遍历法O(n)优先选择,尤其当保留原始数据时
排序法O(n log n)当需要同时获取排序后的其他信息时
Stream APIO(n)代码简洁性优先,且无需修改原数组

选择建议

  • 常规场景:推荐手动遍历法,时间复杂度最低且无副作用。
  • 代码简洁性:若项目使用 Java 8+,可优先选择 Stream API。
  • 附加需求:若需要排序后的数组,可直接使用排序法。

实战案例:温度数据统计

假设有一个气象站记录了一周的每日最高温度(单位:℃):{23, 19, 27, 25, 22, 30, 20}。我们希望找出这一周的最高温和最低温。

代码实现

public class TemperatureAnalysis {
    public static void main(String[] args) {
        int[] temperatures = {23, 19, 27, 25, 22, 30, 20};
        
        // 方法一:手动遍历  
        int maxTemp = temperatures[0];
        int minTemp = temperatures[0];
        for (int temp : temperatures) {
            if (temp > maxTemp) maxTemp = temp;
            if (temp < minTemp) minTemp = temp;
        }
        
        System.out.println("本周最高温:" + maxTemp + "℃,最低温:" + minTemp + "℃");
    }
}

输出结果

本周最高温:30℃,最低温:19℃  

结论

通过本文的讲解,我们系统学习了 Java 实例 – 数组获取最大和最小值 的三种方法:手动遍历法、排序法和 Stream API。无论是编程初学者还是中级开发者,都可以根据实际需求选择最适合的方案。掌握这些方法不仅能解决具体问题,还能培养对算法效率和代码简洁性的思考习惯。

在实际开发中,数组操作是数据处理的基础,而最大值和最小值的获取更是数据分析的起点。通过不断练习和应用这些技术,开发者可以逐步构建更复杂的数据处理逻辑,例如统计平均值、中位数,或实现更高级的算法。希望本文能为你的编程之路提供一份清晰的指南!

最新发布