ArrayList遍历时的神奇问题,求大神指点下迷津

itbook 发布于 2014/04/26 21:06
阅读 560
收藏 0
接上代码:

Java code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TestArrayList {
    public static void main(String[] args) {
        ArrayList<Stu> list = new ArrayList<TestArrayList.Stu>();
        list.add(new Stu("A"));
 
        for (Stu stu : list) {
            stu  = new Stu("B");
        }
 
        for (Stu stu : list) {
            System.out.println(stu.name);
        }
    }
    static class Stu{
        public String name;
        public Stu(String name) {
            this.name = name;
        }
    }
}



输出的是   A

而不是   B

1
2
3
4
5
ArrayList<Stu> list = new ArrayList<TestArrayList.Stu>();
        list.add(new Stu("A"));
        for (Stu stu : list) {
            stu.name = "B";
        }


为什么这样就输出B

求大神指教



加载中
0
i
itbook

难道list遍历的时候,拿到的不是引用吗?

0
E
Ellipse

画个内存图就明白了。

第一段代码你给局部的stu变量赋值,并没有修改List里的数据

第二段直接修改了List里的对象属性

i
itbook
我没太懂,难道遍历的时候拿的不是实际的引用?为什么你说第一段代码是给局域stu变量复制,难道for里面的这个stu是for的局部变量的引用? 但是若是局部变量引用的话,第二段代码就不会改成功啊? 我已经凌乱了
0
黑色透明

 for (Stu stu : list) {
     stu  = new Stu("B");
 }

每次循环时,stu这个变量名都指向list中的下一个元素,在循环体内对stu进行赋值,仅仅是修改了stu变量的指向,list中的元素根本没有变化。但是直接修改stu.name的值,这是直接对list中的元素的成员变量进行修改,所以后面打印的时候,结果会出现变化。

i
itbook
你的讲解我好像大概明白了 你是说:stu好比c里面的指针,它指向List中的元素,但是呢, stu = new Stu("B"); 是将这个指针指向了新new出来的对象 而stu.name 是找到这个指针所指向的对象的name属性,然后修改name的值 我的理解对吗?
0
刘学炜
刘学炜

 for (Stu stu : list) {
     stu  = new Stu("B");
 } 这里的stu是for里面的局部变量而已 跑出for 就消失了

0
i
itbook

嗯,小弟懂了

非常感谢大婶们的指导

真的非常感谢!谢谢

0
Lofo
i
itbook
看完更懂了!谢谢
E
Ellipse
点赞,画得真快
i
itbook
非常感谢你,我懂了,很谢谢你
0
哈哈__哈哈
哈哈__哈哈

引用来自“辞暮”的评论

兄台  这是用什么绘制的

哈哈__哈哈
哈哈__哈哈
回复 @itbook : 好吧 我说绘图看起来很熟悉 我以前也是用windows绘图 画图的
Lofo
Lofo
windows 中 画图
i
itbook
window 自带的画图把
0
E
i
itbook
回复 @Ellipse : 嗯 我记住你的教导了
E
Ellipse
回复 @itbook : 我学Java基础的时候老师都让画这种堆栈图来加深理解,没事你也可以画画
i
itbook
非常感谢您的画图,我彻彻底底的明白了
0
0
Shazi199
Shazi199

for (Stu stu : list){
    stu  = new Stu("B");
}

这里的stu变量是个局部变量,循环中指向的是list中的一个对象,然后你又将其改为指向新的对象,这不会对原来list中的对象造成影响


返回顶部
顶部