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

menglibinghe 2014-12-17 05:34:37
我学习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;
为什么有可以改变集合中元素值,为什么自相矛盾啊?请大侠指点!
...全文
852 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
stigma_whu 2015-10-08
  • 打赏
  • 举报
回复
当调用first和new R(-3)的hashcode和equals方法,返回值都是true,这意味着在重写的方法里面,修改了count属性后就表示两者是相同的对象么?
stigma_whu 2015-10-08
  • 打赏
  • 举报
回复
可是,还有一个问题,hashset不是根据hashcode 来存放不同对象的么,1楼的代码已经重写了hashcode方法,当改变count属性的时候,hashcode也是会改变的吧,这样第一个和第三个的hashcode就是一样的了都是-3,是不是修改后也放在-3的所谓的''桶"了里面了。
  • 打赏
  • 举报
回复
引用 3 楼 menglibinghe 的回复:
如果按照三楼的说法: 关于值改变。(Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值①传递给了迭代变量) 那么一楼代码中也是使用Iterator,为什么修改first的属性导致集合里面的元素值也发生了改变呢?(我的问题主要是针对使用HashSet类)
你hs集合中put了四个R的实例,而内存中的存放形式是hs集合存放了四个指向R对象的内存地址,进行iterator遍历时根据地址拿到对象,并对对象的count属性进行了修改,而集合中仍然存放的是指向R对象的地址,地址没有变,变的是地址指向的对象。不知道这样说能明白了吗
AceShot 2014-12-17
  • 打赏
  • 举报
回复
引用 3 楼 menglibinghe 的回复:
如果按照三楼的说法: 关于值改变。(Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值①传递给了迭代变量) 那么一楼代码中也是使用Iterator,为什么修改first的属性导致集合里面的元素值也发生了改变呢?(我的问题主要是针对使用HashSet类)
R first = (R)it.next();first是啥?是内存中R对象的引用,这个引用指向了内存中的对象,通过它肯定可以改变这个对象内部的数据。只不过,first本身的值是不变的,因为这个值是地址(即引用)
menglibinghe 2014-12-17
  • 打赏
  • 举报
回复
如果按照三楼的说法: 关于值改变。(Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值①传递给了迭代变量) 那么一楼代码中也是使用Iterator,为什么修改first的属性导致集合里面的元素值也发生了改变呢?(我的问题主要是针对使用HashSet类)
  • 打赏
  • 举报
回复
1.HashSet hs = new HashSet(); 是HashSet,底层是HashMap,不是TreeSet。hash码本身就是无序的,底层由分组实现,无序排列。TreeSet是有序的,底层TreeMap实现。建议深入了解Object的hashcode。 2.关于值改变。(Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值①传递给了迭代变量,),这里的值并不是Map的value,而是Map里对象的引用地址的意思,你想一下,把地址给你了,你根据地址找到那个对象并修改的对象的属性,而Map中依旧存放的是引用地址,所以Map盛放的对象就变喽
soton_dolphin 2014-12-17
  • 打赏
  • 举报
回复
set 本来就是没有顺序的啊。 你试试arrayList就有顺序了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧