本帖最后由 menglibinghe 于 2014-12-17 17:35:49 编辑

解决方案 »

  1.   

    set 本来就是没有顺序的啊。 你试试arrayList就有顺序了
      

  2.   

    1.HashSet hs = new HashSet();  是HashSet,底层是HashMap,不是TreeSet。hash码本身就是无序的,底层由分组实现,无序排列。TreeSet是有序的,底层TreeMap实现。建议深入了解Object的hashcode。
    2.关于值改变。(Iterator并不是把集合元素本身传递给了迭代变量,而是把集合元素的值①传递给了迭代变量,),这里的值并不是Map的value,而是Map里对象的引用地址的意思,你想一下,把地址给你了,你根据地址找到那个对象并修改的对象的属性,而Map中依旧存放的是引用地址,所以Map盛放的对象就变喽
      

  3.   

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

  4.   


    R first = (R)it.next();first是啥?是内存中R对象的引用,这个引用指向了内存中的对象,通过它肯定可以改变这个对象内部的数据。只不过,first本身的值是不变的,因为这个值是地址(即引用)
      

  5.   

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