.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:
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 ;
} |
-
显示您的值是什么以及预期的输出是什么。 例如,我不是100%确定call.getUserId()返回Integer,它可能会返回int。
-
@skiwi Getters仅返回整数。请查看我的编辑
Tim B回答了您的第一个问题。我只想为第二个答案添加答案。
默认情况下,在Java中,存在一个用于缓存-128至127整数的缓存。
因此,即使您使用int的对象(带盒装)表示形式,==操作也将正确运行,因为将使用缓存的值代替对象。
-
对于Integer.valueOf为True。 自动装箱也是如此。 对于新的Integer,则不是这样。
-
好吧,也许我应该更通用一些。 但是在这种特殊的Hibernate情况下,值被缓存。
-
感谢Maksim回答了我的第二个问题,并介绍了Integer缓存。
-
他没有足够的代表支持。 我投票给您,随时可以投票给我的:)
我相当确定您的测试中一定有问题。您描述的症状永远不会发生。
==不能为equals()的唯一方法是equals方法的实现不正确。如果Integer是Java的核心类,那就不会发生。
但是,可能发生的情况是,如果数据类型以不同于您预期的equals()格式的其他格式(例如,Float或Long)返回。
例如,3 == 3L返回true,但是new Integer(3).equals(new Long(3))返回false。这是因为使用原语的==情况允许将整数提升为long来执行比较。
在这里自己尝试:http://www.tryjava8.com/app/snippets/52b5878ce4b0f5090255bc17
-
感谢Tim回答了我的第一个问题并提供了链接。
-
等等,那不是怎么回事,是吗? getUserId()返回一个整数,并且ITConstants.SPECIALID也是一个整数。 此外,如果==有效,则意味着它们是同一Integer实例,因此.equals()应该有效...对吗?
-
@Erhannis正确。 正如我的第一句话所说,他的测验肯定出了点问题,因为他给出的结果基本上是不可能的。 但是,然后我解释了一个给出非常相似(但可能)症状的问题,似乎确实是问题所在。