当前位置: 代码迷 >> J2SE >> SCJP考题一道 - 有关HashSet的remove方法与元素赋值
  详细解决方案

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

热度:134   发布时间:2016-04-24 12:16:48.0
求助: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值嘛,你可以输出看看。
  相关解决方案