黑马程序员技术交流社区
标题:
关于增强for循环的问题
[打印本页]
作者:
邵天强
时间:
2012-11-16 18:37
标题:
关于增强for循环的问题
本帖最后由 邵天强 于 2012-11-16 21:35 编辑
请看下面代码:
public void test2(){
List<String>list=new ArrayList<String>();//创建一个list集合
list.add("黑马_1");//向集合中添加元素
list.add("黑马_2");//向集合中添加元素
list.add("黑马_3");//向集合中添加元素
list.add("黑马_4");//向集合中添加元素
for(String str:list){//利用增强for循环打印集合中的元素
str="黑马程序员";
}
System.out.println(list.get(3));
}
上面运行的结果是:黑马_4,
我有个疑问:为什么不是黑马程序员呢?难道增强for循环不能改变集合中的元素吗?还是其他的原因
作者:
廖力
时间:
2012-11-16 19:12
本帖最后由 廖力 于 2012-11-16 20:39 编辑
增强新for循环的使用
1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,
但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。
public class MainClass {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("黑马_1");
al.add("黑马_2");
al.add("黑马_3");
al.add("黑马_4");
for (String str : al) {
System.out.print("增强for循环:");
str = "黑马程序员";
System.out.println(str);
}
for (int i = 0; i < al.size(); i++) {
System.out.print("普通for循环:");
System.out.println(al.get(i));
}
ArrayList<MyString> al2 = new ArrayList<MyString>();
al2.add(new MyString("黑马_1"));
al2.add(new MyString("黑马_2"));
al2.add(new MyString("黑马_3"));
al2.add(new MyString("黑马_4"));
for (MyString ms : al2) {
System.out.print("增强for循环:");
ms.str = "黑马程序员";
System.out.println(ms);
}
for (int i = 0; i < al.size(); i++) {
System.out.print("普通for循环:");
System.out.println(al2.get(i));
}
}
}
class MyString {
public String str = null;
public MyString(String str) {
this.str = str;
}
public String toString() {
return str;
}
}
复制代码
上面代码有个一个很奇怪的现象:
当把String类封装一下变成MyString类就能修改了
版主和2楼都理解错意思了吧
楼主不是问为什么输出的是 黑马_3 而不输出 黑马_4
楼主问的是为什么输出的是 黑马_4 而不输出 黑马程序员
刚刚又实验了一下用int和Integer以及自己封装一个int的MyInteger类 依然是一样的情况
我的理解是这样的 楼主应该知道c的指针吧
foreach中当集合中的元素是基础类型时传回来的就是直接的值
而当集合中的元素不是基础类型时 传回来的是对象就相当于c中的指针
不知道我理解的对不对... ...
Integer虽然是int的封装类
但是他的定义中有这样一句
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
而API中的Class类中没有getPrimitiveClass方法 然后查源码:
static native Class getPrimitiveClass(String name);
说明其实Integer的类型还是int类型 只不过强转了Integer
不知道我理解的对不对... ...
作者:
曹艺先-热爱编程
时间:
2012-11-16 19:53
没有得到的原因是:下标是从零开始的 ,你要是要得到“黑马_3” ,get()方法里面的值应该是2
作者:
陈龙
时间:
2012-11-16 21:31
public class Test1{
public static void main(String args[])
{
List<String> list = new ArrayList<String>();
list.add("黑马_1");
list.add("黑马_2");
list.add("黑马_3");
for(String str:list)
{
System.out.print(str + " ");//打印list的内容
str = "黑马程序员";//重新赋值
System.out.print(str + " ");//打印新的值
}
}
}
输出内容如下:
黑马_1 黑马程序员 黑马_2 黑马程序员 黑马_3 黑马程序员 [黑马_1, 黑马_2, 黑马_3]
分析一下输出过程
,第一次,str被赋值list.get(0),即str = list.get(0);所以第一个打印语句输出:
黑马_1;str = "黑马程序员";str被重新重新赋值,
所以第二个打印语句输出:
黑马程序员。楼主肯定是纠结
既然str和list.get(0)指向同一个堆地址,既然通过给str赋值改变了内容,为什么list.get(0)的内容为什么没有变,如下图
恰美截图助手未命名.jpg
(19.34 KB, 下载次数: 54)
下载附件
2012-11-16 21:29 上传
str刚开始是指向list.get(0);但是被赋值str = "黑马程序员";之前的指向断开了,指向另外的地址了,所以根本不会改变list的内容
作者:
郑丹丹
时间:
2012-11-16 21:35
增强for循环调用的是ieterator的方法。代码执行for(String str:list)打印的是:黑马_1,但是代码执行到str="黑马"是就会把str的指向改变,但是list集合里的元素没有改变,所以System.out.println(list.get(3));打印的还是:黑马_4.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2