为什么改变一个 ArrayList 中的对象会改变所有其他 ArrayList 中的对象?
Why does mutating an object in one ArrayList change it in all other ArrayLists?
我正在制作一个 cpu 调度模拟器(用于学校项目)。我的 roundRobin
函数有问题。当我执行 c.get(i).jobTime -= 2;
和 c.get(i).jobTime -= 1;
时,它会影响我的其他 ArrayList
,因此我无法执行其他功能。在我打电话给 roundRobin2
之前,我的列表是完全正常的。为什么会这样?
例如,这就是我的 list4
在 roundRobin2
之后的样子
list 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 个列表中。当你改变那个对象时,你,好吧,改变它。该变更将反映在所有列表中,因为它们都存储相同的对象引用。
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
和您的 4 中的任何两个列表都是如此)。在第二个示例中,它将是 false
,因为您现在拥有完全不相关的对象,这些对象恰好在将它们添加到列表时存储相同的值。
我正在制作一个 cpu 调度模拟器(用于学校项目)。我的 roundRobin
函数有问题。当我执行 c.get(i).jobTime -= 2;
和 c.get(i).jobTime -= 1;
时,它会影响我的其他 ArrayList
,因此我无法执行其他功能。在我打电话给 roundRobin2
之前,我的列表是完全正常的。为什么会这样?
例如,这就是我的 list4
在 roundRobin2
list 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 个列表中。当你改变那个对象时,你,好吧,改变它。该变更将反映在所有列表中,因为它们都存储相同的对象引用。
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
和您的 4 中的任何两个列表都是如此)。在第二个示例中,它将是 false
,因为您现在拥有完全不相关的对象,这些对象恰好在将它们添加到列表时存储相同的值。