【问题标题】:Java Array CopyJava 数组复制
【发布时间】:2013-09-14 09:09:31
【问题描述】:

我有一个 IntArray A。

int[] A={1,2,3};

然后我把它复制到 B。

int[] B=A;

现在我想更改 A 中的元素;

A[1]=B[2];

我希望 A 现在变成 {1,3,3},而 B 保持相同的 {1,2,3}。

为什么B改成[1,3,3]?

【问题讨论】:

标签: java arrays


【解决方案1】:

它们都是不是单独的数组。

你写的

int[] B=A;

因为有指向同一个数组。

如果您自动更改 A,B 更改。

如果您想让B 成为常​​量,请以B 的名义创建一个新数组。

int[] B = new int[3];

正如您与通过引用和值传递混淆:Is Java "pass-by-reference" or "pass-by-value"?

【讨论】:

  • 谢谢,那我要不要通过 for 循环复制这些值?
【解决方案2】:

因为您没有复制数组,所以使用引用很简单。

这意味着,如果您创建一个数组,您就是在为该变量分配一块内存。

int[] array ----------------> PieceOfMemory

如果你像以前一样“复制”数组,你只是告诉另一个变量指向同一块内存

int[] array ----------------> PieceOfMemory <----------------- int[] secondArray

在这种情况下,如果您更改“PieceOfMemory”,则很明显您正在更改两个变量。

如果你想复制数组,你必须这样做:

int[] firstArray = {1,2,3};
int[] secondArray = new int[3];
secondArray = (int[]) clone(firstArray);

现在发生的事情是这样的:

int[] firstArray ---------------------> firstPieceOfMemory
int[] secondArray --------------------> secondPieceOfMemory

但是值被复制了。

【讨论】:

  • 欣赏它。现在我确实明白 Java 完全是通过引用传递的。我是否使用克隆来强制它按值传递?克隆是否适用于其他类?谢谢。
  • 我建议您查看 javadoc 和 Java 文档,这是了解“www”的唯一方法:什么在哪里有效。有些类使用克隆,有些则不使用,您甚至可以覆盖默认克隆方法或为您的 POJO(普通旧 java 对象)创建一个。我也建议你看看这个问题stackoverflow.com/questions/40480/is-java-pass-by-reference
  • @NewbieDave Java NOT 通过引用传递!它总是按值传递,但值是引用而不是被引用的对象。
  • @Gianmarco 这个secondArray = (int[]) clone(firstArray); 你是说secondArray = firstArray.clone(); 吗?
【解决方案3】:

当你这样做时

int[] B=A;

BA 都指向相同的后备数组BA 这里只是 references 指向同一个底层数组。

A ----->[1,2,3]
           ^
B----------|

要制作新副本,您可以使用Arrays#copyOf 或手动创建新数组并逐个复制字段。

【讨论】:

    【解决方案4】:

    您需要了解对象和引用之间的区别

    B=A;不是制作数据的副本,而是对数据的引用的副本。

    【讨论】:

    • Java 中的一切都是通过引用传递的吗?不值?所以Java中没有指针?
    • @NewbieDave 是的。对于对象,您可以说通过引用传递,基元是通过值传递。再次是的,java 中没有指针。简单而干净:)
    • @NewbieDave 不,Java 总是按值传递。但价值是参考,而不是数据。您总是将引用副本传递给同一个对象。
    • @NewbieDave 正如 fabian 所说,该引用可以是保存该引用地址的原始值。
    • @sᴜʀᴇsʜᴀᴛᴛᴀ 实际上,除了原语之外的一切都是指针。实际的限制是你不能自己计算指针。
    【解决方案5】:

    因为 B 不是一个新数组,它只是 A 所引用的数组的另一个名称。

    【讨论】:

      【解决方案6】:

      是的 B 也更改为 {1,3,3} 因为 A 和 B 只是引用存储数组的实际内存对于两个数组来说都是相同的,所以两个数组都包含相同的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 2012-05-12
        • 2023-03-20
        • 2012-04-25
        • 1970-01-01
        相关资源
        最近更新 更多