java 数组求和 详解

在 Java 中,数组求和是一个常见的操作,可以通过多种方法实现,包括手动遍历、使用流(Stream API)或调用现成的库方法。以下是详细的介绍与代码实现。


1. 使用循环求和

1.1 for 循环

通过常规的 for 循环逐个遍历数组中的元素并累加求和:

代码实现
public class ArraySumExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int sum = 0;

        // 使用 for 循环
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }

        System.out.println("数组求和结果为: " + sum);
    }
}
运行结果
数组求和结果为: 15

1.2 for-each 循环

使用增强的 for-each 循环来遍历数组并求和,代码更简洁。

代码实现
public class ArraySumExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int sum = 0;

        // 使用 for-each 循环
        for (int num : arr) {
            sum += num;
        }

        System.out.println("数组求和结果为: " + sum);
    }
}
运行结果
数组求和结果为: 15

2. 使用 Stream API

Java 8 引入了流式编程,可以通过 Stream 的方法更高效地操作数组并求和。

2.1 使用 Arrays.stream()

通过 Arrays.stream() 创建一个流,并使用 sum() 方法直接求和。

代码实现
import java.util.Arrays;

public class ArraySumExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        // 使用 Stream API
        int sum = Arrays.stream(arr).sum();

        System.out.println("数组求和结果为: " + sum);
    }
}
运行结果
数组求和结果为: 15

2.2 使用 IntStream.of()

除了 Arrays.stream(),也可以使用 IntStream.of() 来生成流并求和。

代码实现
import java.util.stream.IntStream;

public class ArraySumExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        // 使用 IntStream.of()
        int sum = IntStream.of(arr).sum();

        System.out.println("数组求和结果为: " + sum);
    }
}
运行结果
数组求和结果为: 15

3. 使用递归

递归是一种通过函数调用自身来解决问题的方法。可以用递归计算数组的和。

代码实现

public class ArraySumExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        // 调用递归方法
        int sum = sumArray(arr, arr.length - 1);

        System.out.println("数组求和结果为: " + sum);
    }

    // 递归方法
    public static int sumArray(int[] arr, int index) {
        if (index < 0) { // 递归结束条件
            return 0;
        }
        return arr[index] + sumArray(arr, index - 1);
    }
}
运行结果
数组求和结果为: 15

4. 使用第三方库

4.1 Apache Commons Lang 的 ArrayUtils

Apache Commons Lang 提供了数组操作工具类 ArrayUtils,可以方便地对数组进行操作。

代码实现
import org.apache.commons.lang3.ArrayUtils;

public class ArraySumExample {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        // 使用 ArrayUtils.sum()(假设自定义实现)
        int sum = ArrayUtils.sum(arr);

        System.out.println("数组求和结果为: " + sum);
    }
}

注意ArrayUtils 并未直接提供 sum() 方法,但可以通过组合实现类似功能。通常需要引入外部依赖。


5. 多维数组求和

对于多维数组,可以通过嵌套循环实现求和。

代码实现

public class ArraySumExample {
    public static void main(String[] args) {
        int[][] arr = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };

        int sum = 0;

        // 使用嵌套循环求和
        for (int[] row : arr) {
            for (int num : row) {
                sum += num;
            }
        }

        System.out.println("多维数组求和结果为: " + sum);
    }
}
运行结果
多维数组求和结果为: 45

6. 时间复杂度分析

单维数组

  1. 循环求和

    • 时间复杂度:O(n)O(n)O(n),需要遍历数组中的每个元素一次。
    • 空间复杂度:O(1)O(1)O(1),只使用了常量级额外空间。
  2. Stream API

    • 时间复杂度:O(n)O(n)O(n),同样需要遍历数组。
    • 空间复杂度:O(1)O(1)O(1),流的求和方法不会额外开辟内存。
  3. 递归求和

    • 时间复杂度:O(n)O(n)O(n),每个递归调用处理一个数组元素。
    • 空间复杂度:O(n)O(n)O(n),递归调用需要使用栈存储每次调用的状态。

多维数组

  • 如果数组是 m×nm \times nm×n 的二维数组:
    • 时间复杂度:O(m×n)O(m \times n)O(m×n),需要遍历所有元素。
    • 空间复杂度:O(1)O(1)O(1)

7. 总结

方法简单性性能空间复杂度使用场景
循环简单高效O(1)O(1)O(1)常见需求,适用于所有数组
Stream API简洁高效O(1)O(1)O(1)Java 8+,偏向函数式风格
递归较复杂一般O(n)O(n)O(n)小规模数组,教学用途
库方法简洁高效O(1)O(1)O(1)外部依赖项目

选择适合的实现方法取决于具体需求、项目风格和数据规模。对于大部分场景,for 循环和 Stream 是首选。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值