关于mysql:.equals()和==在Java上的Integer(==起作用但是.equals无效!!)

.equals() and == in Java on Integer (== worked but .equals did not!!)

码:

1
2
3
call.getUserId().equals(ITConstants.SPECIALID)

public static final Integer SPECIALID= 0;

POJO:

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

HBM:

1
2
3
<property name="userId">
  <column name="USER_ID" />
</property>

MySQL:

1
int(11) is the datatype in MySQL

当UserId为零时,"。equals()"不起作用(返回false),但是令人惊讶的是," =="有效(返回true)。
我以为是由于Tomcat Server中的某些问题,所以我将其清理并重新启动。
还是一样的问题。

但是过了几天,我上面提到的问题仍然没有发生。
但是现在,==和.equals()都可以使用!

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

编辑:

吸气剂仅返回整数。

1
2
3
4
5
6
7
public Integer getUserId() {
    return userId;
}

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


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

默认情况下,在Java中,存在一个用于缓存-128至127整数的缓存。

因此,即使您使用int的对象(带盒装)表示形式,==操作也将正确运行,因为将使用缓存的值代替对象。


我相当确定您的测试中一定有问题。您描述的症状永远不会发生。

==不能为equals()的唯一方法是equals方法的实现不正确。如果Integer是Java的核心类,那就不会发生。

但是,可能发生的情况是,如果数据类型以不同于您预期的equals()格式的其他格式(例如,FloatLong)返回。

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

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