增强的for循环很奇怪。为什么
int size = 10;
Random random = new Random();
int[] scores = new int[size];
for (int score : scores) {
scores[score] = random.nextInt(size);
}
System.out.println(Arrays.toString(scores));
给我一个大部分为空的数组,其中只有第一个元素是随机数, 同时:
int size = 10;
Random random = new Random();
int[] scores = new int[size];
for (int i = 0; i < scores.length; i++){
scores[i] = random.nextInt(size);
}
System.out.println(Arrays.toString(scores));
给了我想要的东西:一个由随机数字组成的10元素数组? 我以为这两个循环是彼此的替换;但是当谈到Random()时,它只是第一个被改变的元素?
答案 0 :(得分:4)
增强的for循环:
for (int score : scores)
迭代数组的值,而不是索引。
使用int[] scores = new int[size]
实例化数组时,默认情况下,这些值都会初始化为0
。
因此:
scores[score] = random.nextInt(size);
总是:
scores[0] = random.nextInt(size);
当你需要修改一个数组时,你应该使用传统的for循环,它遍历索引。
答案 1 :(得分:3)
这些是不同的结构。基本上在第一个循环中,你说&#34;去获取scores
的所有元素并在你的情况下循环它们. You don't get the index, you get the actual values which will always be
0`!
for (int score : scores){
// score is always 0!
scores[score] = random.nextInt(size);
}
您的第二个循环,正如您已经想到的那样,为您提供索引(i
)而不是scores
数组中的值。
答案 2 :(得分:2)
实际上你有两个不同的循环,
for (int score : scores){
和
for (int i = 0; i < scores.length; i++){
第一个给出value
数组(不是指定数组的索引),而第二个给出index
。如上所述,下面代码的含义会发生变化
scores[score] = random.nextInt(size);
因此,假设您的数组具有值1,2,5
,因此您基本上会在第一个循环中访问索引1
,2
和5
,另一方面,第二个循环将值分配给特定索引,该索引与0
,1
和2
一致。
由于使用默认值scores
初始化0
,因此在每次迭代中,它都在0
索引处更新值。
答案 3 :(得分:2)
似乎你对Java中的增强循环有一个误解,因为它是一个foreach循环并迭代数组的值,而不是遍历键:
请看以下示例
String[] my_string_array = new String[]{"Dog","House","Cat"};
for(String s: my_string_array){
System.out.println(s); //prints "Dog", then "House", then "cat"
//s equals one entry of the Array
}
在您的示例中,数组的每个条目都是0,因为这是整数的默认值。 因此,在每次重复数组时,都会发生以下情况
scores[0] = random.nextInt(size);
我希望您了解第一个代码的问题。 只需使用第一个,它是工作和最佳实践。