问题描述
publicstaticvoidmain(String[]args){List<Integer>list=newArrayList<Integer>();list.add(1);list.add(2);list.add(3);Iteratorit=list.iterator();while(it.hasNext()){Integera=(Integer)it.next();a=123;System.out.println(list.get(0));}我想通过迭代器改变里面的值,我的认为是我通过迭代器迭代出来并赋给a,因为集合装的是对象,所以我认为a指向的是集合元素的地址,所以我希望通过a的改变来改变集合元素的值,但是始终不行,我想问问为什么?谢谢
解决方案
解决方案二:
a又指向123的地址了吧
解决方案三:
引用1楼Mr_WangB的回复:
a又指向123的地址了吧
a之前指向的是每一个元素,我想的是他改变了那么元素就应该改变因为是同一个地址
解决方案四:
引用2楼woshiyeda的回复:
Quote: 引用1楼Mr_WangB的回复:
a又指向123的地址了吧a之前指向的是每一个元素,我想的是他改变了那么元素就应该改变因为是同一个地址
a可以说存的是地址,a原来是指向每个元素的,但是后来a=123;使得a指向了新的Integer对象,此时仅仅是a的值发生了变化,但a原来指向的list中的对象还是没变化的。总之,就是a指向了不同地方(存的地址变了),但所指向的对象都没变。
解决方案五:
这是一个关于包装类的问题。下面的代码详细的解释了你的疑问(顺便优化了一下代码):importjava.util.*;publicclassTestAtuoBox{publicstaticvoidmain(String[]args){List<Integer>list=newArrayList<Integer>();Collections.addAll(list,1,2,3);System.out.println(list);/////////////////////////////////////////////////////Integernum1=newInteger(1);//不同于Integernum1=1;我的这句涉及到常量池取值以及自动打包Integernum2=num1;System.out.println(num1==num2);//从JDK5.0开始基本数据类型和包装类类型之间可以直接赋值[自动打包自动解包]//下面的这行代码创建了一个新变量,原因如下num2=2;//等同于执行了num1=Integer.valueOf(2);自动打包[@sinceJDK5.0]System.out.println("num1是:"+num1+"num2是:"+num2);/////////////////////////////////////////////////////System.out.println("------------------------------");for(Iterator<Integer>car=list.iterator();car.hasNext();){Integera=car.next();//相当于上面的Integernum2=num1;a=123;//相当于上面的num2=2;//没明白下面是什么意思。如果想遍历List集合,不如用foreach或迭代器System.out.println(list.get(0));}}}
解决方案六:
iterator迭代的时候不允许修改集合,想修改集合用ListIterator。