【问题标题】:Altering objects that have been set equal更改已设置为相等的对象
【发布时间】:2015-09-23 20:28:29
【问题描述】:

我正在设置一个数组等于另一个数组。

假设数组 B = 数组 C。

那么,如果我对数组 B 进行操作,改变它的值,C 也会改变吗?

我想说绝对不是,但我脑子里放了个屁,我觉得我的代码现在正在发生这种情况。

【问题讨论】:

  • 你使用什么编程语言?
  • 是的,数组 C 也会改变。当您从一个数组分配到另一个数组时,发生的情况是变量(在您的示例中为B)只是引用了C 引用的同一个数组。它不会复制数组,它只是复制引用。
  • 非常感谢!你知道如何使 B 成为 C 的副本,并且我可以修改 B 而不会对 C 进行任何更改吗?

标签: java arrays object set equals


【解决方案1】:

当您将一个数组分配给另一个数组时,该数组将保存引用,因此如果您更改一个数组中的值,那么它肯定会更改另一个数组的值。

就像您的示例数组 B = 数组 C。B 将保存对数组 C 的引用。因此数组 B 中的任何更改都将反映在数组 C 中。

【讨论】:

    【解决方案2】:

    是的,它们已更改。

    数组是一个对象,因此在赋值“数组 B = 数组 C”之后,您只分配引用。这两个变量将具有相同的引用。结果,您将拥有一个对象和两个引用

    更新

    对于“真实副本”,您需要使用System.arraycopy()Arrays.copyOf()

    int[] arrayC = {1,2,3,4,5,6,7,8,9,10};
    int[] arrayB = new int[arrayC.length];
    System.arraycopy(arrayC, 0, arrayB, 0, arrayC.length );
    

    【讨论】:

    • 哇,谢谢你们,解决了这个问题。那么让 B 成为数组 C 的副本的最佳方法是什么,以便我可以从 C 的值开始,更改它们,而不是让它们实际更改数组 C。
    • 查看 py 更新 - 您需要使用 System.arraycopy() 或 Arrays.copyOf()。 Arrays.copyOf() 在里面也使用 System.arraycopy() 。和 System.arraycopy() 通过 JNI 进行复制 - 所以它必须比你在循环中一个接一个地复制数组时更快
    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多