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)代码>