- 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. }
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值嘛,你可以输出看看。