日期:2014-05-20  浏览次数:20646 次

求助:SCJP考题一道 - 有关HashSet的remove方法与元素赋值
Java code
QUESTION 75
Given:
3. import java.util.*;
4. public class Mapit {
5.   public static void main(String[] args) {
6.     Set<Integer> set = new HashSet<Integer>();
7.     Integer i1 = 45;
8.     Integer i2 = 46;
9.     set.add(i1);
10.    set.add(i1);
11.    set.add(i2); System.out.print(set.size() + " ");
12.    set.remove(i1); System.out.print(set.size() + " ");
13.    i2 = 47;
14.    set.remove(i2); System.out.print(set.size() + " ");
15.  }
16. }

What is the result?
A. 2 1 0
B. 2 1 1
C. 3 2 1
D. 3 2 2
E. Compilation fails.
F. An exception is thrown at runtime.

为什么第13行 i2 = 47; 运行后,会改变程序的结果。是如何起作用的。
多谢。

------解决方案--------------------
Java code

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());
    }
}

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