读书人

SCJP考题一道 - 有关HashSet的remove方

发布时间: 2012-01-07 21:41:55 作者: rapoo

求助:SCJP考题一道 - 有关HashSet的remove方法与元素赋值

Java code
QUESTION 75Given: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值嘛,你可以输出看看。

读书人网 >J2SE开发

热点推荐