A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晏文根 初级黑马   /  2012-6-17 12:40  /  1994 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

增强for循环只能对数组或者集合进行遍历,不能改变其值
package cn.xuzheng.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
/**
* 说明增强for循环只能遍历数组或者集合,不能对其进行增删改查等改变数据的操作
*@author xz
*@version 1.0 2012-5-23
*@Richard
*/
public class MapDemo1 {
@Test
public void test1(){
int[] arr= new int[5];
for(int num:arr){
num=1;
System.out.println(arr[0]);
}
}
@Test
public void test2(){
List<String> list=new ArrayList<String>();
list.add("aaa");
for(String str:list){
str="bbb";
System.out.println(list.get(0));
}
}
}
结果:
0
0
0
0
0
aaa
我原来本来打算把这当做定理几下,可是刚到张老师高新技术视频中看到:图片上那段代码,它确实在增强for循环中,改变了传入参数String类型的值。。。。

FOR.PNG (30.95 KB, 下载次数: 14)

FOR.PNG

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
增强For循环是要有源目标才行的,就是说要遍历的目标必须已经确确实实存在了才可以用增强for循环,张老师视频里面改变值的并不是增强for循环,而是在for循环里面调用了变量的set方法覆的值,就像你用迭代器Iterator遍历集合时用remove一样,这个有问题么?
回复 使用道具 举报
嗯,明白了,,那为什么增强for循环中的值改不了哦?
回复 使用道具 举报
额,我上面说错了,在Iterator里面是不能用remove的,因为迭代器操作的过程中,源是不能改变的,对不起啊!For增强里面的值为什么不能改变,因为它是定义了一个变量来接受源的副本,比如你有字符串,str1 = "abc", 然后你定义了一个新字符串,str2,str2 = str1,然后你改变str2,跟str1一点关系都没有,所以说增强for循环里改变不了源值,但是如果你掉用某个方法,比如说在for循环的过程中直接调用str1还是可以的!!张老师的就是这样!
回复 使用道具 举报
对于Iterator我也看了下,,你后面说的有道理
对于for这个,我明白了。。。。不过真的很佩服你,能够这么清楚的记得自己曾经写错的,,原来孔子说的“不贰过”真存在哦
回复 使用道具 举报
黄奕豪 发表于 2012-6-17 13:36
额,我上面说错了,在Iterator里面是不能用remove的,因为迭代器操作的过程中,源是不能改变的,对不起啊! ...

你说的不对 比如
connection c = new ArrayList();
c.add(object1);
c.add(object2);
c.add(object3);
for(Iterator iterator =c.iterator(); iterator.hasNext();){
     Object object = iterarot.next();
    //你可以这样
       iterator.remove();//可以删除 他右边的元素
  //但是不能这样  c.remove(object1); 会产生不可预料的后果
刚刚你说 不能改变 其实是可以改变的,我要纠正你的错误!!!
而且我还要说的是,如果要删除 还必须只能是 iterator来删除!
因为 当你用增强的for 循环的时候 还是调用底层的 iterator 对象迭代器的,而且 他会锁定当前 集合!
请参照 API :
public interface Iterator<E>对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:
  • 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
  • 方法名称得到了改进。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 谢谢指正~~

查看全部评分

回复 使用道具 举报
李元峰 发表于 2012-6-17 14:31
你说的不对 比如
connection c = new ArrayList();
c.add(object1);

我上面打错了 iterator.remove() 是删除他左边的元素!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马