当我更新它外部的变量时,为什么这个 <int[]> arrayList 会发生变化?我该如何解决这个问题?

问题描述 投票:0回答:1

我有一个 arrayList 并在其中添加了一个 int[]

variables
。然而,当我更改
variables
时,arrayList 内的 int[] 也会更新。这里有什么问题吗?


import java.util.*;
public class test2 {
    public static void main (String[] args) {

        //adding an int[] to an int[] arrayList
        ArrayList<int[]> arr = new ArrayList<>();
        int[] variables = {10, 20};  
        arr.add(variables);
        System.out.println(arr.get(0)[0] + " " + arr.get(0)[1]); // prints: 10 20

        // changing the variables
        variables[0] = 0;
        variables[1] = 5;

        // why does arr's int[] change?
        System.out.println(arr.get(0)[0] + " " + arr.get(0)[1]); // prints: 0 5
        
    }
}

我可以轻松地为

x = variables[0]
y = variables[1]
创建两个单独的变量,并使用
arr.add(new int[] {x, y})
将其添加到 arrayList,但是对于非常大的变量,情况不会如此。

java arraylist
1个回答
0
投票

int[] variables = {10, 20};

这会创建一个新对象(类似于从无到有地弹出宝藏,然后将其埋在广阔的海滩中),然后将一个引用分配给变量

variables
variables
就像一张藏宝图;’为其指定一个引用’就像将地图擦拭干净,然后在地图上涂上埋藏的宝藏。

variables[0] = 5;

这是爪哇语:获取藏宝图

variables
。跟着它。往下挖。打开宝箱。取出您在该箱子内第一部分中找到的硬币并将其替换为“5”。

arr.add(variables);

这会将 参考(藏宝图)、不是对象(不是宝藏!)添加到

arr

但我想把宝藏放在arr里!

这是不可能的。 Java 不是这样工作的。除了基元之外,一切都是参考

如何解决?

数一下

new
int[] v = {10, 20};
int[] v = new int[] {10, 20}
的语法糖。这就是你拥有的对象数量。

如果您想要一个包含 10 个独立 int 数组的数组列表,则需要 2 个独立的

new
。或者你拥有的只是藏宝图文件夹,每张地图都指向同一个宝藏。

数组实现

clone()
,如果你想要的话:

int[] data = {10, 20};
List<int[]> list = new ArrayList<int[]>();
for (int i = 0; i < 10; i++) list.add(data.clone());
list.get(0)[0] = 50;
System.out.println(list.get(1)[0]); // prints 10.

删除

clone()
,就会打印出 50。

© www.soinside.com 2019 - 2024. All rights reserved.