整数值比较

时间:2009-06-04 21:21:47

标签: java integer int equals autoboxing

我是一个新手Java编码器,我只是读取一个整数类的变量,可以在API中描述三种不同的方式。我有以下代码:

if (count.compareTo(0)) { 
            System.out.println(out_table);
            count++;
    }

这是在一个循环中,只输出out_table 我的目标是弄清楚如何查看整数count > 0中的值。

我意识到count.compare(0)是正确的方法吗?还是count.equals(0)

我知道count == 0不正确。这是正确的吗?是否有一个价值比较运算符只有count=0

7 个答案:

答案 0 :(得分:30)

要确定Integer是否大于0,您可以:

  • 检查compareTo(O)是否返回正数:

    if (count.compareTo(0) > 0)
         ...
    

    但那看起来很傻,不是吗?更好的只是......

  • 使用autoboxing 1

    if (count > 0)
        ....
    

    这相当于:

    if (count.intValue() > 0)
        ...
    

    请务必注意,“==”的评估方式如此,Integer操作数未加框,而不是int操作数框。否则,count == 0count初始化为new Integer(0)时会返回false(因为“==”会测试参考相等性。)

1 从技术上讲,第一个示例使用autoboxing(在Java 1.5之前,您无法将int传递给compareTo),第二个示例使用{ {3}}。合并后的功能通常简称为“自动装箱”,通常会将其扩展为调用两种类型的转换“自动装箱”。对于我对术语的松散使用,我深表歉意。

答案 1 :(得分:25)

整数是自动装箱的,所以你可以做到

if (count > 0) {
    .... 
}

答案 2 :(得分:13)

最好避免不必要的自动装箱有两个原因。

首先,它比int < int慢一点,因为你(有时)会创建一个额外的对象;

void doSomethingWith(Integer integerObject){ ...
  int i = 1000;
  doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));

更大的问题是隐藏的自动装箱可以隐藏异常:

void doSomethingWith (Integer count){
  if (count>0)  // gets compiled into count.intValue()>0

使用null调用此方法会抛出NullPointerException

java中基元和包装器对象之间的分离总是被描述为速度的kludge。 Autoboxing几乎隐藏了这一点,但并不完全 - 只是为了跟踪类型而更加清晰。因此,如果你有一个Integer对象,你可以只调用compare()intValue(),如果你有原语,只需直接检查它。

答案 3 :(得分:13)

你也可以使用equals:

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }

相当于:

 if (a.intValue() == 0) {
     // a == 0
 }

还有:

 if (a == 0) {

 }

(Java编译器自动添加 intValue ())

请注意,自动装箱/自动装箱可能会带来很大的开销(尤其是内部循环)。

答案 4 :(得分:3)

虽然你当然可以在Integer实例上使用compareTo方法,但在阅读代码时并不清楚,所以你应该避免这样做。

Java允许您使用自动装箱(请参阅http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html)直接与int进行比较,因此您可以这样做:

if (count > 0) { }

Integer实例count会自动转换为int进行比较。

如果您无法理解这一点,请查看上面的链接,或者想象它是这样做的:

if (count.intValue() > 0) { }

答案 5 :(得分:1)

另外需要注意的是,如果第二个值是另一个Integer对象而不是文字'0',则'=='运算符会比较对象指针并且不会自动取消装箱。

即:

Integer a = new Integer(0);   
Integer b = new Integer(0);   
int c = 0;

boolean isSame_EqOperator = (a==b); //false!
boolean isSame_EqMethod = (a.equals(b)); //true
boolean isSame_EqAutoUnbox = ((a==c) && (a.equals(c)); //also true, because of auto-unbox

//Note: for initializing a and b, the Integer constructor 
// is called explicitly to avoid integer object caching 
// for the purpose of the example.
// Calling it explicitly ensures each integer is created 
// as a separate object as intended.
// Edited in response to comment by @nolith

答案 6 :(得分:-1)

好吧,我可能会迟到,但我想分享一些事情:

鉴于输入:     的System.out.println(isGreaterThanZero(-1));

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.compareTo(0) > 0;
}

返回 false

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.intValue() > 0;
}

返回true 所以我认为在你的案例中'compareTo'会更准确。