为什么在一个ArrayList中改变一个对象会在所有其他ArrayLists中改变它?

时间:2015-08-12 18:14:13

标签: java arraylist scheduling round-robin

我正在制作一个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));
}

2 个答案:

答案 0 :(得分:12)

在每次迭代中,您只创建一个对象并将其添加到所有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,因为您现在拥有完全不相关的对象,恰好在它们添加到列表时存储相同的值。

答案 1 :(得分:-1)

虽然与您的问题没有直接关系,但您可能希望阅读此处指出的一些答案,以了解您的问题的性质。更好。

Is Java "pass-by-reference" or "pass-by-value"?

它不是一个真正的bug,它是一个Java内在属性:)

祝你好运