java foreach 只能读不能写------不一定哦

			List<String> list = new ArrayList<String>();
			list.add("1");
			list.add("2");
			list.add("3");
			for(String s: list)
				s = s+"1";
			println(list);

输出:

[1, 2, 3]

看起来 s 好像确实不可写。

再看另外一个例子:

		class A{
			private int i;
			A(int i){
				this.i = i;
			}
			void set(int i){
				this.i = i;
			}
			@Override
			public String toString() {
				return ""+i;
			}
		}
		List<A> aList = new ArrayList<A>();
		aList.add(new A(1));
		aList.add(new A(2));
		aList.add(new A(3));
		for(A a: aList)
			a.set(0);
		println(aList);

输出:

[0, 0, 0]

为什么这个却可以改?

再往下:

int a = 1;//等价于给数组赋值
int b = a;//b指向数组a 也就相当于b是元素变量
b = 2;//更改元素变量
System.out.println(a);//a的值依然是1,只是b变了而已

现在明白了吧:

for(String s: list)
      s = s+"1";

里的 s 只是一个临时引用,它指向 list 中的一个元素,但若你强制让它指向另外一个元素,原来 list 中的元素也不会因此而改变的。但 class A 则有点不一样,它操作的则是原始数据,所以是可以修改 list 中的元素的。

 

因此写 foreach 时注意避免第一种写法。另外,我认为编译器是可以发现并给予警告的:

for(String s: list){
	s = s+"1";
	// 如果后面没有再用到 s 的代码,编译器完全可以对
	// 上述情况进行警告的;如果严格一点,就算后面还有引用
	// s 的代码也可以警告一下的。
}

 

最后给出别人给我的提示来源:http://www.imooc.com/article/11197

转载于:https://my.oschina.net/u/860267/blog/775931

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值