先看下面这个例子 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:这两种情况为什么结果不一样,请解释一下
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:这两种情况为什么结果不一样,请解释一下
String[] str = {"123"};
list.add("abc");
打印出来当然不同了。for (;;)和for(:)(后者一般叫foreach)基本上是等价的。
所谓基本上,是指它们在遍历的时候。但前者可以做遍历以外的循环,而后者只能做遍历。
list.add("abc");//这里是不是应该改成list.add("123")???
for (String s: list){
s = "abc";
}
System.out.println(list.get(0));//输出abc
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
}
例如: Object[] strs = {"a", "b"};
for(String s : strs ){
//... 有问题了就
}Q2: 楼上几个都回答了.
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为啥不是引用
list.add("bcd");
for(String s : list){
s = "abc";
}
System.out.println(list.get(0));// 输出abc--->应该是输出bcd吧
String虽然是引用类型,但它是不可改变的,你自定义的类型也是引用类型,但它是可以改变。
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.
希望对你有所帮助!
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中的基础类型和对象类型赋值方式的区别!停笔~!