整数与整数比较

Integer vs. int comparison

我是 java 的新手。我现在正在学习 java 中的非原始 Integer 类型。 我知道以下比较无效并引发编译错误 -

String str = "c";
Char chr = 'c';
if(str == chr) return true;

上面的代码片段给出了 - "Test.java:lineNumber: incomparable types: java.lang.String and char" 个错误。

但我发现下面的代码片段编译得很好 -

int a = 1234;
Integer aI = 1234;
if(a==aI) return true; 

这里,a 是原始的 int,aI 是非原始的。那么他们有什么可比性呢?我是编程新手,可能有什么不懂的吧。

谢谢

这叫做unboxing。这里 aI 是 non-primitive/reference 类型。这里 Integer 是原始 int 的包装。它提供了一些对原始 int 的额外易于使用的操作。例如,每个基本类型(boolean、byte、char、short、int、long、float、double)都有相应的包装类型(Boolean、Byte、Character、Short , 整数, 长整数, 浮点数, 双精度).

所以当 aaI 比较时,首先 aI 被拆箱并成为原始 int,并将其值与原始 int 进行比较。这意味着它等同于 -

int a = 1234;
Integer aI = 1234;
int a2 = aI.intValue();
if(a == a2) return true;

并且对于第一次比较,比较发生在完全不同的两种数据类型之间 - Stringchar。在这种情况下,java 中没有定义默认将 char 转换为 String 或将 String 转换为 char 的规则。

第二个片段演示了拆箱转换。装箱转换允许将原始类型隐式转换为特定的对象包装器类型,例如int <-> Integer.

==运算符比较时,如果一个操作数是原始类型,另一个是包装类型,则执行拆箱转换,以便比较2个原始值。

第一个片段无法编译,因为 Stringchar 之间没有 boxing/unboxing 关系——相关关系是 Character <-> char.

Section 5.1.8 of the JLS指定所有拆箱转换:

  • From type Boolean to type boolean
  • From type Byte to type byte
  • From type Short to type short
  • From type Character to type char
  • From type Integer to type int
  • From type Long to type long
  • From type Float to type float
  • From type Double to type double

Section 5.1.7指定所有的装箱转换,都是和上面相反的。

在第一种情况下,两种数据类型不同。所以他们不能相提并论。 在第二种情况下,两种数据类型也不同,但是包装器 Integer 是为了支持原语 int。所以 JVM 自动完成了 wrapper(拆箱)Integerint 的转换,然后进行比较。所以实际上在第二种情况下,两个原始 int 在最后相互比较。