HashSet charSet = new HashSet();
   for (char i = 0; i < 100; i++) {
      charSet.add(i);
      charSet.remove(i - 1);
    }
    System.out.println(charSet.size());

    HashSet intSet = new HashSet();
    for (int i = 0; i < 100; i++) {
        intSet.add(i);
        intSet.remove(i - 1);
    }
    System.out.println(intSet.size());

输出分别为100和1。

我只是意识到short和char不会在Java中自动取消装箱。设计师为什么不认为这样做很重要?

最佳答案

实际上,这与装箱或拆箱无关。

当对char进行算术运算时,按照JLS §5.6.2的规定,它会转换为int:


  • 扩展原语转换(第5.1.2节)适用于转换以下规则指定的一个或两个操作数:


  • 如果任一操作数的类型为double,则另一个操作数将转换为double
  • 否则,如果其中一个操作数的类型为float,则另一个将被转换
    float
  • 否则,如果其中一个操作数的类型为long,则另一个将被转换
    long
  • 否则,两个操作数都将转换为int类型。


  • 因此,i - 1不是char,而是int。并且因为您的Integer中没有charSet(只有Character),所以没有要删除的内容。如果将i - 1转换为char,则会得到预期的结果。

    10-08 09:19
    查看更多