Java 如何制作数组的副本,使副本中的任何更改都不会';不影响原来的吗?

Java 如何制作数组的副本,使副本中的任何更改都不会';不影响原来的吗?,java,Java,我需要在循环中每次调用一个数组,并将其用作另一个方法的输入。然后根据该方法的输出,我需要更新该数组的副本,并在更改后将副本存储在ArrayList中。例如: double[]a={1,2,3,4} 在方法中使用“a”作为输入后,我必须更新“a”并存储在数组列表中,但下次在循环中,我需要再次使用原始“a”。一旦我做了以下工作: double[]copya=a; copya[0]=10; public static void main(String[] args) {

我需要在循环中每次调用一个数组,并将其用作另一个方法的输入。然后根据该方法的输出,我需要更新该数组的副本,并在更改后将副本存储在
ArrayList
中。例如:

double[]a={1,2,3,4}
在方法中使用“
a
”作为输入后,我必须更新“
a
”并存储在数组列表中,但下次在循环中,我需要再次使用原始“
a
”。一旦我做了以下工作:

   double[]copya=a;
   copya[0]=10;
public static void main(String[] args)
{
        int[] first = {1, 2, 3, 4, 5, 6};
        int[] second = {0, 2, 4, 6, 8, 10};

        // Copy two elements from arr1 starting from the second element
        // into arr2 starting at the fourth element:
        System.arraycopy(
                        first,   // From the first array
                        1,       // Starting from the second element
                        second,  // To the second array
                        3,       // Starting at the fourth element
                        2        // Copy two elements
                        );
}
它也改变了原来的“a”。我需要一个“
a
”,比如:

a={1,2,3,4}

即使在更新副本之后。有人能帮我解决这个问题吗?谢谢。

制作
复制
时,您只创建了另一个参考变量,并将其分配给了与
a
相同的对象。现在
a
copy
都引用相同的数组

要复制数组的内容,可以对其进行克隆

double[] copy = a.clone();

这是一个浅拷贝,但对于基本值,这将很好地工作。

在制作
copy
时,您只创建了另一个引用变量,并将其指定给与
a
相同的对象。现在
a
copy
都引用相同的数组

要复制数组的内容,可以对其进行克隆

double[] copy = a.clone();

这是一个浅拷贝,但对于基本值,这将很好地工作。

在制作
copy
时,您只创建了另一个引用变量,并将其指定给与
a
相同的对象。现在
a
copy
都引用相同的数组

要复制数组的内容,可以对其进行克隆

double[] copy = a.clone();

这是一个浅拷贝,但对于基本值,这将很好地工作。

在制作
copy
时,您只创建了另一个引用变量,并将其指定给与
a
相同的对象。现在
a
copy
都引用相同的数组

要复制数组的内容,可以对其进行克隆

double[] copy = a.clone();
这是一个浅拷贝,但对于基本值,它可以正常工作。

使用

复制指定的数组,截断或填充零(如有必要),使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效但在原件中无效的任何索引,副本将包含0d。当且仅当指定的长度大于原始数组的长度时,此类索引才会存在

使用

复制指定的数组,截断或填充零(如有必要),使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效但在原件中无效的任何索引,副本将包含0d。当且仅当指定的长度大于原始数组的长度时,此类索引才会存在

使用

复制指定的数组,截断或填充零(如有必要),使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效但在原件中无效的任何索引,副本将包含0d。当且仅当指定的长度大于原始数组的长度时,此类索引才会存在

使用

复制指定的数组,截断或填充零(如有必要),使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效但在原件中无效的任何索引,副本将包含0d。当且仅当指定的长度大于原始数组的长度时,此类索引才会存在


编辑:根据您在@Edward Samson答案的评论部分添加的内容,下面是一种执行2D数组“深度复制”的方法:

public static double[][] deepCopy(double[][] original) {
    if (original == null) return null;

    double[][] result = new double[original.length][];
    for (int i = 0; i < original.length; i++) {
        System.arraycopy(original[i], 0, result[i], 0, original[i].length);
    }
    return result;
}
输出(对于
)为
{0,2,4,2,3,10}


[示例来源于编辑:根据您在@Edward Samson答案的评论部分添加的内容,下面是一个执行2D数组“深度复制”的方法:

public static double[][] deepCopy(double[][] original) {
    if (original == null) return null;

    double[][] result = new double[original.length][];
    for (int i = 0; i < original.length; i++) {
        System.arraycopy(original[i], 0, result[i], 0, original[i].length);
    }
    return result;
}
输出(对于
)为
{0,2,4,2,3,10}


[示例来源于编辑:根据您在@Edward Samson答案的评论部分添加的内容,下面是一个执行2D数组“深度复制”的方法:

public static double[][] deepCopy(double[][] original) {
    if (original == null) return null;

    double[][] result = new double[original.length][];
    for (int i = 0; i < original.length; i++) {
        System.arraycopy(original[i], 0, result[i], 0, original[i].length);
    }
    return result;
}
输出(对于
)为
{0,2,4,2,3,10}


[示例来源于编辑:根据您在@Edward Samson答案的评论部分添加的内容,下面是一个执行2D数组“深度复制”的方法:

public static double[][] deepCopy(double[][] original) {
    if (original == null) return null;

    double[][] result = new double[original.length][];
    for (int i = 0; i < original.length; i++) {
        System.arraycopy(original[i], 0, result[i], 0, original[i].length);
    }
    return result;
}
输出(对于
)为
{0,2,4,2,3,10}


[示例来源于

注意数组和ArrayList是两种不同类型的集合。从问题的措辞来看,您可能会有点混淆。注意数组和ArrayList是两种不同类型的集合。从问题的措辞来看,您可能会混淆它们位。请注意数组和ArrayList是两种不同类型的集合。从问题的措辞来看,您可能会有点混淆。请注意数组和ArrayList是两种不同类型的集合。从问题的措辞来看,您可能会有点混淆。谢谢您的回答实际上,我的例子是我实际需要的简化版本。我的原始数组是从hashmap中提取的。然后这个数组作为另一个方法的输入。根据方法的输出,我需要更新