如何在Java中正确比较Integer

时间:2011-12-15 03:31:27

标签: java comparable

  

可能重复:
  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方法。检索结果集时是否有一些自动装箱或新操作?

谢谢。

2 个答案:

答案 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

但是,正如您的代码指出的那样,有一些特殊情况可以起作用,如下所示:

  1. 您的代码使用的false被视为“标准实例”,可以使用Integer i = 1进行比较。
  2. 如果使用==将一个Object设置为等于另一个=,则Java会将两个对象指向内存中的相同位置,这意味着==将返回true
  3. 还有很多其他的,但这些是我想到的并且看起来相关的两个。