27

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

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

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

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

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

4

7 回答 7

31

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

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

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

    但这看起来很愚蠢,不是吗?最好只是...

  • 使用自动装箱1

    if (count > 0)
        ....
    

    这相当于:

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

    重要的是要注意 " ==" 是这样计算的,Integer操作数未装箱而不是int操作数已装箱。否则,在初始化为时count == 0将返回 false (因为 " " 测试引用相等性)。countnew Integer(0)==

1从技术上讲,第一个示例使用自动装箱(在 Java 1.5 之前,您无法传递intto compareTo),第二个示例使用unboxing。组合功能通常简称为“自动装箱”,然后通常将其扩展为将两种类型的转换称为“自动装箱”。我为我对术语的松懈使用表示歉意。

于 2009-06-04T21:24:34.027 回答
27

整数是自动拆箱的,所以你可以这样做

if (count > 0) {
    .... 
}
于 2009-06-04T21:25:52.840 回答
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 中的基元对象和包装对象之间的分离总是被描述为速度的混搭。自动装箱几乎隐藏了这一点,但并不完全——它只是为了跟踪类型而变得更干净。因此,如果您有一个 Integer 对象,您可以调用compare()or intValue(),如果您有原始对象,则直接检查该值。

于 2009-06-04T21:42:04.493 回答
13

您还可以使用等于:

 Integer a = 0;

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

这相当于:

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

并且:

 if (a == 0) {

 }

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

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

于 2009-06-04T21:42:13.743 回答
3

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

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) { }
于 2009-06-04T21:28:32.833 回答
1

要注意的另一件事是,如果第二个值是另一个整数对象而不是文字“0”,则“==”运算符会比较对象指针并且不会自动拆箱。

IE:

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
于 2012-09-28T19:12:53.233 回答
-1

好吧,我可能迟到了,但我想分享一些东西:

给定输入: System.out.println(isGreaterThanZero(-1));

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

返回

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

返回 true 所以我认为在你的情况下 'compareTo' 会更准确。

于 2017-07-11T10:55:38.110 回答