【问题标题】:Compare two Integer Objects in Java [duplicate]比较Java中的两个整数对象[重复]
【发布时间】:2015-09-28 13:12:49
【问题描述】:

这不是重复的问题!我不是在比较两个整数,而是一个整数和一个 int 值。此外,我问的是人们对我所做的事情的看法,而不是告诉我如何正确比较......

我只是想知道你对将 Integer 类型的对象与这样的 int 值进行比较有何看法:

final Integer i = null; //I'm setting it to null just to show that my test will not throw a NullPointerException, otherwise I could used a simple `int`
if (i == Integer.valueOf(3))
    ...

我发现这很有用的是不需要检查我的对象是否为空。而且Integer.valueOf()缓存对象....

【问题讨论】:

  • 我怎么看?这是错误
  • 你能解释一下原因吗?
  • @frontGeek 你试过用 1000 的值吗?
  • 这是一个坏主意的原因:ideone.com/1VkGud
  • 不,从来没有,我只是用小的值来做到这一点......

标签: java integer compare


【解决方案1】:

这是个坏主意,因为它会给你错误的结果。

final Integer i = Integer.valueOf(Integer.MAX_VALUE);
System.out.println(i == Integer.valueOf(Integer.MAX_VALUE));

给你false

我猜你尝试了一些小数字,它们给了你正确的结果。但是一旦你尝试的数字高于 127 或低于 -128,你的结果很可能是错误的

public static Integer valueOf(int i)

[...] 此方法将始终缓存 -128 到 127(含)范围内的值,并且可以缓存其他值 超出这个范围。

Source

【讨论】:

    【解决方案2】:

    检查 Integer.valueOf java 文档: 此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。

    可能缓存也可能不缓存,因此您的代码在这种情况下将无法工作。

    【讨论】:

    • 我只是用小的值来做,所以它在那个范围内....
    • “我只是用小的值做这个,所以它在那个范围内......”......直到它不是,然后你就有了一个错误.
    【解决方案3】:

    恕我直言,它不会使代码更易于阅读,更容易出错(因为并非所有值都被缓存),而且它甚至不比“传统”方法快。如果您使用旧的 equals(),您可以帮自己,也帮您的开发人员伙伴一个忙。

    无论如何,我认为没有人应该将== 与对象一起使用,如果它们意味着值相等的话。此规则的唯一例外是枚举。

    【讨论】:

    • @frontGeek 这取决于你从哪一边开始你的equals。如果你这样做Integer.valueOf(3).equals(i),你就不需要null 检查。
    • @frontGeek 这取决于对象的来源。如果它来自您自己编写的代码,那么首先要确保您永远不会返回 null 对象。
    • 或者,您可以使用new Integer(3).equals(variable)
    • 或者你只是抛弃了首先使用这些盒装比较的想法,像普通人一样做i == 3?无论如何,将原始包装器对象设置为 null 似乎是一个真的坏主意。
    • 好的,解决方案是使用Integer.valueOf(3).equals。恕我直言,您不应该依赖 -128 和 127 之间的值被缓存的事实。即使他们是,你以后会自找麻烦。
    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2013-10-02
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多