gpt4 book ai didi

java - 为什么改变一个 ArrayList 中的对象会改变所有其他 ArrayList 中的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:38:12 24 4
gpt4 key购买 nike

我正在制作一个 CPU 调度模拟器(用于学校项目)。我的 roundRobin 函数有问题。当我执行 c.get(i).jobTime -= 2;c.get(i).jobTime -= 1; 时,它会影响我的另一个 ArrayList s,所以我无法执行其他功能。在调用 roundRobin2 之前,我的列表完全正常。为什么会这样?

例如,这是我的 list4roundRobin2 之后的样子

列表 4:[Job101 0,Job102 0,Job103 0,Job104 0,Job105 0,Job106 0]

这就是我读取文件并将 Jobs 对象放入我的 ArrayList 中的方式。

Scanner input = new Scanner(new File("testdata1.txt"));
ArrayList<Jobs> list = new ArrayList<Jobs>();
ArrayList<Jobs> list2 = new ArrayList<Jobs>();
ArrayList<Jobs> list3 = new ArrayList<Jobs>();
ArrayList<Jobs> list4 = new ArrayList<Jobs>();

Jobs first;

while (input.hasNext()) {
first = new Jobs(input.next(), input.nextInt());
list.add(first);
list2.add(first);
list3.add(first);
list4.add(first);
}

input.close();

这是我的roundRobin2

public void roundRobin2(ArrayList<Jobs> c, int sT) {
int size = c.size();
int cT = 0;
int ccT = 0;
while (!c.isEmpty()) {
int i = 0;
System.out.println(c);
for (i = 0; i < size; i++) {
if ((c.get(i).jobTime) >= 2) {
c.get(i).jobTime -= 2;
cT += 2;

if ((c.get(i).jobTime) == 0) {
ccT += cT;
}
} else {
(c.get(i).jobTime) -= 1;
cT += 1;

if ((c.get(i).jobTime) == 0) {
ccT += cT;
}
}
}
for (i = 0; i < size; i++) {
if ((c.get(i).jobTime) == 0) {
c.remove(i);
size = c.size();
}
}
}
System.out.println("\nAverage completion times: "+ccT+"/"+sT+" = "+((ccT)/sT));
}

最佳答案

在每次迭代中,您只创建一个对象并将其添加到所有 4 个列表中。当你改变那个对象时,你,好吧,改变它。该突变将反射(reflect)在所有列表中,因为它们都存储相同的对象引用。

while (input.hasNext()) {
first = new Jobs(input.next(), input.nextInt());
list.add(first);
list2.add(first);
list3.add(first);
list4.add(first);
}

相反,您需要向每个列表添加一个新的对象引用(如果您希望在每个列表中存储该对象的克隆)。

while (input.hasNext()) {
String s = input.next();
int i = input.nextInt();
list.add(new Jobs(s, i));
list2.add(new Jobs(s, i));
list3.add(new Jobs(s, i));
list4.add(new Jobs(s, i));
}

在第一个代码示例中,list.get(n) == list2.get(n) 将为 true(对于任何有效的 n 为 true code> 以及 4) 中的任意两个列表。在第二个示例中,它将是 false,因为您现在拥有完全不相关的对象,这些对象恰好在它们被添加到列表时存储相同的值。

关于java - 为什么改变一个 ArrayList 中的对象会改变所有其他 ArrayList 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31972527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com