当前位置: 首页 > 知识库问答 >
问题:

在Java中用`==`比较两个`integer`值是否安全?[副本]

胡向阳
2023-03-14

我有这段Java代码:

public class Foo {
    public static void main(String[] args) {
         Integer x = 5;
         Integer y = 5;
         System.out.println(x == y);
    }
}

是否保证在控制台上打印true?我的意思是,是通过值(这是我需要做的)还是通过引用标识来比较两个装箱的整数?

另外,如果我将它们转换为未装箱的整数,会有什么不同吗

public class Foo {
    public static void main(String[] args) {
         Integer x = 5;
         Integer y = 5;
         System.out.println((int) x == (int) y);
    }
}

共有1个答案

琴英华
2023-03-14

不,这不是比较integer对象的正确方法。您应该使用integer.equals()integer.compareTo()方法。

默认情况下,JVM将缓存[-128,127]范围内的integer值(请参见java.lang.integer.integercache.high属性),但不会缓存其他值:

Integer x = 5000;
Integer y = 5000;
System.out.println(x == y); // false

取消装箱到int或调用integer.intvalue()将创建一个int基元,该基元可以安全地与==运算符进行比较。但是,取消对null的装箱将导致nullPointerException

 类似资料:
  • 问题内容: 我知道,如果你将装箱的原始整数与常量进行比较,例如: 将自动取消装箱,比较将起作用。 但是,当你比较两个装箱并想比较等于或小于/大于时会发生什么? 上面的代码是否会导致检查它们是否是同一对象,或者在这种情况下会自动拆箱? 关于什么: ? 问题答案: 不,在Integer,Long等之间==,将检查引用是否相等 -即 这将检查是否x并y引用相同的对象而不是相等的对象。 所以 保证可以打印

  • 问题内容: 如果我使用像这样的比较(a是int,b和c是float / double)是否安全: 它可能听起来很荒谬,但是在我的旧编程语言中,有时1 + 2 == 3是错误的(因为左侧返回2.99999999999 …)。而且,这呢: 问题答案: 通常,由于不能精确地将许多十进制数字表示为or 值,因此这样做并不安全。经常陈述的解决方案是测试数字之间的差异是否小于某个“小”值(在数学文献中通常用希

  • 问题内容: 比较浮点数和这样的整数是否安全? 根据JLS(5.6.2。二进制数值提升),如果其中一个参数为,则另一个参数将转换为比较之前的值。但是据我了解,如果转换后的float与原始float二进制相同,则这样的比较将返回true。我们如何确保呢? 问题答案: 是的,您的具体示例很好,因为和都可以精确地表示为。 请注意,通常情况下并非如此:有很多大值无法完全表示为。例如,即使2_000_000_

  • 这是一个Java代码,应该测试小数点后的前三位是否相同。而我需要编写这个程序没有一个主方法。

  • 问题内容: Java中两个double值的简单比较会产生一些问题。让我们考虑以下Java中的简单代码段。 上面的代码似乎返回,表达式的求值,但是没有。它之所以返回,是因为该表达式的求值实际上是预期的因此不等于,因此条件的求值为。解决这种情况的最佳建议方法是什么? 问题答案: 基本上,你不应该进行精确比较,而应该执行以下操作:

  • 问题内容: 我有两个Arraylist 其包含以下值是 AllProcessList arraylist包含所有Java进程,RunningProcessList arraylist包含当前正在运行的进程。我想比较这两个arraylist并显示是否未运行该进程。例如,比较两个列表并要显示以下进程未运行。 我使用了以下代码,但无法正常工作。 问题答案: 查看List的文档,尤其是removeAll(