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中不会自动取消装箱。设计师为什么不认为这样做很重要?
答案 0 :(得分:4)
这实际上与装箱或拆箱无关。
在对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
,将会获得预期的结果。
答案 1 :(得分:0)
我刚刚意识到short和char在Java中不会自动取消装箱。设计师为什么不认为这样做很重要?
无论得出什么结论,这都是不正确的。
short
和char
都可以在JLS Sec 5.1.8, Unboxing conversion中找到。
很容易编写代码来证明char
和short
都经过自动装箱和自动拆箱:
Short ss = (short) 0; // Autoboxing short to Short
short s = ss; // Auto unboxing Short to short
Character cc = '\0'; // Autoboxing char to Character
char c = cc; // Auto unboxing Character to char