62,625
社区成员
发帖
与我相关
我的任务
分享import java.util.Arrays;
public class forEach {
public static void main(String[] args) {
int[] a = new int[5];
for(int n:a){
n = (int)(Math.random()*100);
}
System.out.println(Arrays.toString(a));
}
}
int[] a = new int[5];
for(int n:a){
n = (int)(Math.random()*100);
}
编译后,其实就成了
int[] a = new int[5];
int len = a.length;
for (int i = 0; i < len; i++) {
int n = a[i];
n = (int) (Math.random() * 100);
}
所以,你操作的其实是临时变量n,而不是a[i]
在jvm中,n其实对应的是栈上的一个引用槽,你下面的 n = (int) (Math.random() * 100);是对这个引用槽进行的操作,所以无法反馈到a[i]上。
+--------+
| a[] |
+--------+
| len=5 |
+-----+ +--------+
| n |----->| a[0]=0 |
+-----+ +--------+
| a[1]=0 |
+--------+
| a[2]=0 |
+--------+
| a[3]=0 |
+--------+
| a[4]=0 |
+--------+
在迭代中,给 n 进行了赋值,内存现在变成这样了:
+--------+
| a[] |
+--------+
| len=5 |
+-----+ +--------+
| n | | a[0]=0 |
+--+--+ +--------+
| | a[1]=0 |
V +--------+
+-----+ | a[2]=0 |
| 78 | +--------+
+-----+ | a[3]=0 |
+--------+
| a[4]=0 |
+--------+
因为你改变的是临时变量的值,而不是数组中的值,n = a[0] 表示的是将 a[0] 的值赋给 n,之后再用 n = 5 表示将 n 的值变更为 5,这时 a[0] 的值是不会变的。
如果 n 和 a 都是对象,那情况就不同了,这个以后你慢慢就会学会的。
PS:类名的首字母以后记得大写哦
import java.util.Arrays;
public class forEach {
public static void main(String[] args) {
int[] a = new int[5];
for(int i=0;i<a.length;i++){
a[i]=(int)(Math.randm()*100);
}
System.out.println(Arrays.toString(a));
}
}
这样行!