可能重复:
Integer wrapper class and == operator - where is behavior specified?
我知道-127~128中的Java整数使用缓存。 如果
Integer i = 1;
Integer j = 1;
Integer m = 128;
Integer n = 128;
i == j // true
m == n // false
但我遇到了一个奇怪的现象。首先,请看下面的片段。
List<CustomerNotice> customerNotice = findByExample(example); // use Hibernate findByExample method
for(CustomerNotice n : customerNotice){
if(n.getConfirmStatus() == NoticeConfirmStatus.UNCONFIRMED.getValue()){
// do sth
}
}
public enum NoticeConfirmStatus{
UNCONFIRMED(1), //
CONFIRMED(2), //
FAILED_TO_CONFIRM(3); //
private final Integer value;
private NoticeConfirmStatus(Integer value) {
this.value = value;
}
public Integer getValue() {
return this.value;
}
}
public class CustomerNotice {
@Column(name = "CONFIRM_STATUS")
private Integer confirmStatus;
public Integer getConfirmStatus() {
return this.confirmStatus;
}
public void setConfirmStatus(Integer confirmStatus) {
this.confirmStatus = confirmStatus;
}
}
虽然不建议使用if表达式,但我认为它会返回true,因为n.getConfirmStatus()==1
,但结果是假的。我很困惑。
另外,Hibernate获取List<CustomerNotice> customerNotice
findByExample方法。检索结果集时是否有一些自动装箱或新操作?
谢谢。
答案 0 :(得分:3)
你会让自己疯狂,浪费大量时间试图弄清楚这种情况有效还是不起作用的特定情况。这取决于代码的实现,这对您来说并不总是可见。
底线:永远不要使用==
来比较Integer
个实例,期间。正如你所看到的,它在某些情况下有时会起作用,并且在其余时间都会失败。如果您有一个返回整数的方法,那么将该值分配给int
,然后您可以使用==
将int
与另一个int
进行比较。
答案 1 :(得分:3)
简短(回答问题)
如果您想将Integers
作为对象进行比较,则应使用.equals
:
i.equals(j);
m.equals(n);
有了这个,他们都应该返回true
。但是,如果您真的想使用==
,则需要获得原始int
值:
i.intValue() == j.intValue();
m.intValue() == j.intValue();
LONG:(解释答案)
这样做的基础是Object
总是分别存储在内存中(除了m=n
之类的一些特殊情况),要进行正确比较,需要将它们分解为基本类型可以使用==
成功比较。
每个Object
都有.equals()
方法,该方法继承自Object
作为其超类。但是,必须重写它才能进行适当的比较。 Integer
重写此方法以成功地与Integer
个对象进行比较,同时使用==
检查以查看两个对象是否指向内存中的相同空间,并且因为{{1}的两个实例}无法指向内存中的相同空间,这将始终返回Object
。
但是,正如您的代码指出的那样,有一些特殊情况可以起作用,如下所示:
false
被视为“标准实例”,可以使用Integer i = 1
进行比较。==
将一个Object
设置为等于另一个=
,则Java会将两个对象指向内存中的相同位置,这意味着==
将返回true
还有很多其他的,但这些是我想到的并且看起来相关的两个。