Java中的ArrayList问题

时间:2010-11-12 05:14:38

标签: java arraylist

我有问题让我的ArrayList正确添加。当我在for循环完成后打印ArrayList时,ArrayList的长度是正确的,但是每个元素都是相同的(创建的最后一个Coordinate)。

有人可以修复(并解释)下面的代码吗?

public class test {

private static ArrayList<Coordinate> mOrigCoords;
private static ArrayList<Coordinate> mNewCoords;
private static int mListSize;
private static int mPixelsX;

public static void main(String[] args) 
{

    mOrigCoords = new ArrayList<Coordinate>();
    mNewCoords  = new ArrayList<Coordinate>();

    mPixelsX = 480;

    int j = 0;

    Coordinate newCoord = new Coordinate(0,0);

    for(int i = 0; i < 96; i++)
    {
        j = j + 5;

        newCoord.setX(j);
        newCoord.setY((int)(Math.random()*300));

        mOrigCoords.add(newCoord);
    }

    mListSize = mOrigCoords.size();

    for(int n = 0; n < mListSize; n++)
    {
        System.out.println("test " + mOrigCoords.get(n).toString());
    }

}
}

提前感谢您的帮助!

7 个答案:

答案 0 :(得分:10)

而不是

Coordinate newCoord = new Coordinate(0,0);

    for(int i = 0; i < 96; i++)
    {
        j = j + 5;

        newCoord.setX(j);
        newCoord.setY((int)(Math.random()*300));

        mOrigCoords.add(newCoord);
    }
你应该

Coordinate newCoord = null;

for(int i = 0; i < 96; i++)
{
    newCoord = new Coordinate(0,0);
    j = j + 5;

    newCoord.setX(j);
    newCoord.setY((int)(Math.random()*300));

    mOrigCoords.add(newCoord);
}

这样,arrayList将保存许多对象而不是只有一个对象。 ArrayList中的所有元素都指向同一个对象,这是导致问题的原因。

答案 1 :(得分:4)

你必须这样做:

Coordinate newCoord;
for(int i = 0; i < 96; i++)
    {
    newCoord = new Coordinate(0,0);
    ...

因为在您的情况下,您每次都要设置相同的对象(newCoord)。

答案 2 :(得分:2)

这是因为您每次在循环中添加相同的坐标对象。你需要为循环的每次迭代创建新的坐标对象。

答案 3 :(得分:2)

这里的问题是你永远不会创建你的Coorddinates的新实例。所以每次你修改newCoord你修改同一个实例。 Arraylist不会复制该对象,它只是将其引用存储在列表中,这意味着如果您不创建新实例,则始终添加相同的

试试这个

协调新协议;

for(int i = 0; i < 96; i++)
{
    j = j + 5;

    //newCoord.setX(j);
    //newCoord.setY((int)(Math.random()*300));

    mOrigCoords.add(new Coordinate(j,(int)(Math.random()*300)));
}

mListSize = mOrigCoords.size();

for(int n = 0; n < mListSize; n++)
{
    System.out.println("test " + mOrigCoords.get(n).toString());
}

答案 4 :(得分:2)

在上面的代码中,您每次都添加相同的实例。您只创建了一个实例,并一次又一次地添加它直到循环迭代。

因此,每次将一个新的Coordinate类实例放入列表中。它会给你不同的打印结果。

如同其他解决方案所示。 希望这会对你有所帮助。

答案 5 :(得分:0)

每次迭代,您都会重新添加Coordinate的同一个实例。然后,您重置该实例上的值。在循环结束时,您有96个索引指向同一个对象,该索引已在每次迭代时更新。

答案 6 :(得分:0)

这是因为作为“Coordinate”类属性的X和Y是静态属性,因此对象在内存中有一个副本。所有实例都指向相同的地址。你不应该使用“static”关键字,这样他们就可以使用自己的副本并拥有不同的值。