先看下面这个例子 String[] str = {"123"};
for (String s:str){
s = "abc";
}
System.out.println(str[0]);//输出123

List<String> list = new ArrayList<String>();
list.add("abc");
for (String s: list){
s = "abc";
}
System.out.println(list.get(0));//输出abc问题1:for (String s:str)与for(int i=0,i<str.length;i++)等价吗,如果不,那和什么等价
问题2:这两种情况为什么结果不一样,请解释一下

解决方案 »

  1.   

    大哥,
    String[] str = {"123"};
    list.add("abc");
    打印出来当然不同了。for (;;)和for(:)(后者一般叫foreach)基本上是等价的。
    所谓基本上,是指它们在遍历的时候。但前者可以做遍历以外的循环,而后者只能做遍历。
      

  2.   

     List<String> list = new ArrayList<String>();
            list.add("abc");//这里是不是应该改成list.add("123")???
            for (String s: list){
                s = "abc";
            }
            System.out.println(list.get(0));//输出abc
      

  3.   

    给局部变量s赋值操作对str数组和list都不起作用public static void main(String args[]){
    String[] str = {"123"};
    for(String s : str){
    s = "abc";
    }
    System.out.println(str[0]);// 输出123 List<String> list = new ArrayList<String>();
    list.add("bcd");
    for(String s : list){
    s = "abc";
    }
    System.out.println(list.get(0));// 输出abc
    }
      

  4.   

    两个循环的区别 1#已经说了  for(:)遍历效率更高 但是无法实现循环的目的 比如你要去每次循环的i 这种遍历就没法实现了
      

  5.   

    Q1: 一样的,不过就是for each循环的时候无法获取i值. 另外for each主要是对泛型的支持.
        例如: Object[] strs = {"a", "b"};
              for(String s : strs ){
                 //... 有问题了就
              }Q2: 楼上几个都回答了.
      

  6.   


    public class Main { public static void main(String[] args) {
    //new Main().setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    String[] str = {"123"};
    for (String s:str){
    s = "abc";
    }
    System.out.println(str[0]);//输出123

    Obj[] obj = new Obj[1];
    obj[0] = new Obj("123");
    for (Obj o:obj) {
    o.value="abc";
    }
    System.out.println(obj[0].value);//输出abc

    }
    class Obj{
    String value;
    public Obj(String value) {
    this.value = value;
    }
    }原来的代码有误,看这个吧.
    你们都说只能遍历,可现在我就能改Obj对象的值,为什么,如果说for里的是引用,那String为啥不是引用
      

  7.   

    List<String> list = new ArrayList<String>();
            list.add("bcd");
            for(String s : list){
                s = "abc";
            }
            System.out.println(list.get(0));// 输出abc--->应该是输出bcd吧
      

  8.   


    String虽然是引用类型,但它是不可改变的,你自定义的类型也是引用类型,但它是可以改变。
      

  9.   

    这个链接讲过:
    http://topic.csdn.net/t/20050721/10/4158477.html
    区别吗,for( : )
    这个有些限制
    1 Only access. Elements can not be assigned to, eg, not to increment each element in a collection. 
    2 Only single structure. It's not possible to traverse two structures at once, eg, to compare two arrays. 
    3 Only single element. Use only for single element access, eg, not to compare successive elements. 
    4 Only forward. It's possible to iterate only forward by single steps. 
    5 At least Java 5. Don't use it if you need compatibility with versions before Java 5. 
    希望对你有所帮助!
      

  10.   

            String[] str = {"123"};//数组str只包含一个元素str[0]="123"
            for (String s:str){//这里 s是局部变量,接收str数组的元素,值传递
                s = "abc";//将字符串赋值个局部变量s,数组str中的值并没有改变,依然是str[0]="123"
            }
            System.out.println(str[0]);//输出123
            
            List<String> list = new ArrayList<String>();//定义一个String 对象的列表
            list.add("123");//在列表中增加一个元素"123","123"作为String对象,list中存储的是"123"对象的引用<也就是地址>
            for (String s: list){//s获得"123"对象的引用,地址传递
                s = "abc";//修改s中值,也就是说修改了s所指向地址中的值,即修改了list中元素的值
            }
            System.out.println(list.get(0));//输出abc以上就是对两次结果不同做的解释,要是你还没理解的话,建议你看看java中的基础类型和对象类型赋值方式的区别!停笔~!