本帖最后由 kurt17 于 2011-10-16 13:44:50 编辑

解决方案 »

  1.   


    public class Mapit {
    public static void main(String[] args) {
    Set<Integer> set = new HashSet<Integer>();
    Integer i1 = 45;
    Integer i2 = 46;

    System.out.println(i2.hashCode());

    set.add(i1);
    set.add(i1);
    set.add(i2);
    System.out.print(set.size() + " ");
    set.remove(i1);
    System.out.print(set.size() + " ");
    i2 = 47;
    set.remove(i2);
    System.out.print(set.size() + " ");

    System.out.println(i2.hashCode());
    }
    }
    我在里面加了2行,代码i2.hashCode();。Set通过hashCode来判断对象是否在在是否被存储,删除也是一样的。
    http://blog.csdn.net/yakihappy/article/details/3979285
      

  2.   

    因为i2 = 47时,java的boxing机制使得i2的引用指向了新的Integer对象47,所以hashcode发生了变化,set调用remove方法时比较运算就不会等于Integer对象46的hashcode,所以reomve操作并没有删除set里的46。HashSet的remove方法不是返回boolean值嘛,你可以输出看看。
      

  3.   

    是的。多谢。
    就是说:set之前add的i2是new Integer(46)。当i2 = 47后,i2指向的对象变成了new Integer(47),这个对象没有被add到set中过。此时如果让set去remove掉i2,由于new Integer(47)与set完全没有联系,所以remove在set中已经找不到一个i2了。
    这样貌似不用hashcode也可以解释。