我学习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;
为什么有可以改变集合中元素值,为什么自相矛盾啊?请大侠指点!
------解决思路----------------------
R first = (R)it.next();first是啥?是内存中R对象的引用,这个引用指向了内存中的对象,通过它肯定可以改变这个对象内部的数据。只不过,first本身的值是不变的,因为这个值是地址(即引用)
------解决思路----------------------
你hs集合中put了四个R的实例,而内存中的存放形式是hs集合存放了四个指向R对象的内存地址,进行iterator遍历时根据地址拿到对象,并对对象的count属性进行了修改,而集合中仍然存放的是指向R对象的地址,地址没有变,变的是地址指向的对象。不知道这样说能明白了吗