【问题标题】:How to pass a two dimensional array by value in Java?如何在Java中按值传递二维数组?
【发布时间】:2016-05-29 01:00:07
【问题描述】:

我的数组是这样的:

int[][] arr = new int[3][4];

我想忽略函数中数组发生的更改。如何按值传递给函数?

谢谢。

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    您不能按值传递数组。

    保持原始数组不变的唯一方法是将数组的副本传递给您的方法。请注意,对于多维数组,您不能使用 Arrays.copyOf 创建该副本,因为它执行浅拷贝,因此不会复制内部数组(它们的引用将被复制)。

    public static int[][] cloneArray(int[][] src) {
        int length = src.length;
        int[][] target = new int[length][src[0].length];
        for (int i = 0; i < length; i++) {
            System.arraycopy(src[i], 0, target[i], 0, src[i].length);
        }
        return target;
    }
    

    【讨论】:

      【解决方案2】:

      在 Java 中,您不能按值传递数组(或任何 Object)。对Objects 的引用按值传递,使被调用的方法能够完全访问对象内的数据。

      要解决此问题,请执行以下操作之一:

      • 停止对方法内的原始数组进行更改。相反,明确地制作一个副本,然后进行处理。
      • 上述方法很脆弱,因为 Java 不强制执行“无更改”要求。另一种方法是将您的数组封装在一个不可变类中,并让该类处理制作数组的副本。
      • 最后,您可以创建一个类,为您提供一个完全封装的数组,并实现copy-on-write 策略。这种方法可让您在需要时制作副本,从而有可能提高性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 2015-07-20
        相关资源
        最近更新 更多