gpt4 book ai didi

java - 循环中 ArrayList 的错误初始化

转载 作者:行者123 更新时间:2023-11-29 07:11:20 28 4
gpt4 key购买 nike

在 Android 中编码时,我需要一个名为 wormPt 的点数组列表。我通过循环对其进行了初始化。

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应该报分(220,300)(215,300)(210,300)(205,300)(200,300)(195,300)

相反,我所有的积分都是(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和其他人,但他们似乎没有同样的问题。任何帮助将不胜感激。提前致谢。

最佳答案

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

如果您更改循环以在每次迭代时创建一个 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 个不同的人一张写有您家庭住址的纸。如果这些人中的一个访问了该地址并将前门涂成绿色,然后另一个人访问了该地址,他们将看到一个绿色的前门。

关于java - 循环中 ArrayList 的错误初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13657556/

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