在一个数组中改变值会导致另一个数组中的值也发生改变。

3

我有一个非常奇怪的问题。在我的活动中,我声明了两个数组:

private String original[] = new String[100];
private String changed[] = new String[100];

然后我在OnCreate中为这两个数组赋值:

Bundle extras = getIntent().getExtras();

if (extras != null) {
      original = extras.getStringArray("sentArray");

      changed = original;
}

现在,如果我更改了changed数组的成员值,那么original数组中也将具有相应更改后的成员值。
例如,在我执行以下操作后:
changed[0] = "New value";

original[0]的值也是"New value",这是怎么实现的呢?这是一个bug吗?

4个回答

8
 changed = original;

这行代码将“changed”设置为“original”,使它们成为具有相同指针的相同数组。您需要复制该数组而不是将已更改的数组设置为原始数组。

您可以尝试使用System.arraycopy()


3

Java中的所有内容都是按值传递的。在数组的情况下,(它只是一个对象)数组引用被按值传递。(就像对象引用一样被按值传递)

当您将数组传递给其他方法时,实际上是复制对该数组的引用。

通过该引用更改数组内容将影响原始数组。但更改引用以指向新数组将不会更改原始方法中的现有引用。

用途:

System.arraycopy()

查看这个


0

当你像这样复制一个数组:

changed = original;

你只是复制了数组的引用。如果你想要将一个数组的所有值复制到另一个数组中,可以这样做:

for(int i = 0; i < original.size(); i++){
    changed[i] = original[i];
}

这是一种你可以做到这一点的方法。 如果你更改第一个或第二个的任何内容,另一个将保持不变。

希望我能帮到你。


0
当我们执行Changed = Original时,实际上我们在分配数组的引用。因此,如果我们对一个数组进行任何更改,它也会反映在另一个数组中,因为ChangedOriginal都指向同一位置。
我们也可以使用System.arraycopy()方法。系统存在于java.lang包中。它的签名如下:
public static void arraycopy(Object src, int srcPos, Object dest, 
                             int destPos, int length)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接