0

0

Java中基于条件筛选数组元素并创建新数组的两种方法

心靈之曲

心靈之曲

发布时间:2025-11-16 14:06:20

|

1030人浏览过

|

来源于php中文网

原创

Java中基于条件筛选数组元素并创建新数组的两种方法

本教程详细介绍了在java中根据特定条件从一个数组中筛选元素并将其复制到新数组的两种主要方法。我们将探讨传统的循环与计数器方式,以及更现代、简洁的java stream api实现。文章还包括了代码示例、对目标数组大小处理的考量,以及关于两种方法性能和适用场景的专业分析,帮助开发者选择最适合其需求的技术。

1. 数组元素条件筛选与新数组创建的挑战

在Java编程中,从一个现有数组中根据特定条件(例如,筛选所有偶数)提取元素,并将其组织成一个新的数组,是一个常见的操作。然而,这项任务的挑战在于,在创建新数组之前,我们通常无法预知满足条件的元素数量。这使得新数组的精确初始化大小难以确定,可能导致 ArrayIndexOutOfBoundsException 或资源浪费。本文将介绍两种主流的解决方案来应对这一挑战。

2. 方法一:使用传统循环与计数器

传统循环是实现条件筛选和元素复制最直接且底层的方案。这种方法通过一个额外的计数器来追踪新数组的当前填充位置,从而动态地构建结果数组。

核心思路:

  1. 初始化目标数组: 由于无法预知满足条件的元素数量,一种稳妥的做法是先创建一个与源数组大小相同(或根据经验估算一个最大可能值)的目标数组,确保有足够的空间。更灵活且推荐的做法是使用 java.util.ArrayList 动态收集元素,最后再转换为数组。
  2. 引入计数器: 声明一个整型变量作为计数器(例如 count),初始值为0。它将用于记录已复制到新数组的元素数量,并作为新数组的索引。
  3. 遍历源数组: 使用 for 循环遍历源数组中的每一个元素。
  4. 条件判断与复制: 在循环内部,对每个元素应用筛选条件。如果元素满足条件,则将其复制到目标数组中 count 所在的位置,然后将 count 递增。
  5. 数组调整(可选): 如果初始目标数组大小设置得较大(例如与源数组同大),在完成复制后,可能需要使用 Arrays.copyOf() 方法将目标数组裁剪到实际包含元素的数量。

示例代码:

麦艺画板(Max.art)
麦艺画板(Max.art)

AI工业设计平台,专注于汽车设计,线稿、渲染、3D建模全流程覆盖

下载

立即学习Java免费学习笔记(深入)”;

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class ArrayFilterTraditional {

    public static void main(String[] args) {
        int[] sourceArray = {1, 6, 3, 4, 5, 8, 7};

        // 方案A: 预分配最大空间,然后裁剪
        // 这种方式确保不会发生 ArrayIndexOutOfBoundsException
        int[] tempTargetArray = new int[sourceArray.length];
        int count = 0; // 计数器,记录已复制元素的数量
        for (int i = 0; i < sourceArray.length; i++) {
            if (sourceArray[i] % 2 == 0) { // 条件:筛选偶数
                tempTargetArray[count] = sourceArray[i];
                count++;
            }
        }
        // 使用 Arrays.copyOf() 将临时数组裁剪到实际大小
        int[] evenNumbersByLoop = Arrays.copyOf(tempTargetArray, count);
        System.out.println("方法一 (传统循环,预分配后裁剪) 筛选结果: " + Arrays.toString(evenNumbersByLoop));

        // 方案B: 使用 ArrayList 动态收集元素 (更推荐的传统方式)
        List evenNumbersList = new ArrayList<>();
        for (int item : sourceArray) {
            if (item % 2 == 0) { // 条件:筛选偶数
                evenNumbersList.add(item);
            }
        }
        // 将 ArrayList 转换为 int[] 数组
        int[] evenNumbersByArrayList = evenNumbersList.stream().mapToInt(Integer::intValue).toArray();
        System.out.println("方法一 (传统循环,ArrayList动态收集) 筛选结果: " + Arrays.toString(evenNumbersByArrayList));
    }
}

注意事项:

  • 方案A中,tempTargetArray 初始大小为 sourceArray.length,保证了所有满足条件的元素都能被容纳,但可能存在未使用的空间。最终通过 Arrays.copyOf() 精确调整大小。
  • 方案B中,使用 ArrayList 避免了预估数组大小的问题,更加灵活和健壮。最后通过Stream API将 ArrayList 转换为 int[]。

3. 方法二:利用Java Stream API

Java 8 引入的 Stream API 提供了一种更函数式、更简洁且表达力更强的方式来处理集合数据。对于数组的筛选和转换操作,Stream API 尤其适用。

核心思路:

  1. 创建流: 使用 Arrays.stream() 方法将源数组转换为一个 IntStream (对于 int[] 类型)。
  2. 应用筛选: 使用 filter() 方法,传入一个 Predicate (通常是一个 Lambda 表达式),定义筛选条件。
  3. 收集结果: 使用 toArray() 终端操作将过滤后的流元素收集回一个新的数组。

示例代码:

立即学习Java免费学习笔记(深入)”;

import java.util.Arrays;

public class ArrayFilterStream {

    public static void main(String[] args) {
        int[] sourceArray = {1, 6, 3, 4, 5, 8, 7};

        // 筛选偶数并收集到新数组
        int[] evenNumbersByStream = Arrays.stream(sourceArray)
                                          .filter(item -> item % 2 == 0) // 条件:筛选偶数
                                          .toArray();
        System.out.println("方法二 (Stream API) 筛选结果: " + Arrays.toString(evenNumbersByStream));

        // 如果仅需打印结果,可直接使用 forEach 终端操作
        System.out.print("方法二 (Stream API) 直接打印偶数: ");
        Arrays.stream(sourceArray)
              .filter(item -> item % 2 == 0)
              .forEach(System.out::print); // 或者 forEach(item -> System.out.print(item + " "))
        System.out.println();
    }
}

Stream API 的优势:

  • 代码简洁性与可读性: 链式调用使得数据处理逻辑清晰、表达力强,代码更易于理解和维护。
  • 声明式编程: 开发者可以更关注“做什么”而非“如何做”,提高开发效率。
  • 并行处理潜力: Stream API 支持并行流 (parallelStream()),在处理大规模数据时,可以在多核处理器上自动优化性能,尽管对于小到中等规模的数据集,其开销可能大于收益。

4. 性能考量与选择建议

在选择传统循环还是 Stream API 时,性能是一个重要的考量因素,尤其是在处理大量数据或对性能有严格要求的场景下。

  • 传统循环:

    • 优点: 对于简单的筛选和转换操作,传统循环通常在微基准测试中表现出更高的性能。它避免了 Stream API 内部的一些抽象层和对象创建开销,通常只进行一次迭代。
    • 缺点: 代码可能相对冗长,尤其是在处理复杂逻辑时。需要手动管理索引和数组大小,增加了出错的可能性。
  • Java Stream API:

    • 优点: 代码简洁、可读性高,易于组合复杂的链式操作。对于更复杂的转换、映射和聚合操作,其优势更为明显。
    • 缺点: 对于非常大的数据集或性能敏感的场景,Stream API 可能引入一些运行时开销。例如,filter().toArray() 操作,在某些实现下可能涉及额外的对象创建或内部迭代优化。虽然现代 JVM 和 Stream 实现已经非常优化,但在极端情况下仍需通过基准测试进行验证。

选择建议:

  • 对于小到中等规模的数据集,或追求代码简洁性和可读性的场景,优先考虑 Stream API。 它能显著提高开发效率和代码质量,且在大多数情况下性能差异可忽略不计。
  • 对于极其庞大的数据集,或对性能有极致要求的场景,并且经过性能测试确认 Stream API 成为瓶颈时,可以考虑使用传统的循环方式。 在这种情况下,通常会进行更底层的优化以榨取每一丝性能。
  • 在多数日常开发中,Stream API 的性能通常是足够的,其带来的代码可维护性提升往往超过微小的性能差异。

5. 总结

本文详细探讨了在Java中根据条件筛选数组元素并创建新数组的两种主要策略:传统的循环与计数器方法和现代的Java Stream API。传统循环提供了对底层操作的精细控制,适用于对性能有严格要求的场景,但需要手动管理数组大小。而Stream API则以其简洁、富有表现力的语法,极大地提升了代码的可读性和开发效率,是现代Java开发的首选。在实际应用中,开发者应根据项目需求、数据规模以及对性能和代码可读性的权衡来选择最适合的方法。无论选择哪种方式,理解其工作原理和潜在的优缺点都至关重要。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.4万人学习

C# 教程
C# 教程

共94课时 | 6.5万人学习

Java 教程
Java 教程

共578课时 | 44.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号