整数与int比较

时间:2015-07-22 19:43:16

标签: java integer boxing autoboxing

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

java

上面的代码片段给了我 - " Test.java:lineNumber:无法比较的类型:java.lang.String和char"错误。

但是我发现以下代码片段编译得很好 -

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

这里,int a = 1234; Integer aI = 1234; if(a==aI) return true; 是原始int,a是非原始的。那么它们如何可比?我是编程新手,可能有任何我不知道的事情。

由于

3 个答案:

答案 0 :(得分:4)

第二个代码段演示了取消装箱转换。拳击转换允许将原始类型隐式地转换为特定的对象包装类型,例如, int< - > Integer

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

第一个代码段无法编译,因为Stringchar之间没有装箱/拆箱关系 - 相关关系为Character< - > char

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

  
      
  • 从类型Boolean到类型boolean
  •   
  • 从类型字节到类型字节
  •   
  • 从短类型到短类型
  •   
  • 从类型字符到类型字符
  •   
  • 从类型Integer到类型int
  •   
  • 从类型Long到类型长
  •   
  • 从类型Float到类型float
  •   
  • 从类型Double到类型double
  •   

Section 5.1.7指定所有拳击转换,所有这些都与上述相反。

答案 1 :(得分:2)

这称为unboxing。这里aI是非原始/引用类型。这里Integer是原始int的包装器。它对原始int提供了一些易于使用的操作。例如,每个基本类型( boolean,byte,char,short,int,long,float,double )都有相应的包装类型(布尔,字节,字符,短,整数,长,浮动,双重)。

因此,当aaI进行比较时,首先将aI取消装箱并成为原始int,并将其值与原始int进行比较。这意味着它相当于 -

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

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

答案 2 :(得分:0)

在第一种情况下,两种数据类型不同。所以他们无法比较。 在第二种情况下,两种数据类型也不同,但包装器Integer用于支持原始int。因此,JVM自动完成包装器(拆箱)Integerint的转换,然后进行比较。所以实际上在第二种情况下,最后将两个原始int相互比较。