整数与整数比较
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 , 整数, 长整数, 浮点数, 双精度).
所以当 a
与 aI
比较时,首先 aI
被拆箱并成为原始 int,并将其值与原始 int 进行比较。这意味着它等同于 -
int a = 1234;
Integer aI = 1234;
int a2 = aI.intValue();
if(a == a2) return true;
并且对于第一次比较,比较发生在完全不同的两种数据类型之间 - String
和 char
。在这种情况下,java 中没有定义默认将 char
转换为 String
或将 String
转换为 char
的规则。
第二个片段演示了拆箱转换。装箱转换允许将原始类型隐式转换为特定的对象包装器类型,例如int
<-> Integer
.
与==
运算符比较时,如果一个操作数是原始类型,另一个是包装类型,则执行拆箱转换,以便比较2个原始值。
第一个片段无法编译,因为 String
和 char
之间没有 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(拆箱)Integer
到 int
的转换,然后进行比较。所以实际上在第二种情况下,两个原始 int
在最后相互比较。
我是 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 , 整数, 长整数, 浮点数, 双精度).
所以当 a
与 aI
比较时,首先 aI
被拆箱并成为原始 int,并将其值与原始 int 进行比较。这意味着它等同于 -
int a = 1234;
Integer aI = 1234;
int a2 = aI.intValue();
if(a == a2) return true;
并且对于第一次比较,比较发生在完全不同的两种数据类型之间 - String
和 char
。在这种情况下,java 中没有定义默认将 char
转换为 String
或将 String
转换为 char
的规则。
第二个片段演示了拆箱转换。装箱转换允许将原始类型隐式转换为特定的对象包装器类型,例如int
<-> Integer
.
与==
运算符比较时,如果一个操作数是原始类型,另一个是包装类型,则执行拆箱转换,以便比较2个原始值。
第一个片段无法编译,因为 String
和 char
之间没有 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(拆箱)Integer
到 int
的转换,然后进行比较。所以实际上在第二种情况下,两个原始 int
在最后相互比较。