如何正确比较Java中的两个整数?

我知道如果你将一个盒装的原始Integer与一个常量比较,如:

Integer a = 4;
if (a < 5)

a将自动取消装箱并进行比较。

然而,当你比较两个盒装Integers并且想比较等于还是小于/大于时会发生什么?

Integer a = 4;
Integer b = 5;

if (a == b)

上面的代码是否会导致检查它们是否是同一个对象,或者它会在这种情况下自动解除框?

关于什么:

Integer a = 4;
Integer b = 5;

if (a < b)


不,Integer,Long等之间的==会检查引用的相等性 - 即

Integer x = ...;
Integer y = ...;

System.out.println(x == y);

这将检查xy是否指向相同的对象而不是相等的对象。

所以

Integer x = new Integer(10);
Integer y = new Integer(10);

System.out.println(x == y);

保证打印false 。 “小”自动拷贝值的实习会导致棘手的结果:

Integer x = 10;
Integer y = 10;

System.out.println(x == y);

由于拳击规则(JLS第5.1.7节),这将打印为true 。 它仍然是参考平等正在使用,但参考真正是平等的。

我个人会使用:

if (x.intValue() == y.intValue())

要么

if (x.equals(y))

后者的效率稍低 - Integer.equals(Integer)没有重载,所以它将不得不执行执行时类型检查,而第一个使用的事实是我们已经知道这两个对象都是Integer

幸运的是, compareTo知道类型,所以:

if (x.compareTo(y) < 0)

应该仍然有效。 当然,这是微型优化领域,你应该使用你找到的最清晰的代码 - 确保它是正确的后:)

正如你所说,对于包装类型( IntegerLong等)和数值类型( intlong等)之间的任何比较,包装类型值将被解除封装并且将测试应用于所涉及的原始值。

这是作为二进制数字提升的一部分发生的(JLS第5.6.2节)。 查看每个运营商的文档,看它是否适用。 例如,从文档==和!=(JLS 15.21.1):

如果等于运算符的操作数都是数字类型,或者一个是数字类型,另一个是可转换的(第5.1.8节)为数字类型,则对操作数执行二进制数字升级(第5.6.2节)。

对于<,<=,>和> =(JLS 15.20.1)

数值比较运算符的每个操作数的类型必须是可以转换(§5.1.8)为基本数字类型的类型,否则会发生编译时错误。 在操作数上执行二进制数字提升(第5.6.2节)。 如果提升类型的操作数是int或long,则执行有符号整数比较; 如果此提升类型为float或double,则执行浮点比较。

请注意,这些都不属于数字类型的情况。


==仍然会测试对象相等。 然而,很容易被愚弄:

Integer a = 10;
Integer b = 10;

System.out.println(a == b); //prints true

Integer c = new Integer(10);
Integer d = new Integer(10);

System.out.println(c == d); //prints false

你的不平等的例子将起作用,因为它们没有在对象上定义。 但是,通过==比较,仍然会检查对象相等性。 在这种情况下,当您从盒装图元初始化对象时,会使用同一个对象(对于a和b)。 这是一个好的优化,因为原始框类是不可变的。


==检查引用是否相等,但是在编写如下代码时:

Integer a = 1;
Integer b = 1;

Java足够聪明,可以重复使用ab不变性,所以这是真的: a == b 。 好奇的是,我写了一个小例子来显示java以这种方式停止优化的地方:

public class BoxingLol {
    public static void main(String[] args) {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            Integer a = i;
            Integer b = i;
            if (a != b) {
                System.out.println("Done: " + i);
                System.exit(0);
            }
        }
        System.out.println("Done, all values equal");
    }
}

当我编译并运行(在我的机器上)时,我得到:

Done: 128
链接地址: http://www.djcxy.com/p/58631.html

上一篇: How to properly compare two Integers in Java?

下一篇: Differences in string compare methods in C#