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