【问题标题】:Integer vs. int comparison整数与整数比较
【发布时间】:2015-07-22 19:43:15
【问题描述】:

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

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

上面的代码 sn-p 给了我 - “Test.java:lineNumber: incomparable types: java.lang.String and char”错误。

但是我发现下面的代码 sn-p 编译得很好 -

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

这里,a 是原始 int,aI 是非原始类型。那么它们有什么可比性呢?我是编程新手,可能有什么我不知道的。

谢谢

【问题讨论】:

标签: java integer boxing autoboxing


【解决方案1】:

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

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

第一个sn-p没有编译,因为Stringchar之间没有装箱/拆箱关系——相关关系是Characterchar

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

  • 从布尔型到布尔型
  • 从字节类型到字节类型
  • 从短类型到短类型
  • 从字符型到字符型
  • 从 Integer 类型到 int 类型
  • 从 Long 类型到 long 类型
  • 从浮点型到浮点型
  • 从 Double 类型到 double 类型

Section 5.1.7指定了所有的装箱转换,都是上面的逆向。

【讨论】:

    【解决方案2】:

    这称为unboxing。这里 aI 是非原始/参考类型。这里 Integer 是原始 int 的包装器。它在原始 int 上提供了一些额外易于使用的操作。例如,每个基本类型(boolean、byte、char、short、int、long、float、double)都有对应的包装类型(Boolean、Byte、Character、Short、Integer、Long、浮点数,双数)。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-11-24
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2014-11-07
        • 2019-06-19
        • 1970-01-01
        相关资源
        最近更新 更多