.equals()和==在Java上整数(==工作但.equals没有!!)

时间:2013-12-21 11:39:56

标签: java mysql hibernate enums equals

代码:

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 Server中的一些问题。所以我清理它并重新启动。 仍然是同一个问题。

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

所以,我的第一个问题是,当“==”有效并且“.equals()”没有时,是否存在任何情况。 第二个问题是,为什么“==”在这种情况下返回true?

编辑:

Getters仅返回Integer。

public Integer getUserId() {
    return userId;
}

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

2 个答案:

答案 0 :(得分:2)

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

如果==方法执行不当,equals()不能成为equals的唯一方法。对于Integer,这是一个核心Java类,这是不会发生的。

然而,可能发生的情况是,如果数据类型以不同的格式(例如FloatLong)返回,而不是您预期equals()可能在那里失败。

例如3 == 3L返回true,但new Integer(3).equals(new Long(3))返回false。那是因为带有基元的== case允许将整数提升为long来执行比较。

请在此处自行尝试:http://www.tryjava8.com/app/snippets/52b5878ce4b0f5090255bc17

答案 1 :(得分:2)

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

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

因此,即使使用int的object(boxed)表示,==操作也能正常工作,因为将使用缓存的值而不是object。