Java 整数与整数比较

Java 整数与整数比较,java,integer,boxing,autoboxing,Java,Integer,Boxing,Autoboxing,我不熟悉java。我现在正在学习java中的非原始整数类型。 我知道以下比较无效,并引发编译错误- String str = "c"; Char chr = 'c'; if(str == chr) return true; 上面的代码片段给出了“Test.java:lineNumber:不可比较类型:java.lang.String和char”错误 但我发现下面的代码片段编译得很好- int a = 1234; Integer aI = 1234; if(a==aI) return true;

我不熟悉
java
。我现在正在学习
java
中的非原始整数类型。 我知道以下比较无效,并引发编译错误-

String str = "c";
Char chr = 'c';
if(str == chr) return true;
上面的代码片段给出了“Test.java:lineNumber:不可比较类型:java.lang.String和char”错误

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

int a = 1234;
Integer aI = 1234;
if(a==aI) return true; 
这里,
a
是基元int,
aI
是非基元。那么它们的可比性如何呢?我是编程新手,可能有什么我不知道的


谢谢

这叫做
拆箱
。这里aI是非原始/引用类型。这里Integer是原始int的包装器。它提供了对原始int的一些特别易于使用的操作。例如,每个原始类型(boolean,byte,char,short,int,int,long,float,double)都有相应的包装器类型(boolean,byte,Character,short,Integer,long,float,double

因此,当将
a
aI
进行比较时,首先将
aI
解除绑定,成为一个基本整数,并将其值与基本整数进行比较。这意味着它相当于-

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

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

第二个代码段演示了取消装箱转换。装箱转换允许将基元类型隐式转换为特定的对象包装类型,例如
int
Integer

当与
=
运算符进行比较时,如果一个操作数是基元类型,而另一个是这样的包装类型,则会执行取消装箱转换,以便可以比较两个基元值

第一个代码段没有编译,因为
String
char
之间没有装箱/拆箱关系——相关关系是
Character
char

指定所有取消装箱转换:

  • 从布尔类型到布尔类型
  • 从类型字节到类型字节
  • 从短型到短型
  • 从类型字符到类型字符
  • 从Integer类型到int类型
  • 从Long类型到Long类型
  • 从类型Float到类型Float
  • 从Double类型到Double类型

指定所有装箱转换,所有转换都与上述相反。

在第一种情况下,两种数据类型不同。因此,它们是无法比较的。 在第二种情况下,这两种数据类型也不同,但是包装器
Integer
支持原语
int
。因此,JVM自动将包装(取消装箱)
Integer
转换为
int
,然后进行比较。因此,实际上在第二种情况下,两个原语
int
在末尾相互比较。

装箱-旁注:创建
整数的“正确”方法是
Integer aI=new Integer(1234)