当前位置: 代码迷 >> J2SE >> 使用Iterator回遍历Collection集合里的元素,到底能否改变元素的值
  详细解决方案

使用Iterator回遍历Collection集合里的元素,到底能否改变元素的值

热度:103   发布时间:2016-04-23 20:05:23.0
使用Iterator来遍历Collection集合里的元素,到底能否改变元素的值?
本帖最后由 menglibinghe 于 2014-12-17 17:35:49 编辑
        我学习JAVA疯狂讲义时,知道当使用Iterator来遍历Collection集合里的元素的时候,Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值传递给了迭代变量,对集合元素本身并没有任何的影响。
       但是随后看到随书代码中又有
class R
{
int count;
public R(int count)
{
this.count = count;
}
public String toString()
......
}
public class TestHashSet2
{
public static void main(String[] args) 
{
HashSet hs = new HashSet();
hs.add(new R(5));
hs.add(new R(-3));
hs.add(new R(9));
hs.add(new R(-2));
//打印TreeSet集合,集合元素是有序排列的
System.out.println(hs);
//取出第一个元素
Iterator it = hs.iterator();
R first = (R)it.next();
//为第一个元素的count属性赋值
first.count = -3;
//再次输出count将看到TreeSet里的元素处于无序状态
System.out.println(hs);
}

        以上代码中红色部分
          first.count = -3;
为什么有可以改变集合中元素值,为什么自相矛盾啊?请大侠指点!

------解决思路----------------------
引用:
    如果按照三楼的说法:
    关于值改变。(Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值①传递给了迭代变量)
     那么一楼代码中也是使用Iterator,为什么修改first的属性导致集合里面的元素值也发生了改变呢?(我的问题主要是针对使用HashSet类)


R first = (R)it.next();first是啥?是内存中R对象的引用,这个引用指向了内存中的对象,通过它肯定可以改变这个对象内部的数据。只不过,first本身的值是不变的,因为这个值是地址(即引用)
------解决思路----------------------
引用:
    如果按照三楼的说法:
    关于值改变。(Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值①传递给了迭代变量)
     那么一楼代码中也是使用Iterator,为什么修改first的属性导致集合里面的元素值也发生了改变呢?(我的问题主要是针对使用HashSet类)

你hs集合中put了四个R的实例,而内存中的存放形式是hs集合存放了四个指向R对象的内存地址,进行iterator遍历时根据地址拿到对象,并对对象的count属性进行了修改,而集合中仍然存放的是指向R对象的地址,地址没有变,变的是地址指向的对象。不知道这样说能明白了吗
  相关解决方案