当前位置: 首页 > 面试题库 >

如何在Java中正确比较两个Integer?

惠泳
2023-03-14
问题内容

我知道,如果你将装箱的原始整数与常量进行比较,例如:

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);

这将检查是否x并y引用相同的对象而不是相等的对象。

所以

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

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

保证可以打印false。对“小的”自动装箱的值进行internet可能会导致棘手的结果:

Integer x = 10;
Integer y = 10;

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

true根据装箱规则(JLS第5.1.7节),将进行打印。它仍然使用引用相等,但是引用实际上是相等的。

如果要装箱的值p是int类型的整数文字,其值介于-128和127之间(包括第3.10.1节),或者布尔文字的值是true或false(第3.10.3节),或者是介于’\ u0000’和$之间的字符文字。 ‘\ u007f’(含)(第3.10.4节),则令a和b为p的任何两次装箱转换的结果。总是a == b。

我个人会使用:

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

要么

if (x.equals(y))

如你说,对于一个包装型(之间的任何比较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,则执行浮点比较。

请注意,在这两种类型都不是数字类型的情况下,如何都不将其视为一部分。



 类似资料:
  • 问题内容: 这是一个简单的问题-给定两个URL,是否有一些内置方法或一个Apache库来确定它们在逻辑上是否相等? 例如,这两个URL相等: 问题答案: 尽管(以及有问题的)这些特定示例 未 返回,但我认为这是唯一可以假定等效的情况(因为HTTP协议中没有空路径)。 这些URI 并且可以 不 被认为是等价的。 也许您可以使用包装在实用程序中的方法来显式处理此特定情况。

  • 问题内容: 我正在尝试比较两个日期,而我只想比较日期部分而不是时间部分,这就是我在程序中存储日期的方式: 我有一个: 我想用 但是由于还涉及时间部分,所以我无法获得正确的答案。我该如何解决我的问题? 我不想使用JODA-TIME 问题答案: 您可以像这样逐个比较价值 要么 如果您使用Date类,请考虑改用Calendar类这是最优雅的解决方案,为此使用Calendar和Comparator 用法:

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

  • 问题内容: 比较Java 8中的两个实例并找出它们是否具有相同元素(特别是出于单元测试目的)的一种好方法是什么? 我现在得到的是: 或者: 但这意味着我要构建两个集合并丢弃它们。考虑到测试流的大小,这不是性能问题,但是我想知道是否存在一种规范的方式来比较两个流。 问题答案:

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

  • 问题内容: 我有两个像下面的哈希图: 键不相同,但值相同,有时值也不相同。 我想找出与比较时不存在的值 但这使我从employeeMap中得到null。 您能帮我解决这个问题吗? 问候托尼 问题答案: 以下是完美运行的代码,比较失败的原因是映射值不同。 如果我们看到日期,则可以清楚地看到差异。 不同于 因为我将其存储为字符串。 谢谢你们的支持以及也投下反对票的人们。 :)托尼