【问题标题】:.equals() and == in Java on Integer (== worked but .equals did not!!)Java 中的 .equals() 和 == 整数(== 有效,但 .equals 无效!!)
【发布时间】:2013-12-21 11:39:56
【问题描述】:

代码:

call.getUserId().equals(ITConstants.SPECIALID)

public static final Integer SPECIALID= 0;

POJO:

public class ImCall implements java.io.Serializable {
private Integer userId;

HBM:

<property name="userId">
  <column name="USER_ID" />
</property>

MySQL:

int(11) is the datatype in MySQL

当 UserId 为零时,“.equals()”不起作用(返回 false),但令人惊讶的是,“==”起作用了(返回 true)。 我以为是Tomcat服务器出了问题,所以我清理了它并重新启动。 还是同样的问题。

但又过了几天,我上面提到的问题没有再次出现。 但是现在,== 和 .equals() 都有效!

所以,我的第一个问题是,是否存在“==”有效而“.equals()”无效的情况。 第二个问题是,为什么 "==" 在这种情况下返回 true?

编辑:

Getter 只返回整数。

public Integer getUserId() {
    return userId;
}

public void setUserId(Integer userId) {
    this.userId = userId;
}

【问题讨论】:

  • 显示你的价值观是什么以及预期的输出是什么。例如,我不能 100% 确定 call.getUserId() 返回一个 Integer,它可能返回一个 int
  • @skiwi Getters 仅返回整数。请查看我的编辑

标签: java mysql hibernate enums equals


【解决方案1】:

我很确定你的测试一定有问题。你描述的症状不应该发生。

== 不成为equals() 的唯一方法是您的equals 方法的实现不正确。对于核心 Java 类 Integer,这是不会发生的。

但是,如果返回的数据类型与您预期的格式不同(例如FloatLong),equals() 可能会在那里失败。

例如,3 == 3L 返回 true,但 new Integer(3).equals(new Long(3)) 返回 false。这是因为带有原语的 == 情况允许将整数提升为 long 以执行比较。

在这里自己尝试一下:http://www.tryjava8.com/app/snippets/52b5878ce4b0f5090255bc17

【讨论】:

  • 感谢蒂姆回答我的第一个问题并提供链接。
  • 等等,不过,这不是正在发生的事情,是吗? getUserId() 返回一个 Integer,ITConstants.SPECIALID 也是一个 Integer。此外,如果 == 有效,那么这意味着它们是同一个 Integer 实例,因此 .equals() 应该有效......对吗?
  • @Erhannis 正确。正如我的第一句话所说,他的测试肯定有问题,因为他给出的结果基本上是不可能的。然而,我随后解释了一个问题,该问题给出了非常相似(但可能)的症状,看起来确实是问题所在。
【解决方案2】:

Tim B 回答了您的第一个问题。我只想为第二个添加答案。

在 Java 中,默认情况下有一个整数缓存 从 -128 到 127

因此,即使您使用 int 的对象(盒装)表示,== 操作也将正常工作,因为将使用缓存值而不是对象。

【讨论】:

  • 对 Integer.valueOf 为真。自动拳击也是如此。对于 new Integer 则不成立。
  • 好吧,也许我应该更笼统一些。但是在这种特殊的 Hibernate 案例中,值是被缓存的。
  • 感谢 Maksim 回答我的第二个问题并介绍整数缓存。
  • 他没有足够的代表来投票。我投了你的票,请随意投我的票:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2018-01-08
  • 2011-11-23
相关资源
最近更新 更多