当我在测试两个明显相似的代码时遇到问题时,我试图用随机vector2填充数组“星星”。
头
Array<Vector2> stars;
int numStars;
第一个代码
public void initStars() {
int a = 100;
int b = 120;
numStars = (int) (a * b * 0.01f);
stars = new Array<Vector2>(numStars);
Random rand = new Random();
Vector2 star = new Vector2();
for (int i = 0 ;i <numStars ;i++){
star.set(rand.nextInt(a),rand.nextInt(b));
stars.add(star);
}
}
第二代码
public void initStars() {
int a = 100;
int b = 120;
numStars = (int) (a * b * 0.01f);
stars = new Array<Vector2>(numStars);
Random rand = new Random();
for (int i = 0 ;i <numStars ;i++){
Vector2 star = new Vector2();
star.set(rand.nextInt(a),rand.nextInt(b));
stars.add(star);
}
}
第一个没有用,只需用循环中生成的最后一个随机向量填充数组,即。数组中的所有向量都是相等的,第二个是完美的,我的问题是,为什么会发生这种情况,如果这两个代码显然是等价的。
答案 0 :(得分:1)
第一段代码无法工作。仔细看看:
Vector2 star = new Vector2();
for (int i = 0 ;i <numStars ;i++){
star.set(rand.nextInt(a),rand.nextInt(b));
stars.add(star);
}
您创建矢量 ONCE ,然后继续为其分配新坐标,然后将其添加到集合中。当您致电set()
时,您正在设置相同矢量的值(因为您仍在引用相同的矢量)。
结果是您在集合中numStars
次存储了相同的向量,这正是您所注意到的。
也许为了使这个更具体,你在第一个场景中创建的内容基本上是这样的:
stars = [starA, starA, starA, ..., starA]
第二个是这个:
stars = [starA, starB, starC, ..., starZ]
如果您拨打starA.set()
,在第一种情况下,您不仅要修改要添加的星标;你正在修改你之前放置的每颗星(因为它们是同一颗星!)。
希望这有帮助。
答案 1 :(得分:1)
不,他们不等同。在Java中,使用数据结构时,只传递指针,而不是实际对象。
因此,在您的第一个代码段中,您只有一个实际Vector2
对象,该对象会重复添加到Array
。因此,Array
中的每个元素都指向同一个对象,它们都具有相同的值。这等于分配给star
变量的最后一个值。
然而,第二个代码段确实有效,因为每个点都有自己的Vector2
对象,这意味着Array
中的每个元素都指向不同的对象< / em>在创建时随机分配它自己的值。