增强for循环为什么不能给int[]赋值呢???

chen58683632 2017-06-08 08:53:35
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));
}

}

今天突然想用增强for循环给int[]每个元素附随机数,可是没有实现是为什么呢?结果总是[0,0,0,0,0]
...全文
1352 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆教教主 2017-06-21
  • 打赏
  • 举报
回复
n仅仅是一个局部变量啊,还有加强for循环一般用于读取
刘温柔_ 2017-06-20
  • 打赏
  • 举报
回复
for增强循环最大的特点就是只能访问数组的每个元素却无法改变他的值、就是你可以访问、也可以用它、就是不能改他
fei550223122 2017-06-15
  • 打赏
  • 举报
回复
for(int n:a){ n = (int)(Math.random()*100); } 可以这么理解吧: n = a[i]; n=(int)(Math.random()*100); 没有赋值
zs808 2017-06-15
  • 打赏
  • 举报
回复
所谓的“增强for循环”只是一个语法糖罢了。

        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]上。
有意思点 2017-06-14
  • 打赏
  • 举报
回复
引用 14 楼 bao110908 的回复:
因为 n 是临时变量哦,在第一次迭代时,内存中的结构是这样的:

             +--------+
             |   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:类名的首字母以后记得大写哦
这个骚
善良的修罗 2017-06-13
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复 1
因为 n 是临时变量哦,在第一次迭代时,内存中的结构是这样的:

             +--------+
             |   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:类名的首字母以后记得大写哦
小灰狼 2017-06-12
  • 打赏
  • 举报
回复
n 应该只是数组元素里的一个副本而已,你改了它的值,但数组元素里的值还是老样子
SharesSmile 2017-06-12
  • 打赏
  • 举报
回复
兄弟你这不对啊 !加强for循环不能对数据操作 。你在好好理解加强for循环。

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));
    }
}
这样行!
mmqw 2017-06-12
  • 打赏
  • 举报
回复
int 是基本类型,=只能赋值,不能进行地址拷贝 只有继承Object的对象(String有特殊处理),可以这样处理
Talentc111 2017-06-12
  • 打赏
  • 举报
回复
n只是作为了临时的变量去存取你数组里面的值,而你未改变数组的本身,所以数组的值不变。
qq_39009232 2017-06-09
  • 打赏
  • 举报
回复
增强for循环只能查看遍历查看里面的元素,他的底层是迭代器,不能修改元素,只能获取。
萧逸才 2017-06-08
  • 打赏
  • 举报
回复
for(int n:a){ n = (int)(Math.random()*100); } 中你只是把随机数赋给了n,但是n和a有什么关系呢,关系如下 n = a[0]; n = a[1]; ... n = a[4]; 在和n = (int)(Math.random()*100);对比一下,你会发现a和(int)(Math.random()*100);没关系
自由自在_Yu 2017-06-08
  • 打赏
  • 举报
回复
增强for循环不能这么用,就是你把值赋给了n,但是n只是用来临时代替int[]的值,不能影响int[]的值 所以你赋值是不会影响int[]的值,增强for循环一般都是用来读取的。
chen58683632 2017-06-08
  • 打赏
  • 举报
回复
引用 1 楼 HinanaiTenshi 的回复:
在java里基本类型和它的包装类重新赋值意味着什么?
不懂哎大神,本人小白
李大白白 2017-06-08
  • 打赏
  • 举报
回复
foreach中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值。因此如果希望改变数组元素的值,则不能使用foreach循环。
HinanaiTenshi 2017-06-08
  • 打赏
  • 举报
回复
在java里基本类型和它的包装类重新赋值意味着什么?
戴小码 2017-06-08
  • 打赏
  • 举报
回复
public static void main(String[] args) { int[] a = new int[5]; for(int i=0;i<a.length;i++){ a[i]=(int) (Math.random()*100); } for(int n:a){ System.out.println(n); } } 这样用更符合实际需求。
戴小码 2017-06-08
  • 打赏
  • 举报
回复
对啊!你这只是改变了n的值,再说foreach实际使用中一般是用来替代for循环取值的,可不是你这种用法。

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧