循环中ArrayList的初始化错误

时间:2012-12-01 07:55:24

标签: java for-loop arraylist initialization

在Android中进行编码时,我需要一个我称之为wormPt的PointsList。我通过循环初始化它。

ArrayList<Point> wormPt = new ArrayList<Point>();
Point pt = new Point();
.
.
.
private void initializeWorm() {
    // TODO Auto-generated method stub
    pt.x = 220;
    pt.y = 300;
    for (int i = 0; i <= 5; i++) {
        wormPt.add(pt);
        Log.d("wormdebug", wormPt.toString());

        pt.x -= 5;
    }
    Log.d("wormdebug", wormPt.toString());
}

我的上一次log.d应报告点数 (220300) (215300) (210300) (205300) (200,300) (195300)

相反,我的所有观点都是(190,300)

这是我的日志数据

11-21 23:48:11.549: D/wormdebug(3273): [Point(220, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(215, 300), Point(215, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(210, 300), Point(210, 300), Point(210, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(205, 300), Point(205, 300), Point(205, 300), Point(205, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(200, 300), Point(200, 300), Point(200, 300), Point(200, 300), Point(200, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(195, 300), Point(195, 300), Point(195, 300), Point(195, 300), Point(195, 300), Point(195, 300)]
11-21 23:48:11.630: D/wormdebug(3273): [Point(190, 300), Point(190, 300), Point(190, 300), Point(190, 300), Point(190, 300), Point(190, 300)]
11-21 23:48:14.669: W/KeyCharacterMap(3273): No keyboard for id 0
11-21 23:48:14.679: W/KeyCharacterMap(3273): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

我试过了 Can't add element to ArrayList in for loop和其他人,但他们似乎没有同样的问题。任何帮助将不胜感激。 提前谢谢。

4 个答案:

答案 0 :(得分:5)

问题是您的ArrayList包含对同一对象的多个引用。你在循环中所做的就是添加相同的引用并改变对象。

如果您更改循环以在每次迭代时创建 new Point,它将起作用:

int x = 220;
for (int i = 0; i <= 5; i++) {
    wormPt.add(new Point(x, 300));
    x -= 5;
}

理解变量对象引用之间的区别非常重要。 pt是一个变量。它的值是对Point对象的引用。除非你要求一个新的对象,否则Java不会为你创建一个。例如:

Point a = new Point(10, 20);
Point b = a; // Copies the *reference*
a.x = 100;
System.out.println(b.x); // 100

请注意,这并不是将a和b 变量相互关联 - 它只是给它们相同的值(相同的参考)。因此,您可以稍后将a更改为对其他Point的引用,并且不会更改b

Point a = new Point(10, 20);
Point b = a; // Copies the *reference*
a.x = 100;
a = new Point(0, 0); // This doesn't affect b, or the object its value refers to
System.out.println(b.x); // 100

在这种情况下,它有点像给10个不同的人一张纸上的家庭住址。如果一个的人访问该地址并将前门涂成绿色,那么他们中的另一个访问该地址,他们将看到一个绿色的前门。

答案 1 :(得分:1)

每次添加到new Point时,您都必须创建ArrayList。相反,只有一个Point具有不断变化的坐标。

答案 2 :(得分:0)

这很简单。您正在将相同的对象添加到列表...

你应该在循环的每次迭代中创建一个新对象,然后将其添加到列表中。

尝试类似:

wormPt.add(new Point(x, 300));

答案 3 :(得分:0)

声明

wormPt.add(pt);

导致将相同的对象添加到ArrayList中。

您需要将Point的不同对象添加到arraylist中。

为此你可以使用
 new Point(x, y)

你可以创建一个像对象的对象 Point p = new Point(x,y)

然后将其添加到arraylist。