SCJP考题一道 - 有关HashSet的remove方法与元素赋值
求助:SCJP考题一道 - 有关HashSet的remove方法与元素赋值
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
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. }
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值嘛,你可以输出看看。