我是一名 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?

有帮助吗?

解决方案

整数由autounboxed,所以你可以做

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

其他提示

要弄清楚是否 Integer 大于0,则可以:

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

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

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

  • 使用 自动装箱1:

    if (count > 0)
        ....
    

    这相当于:

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

    重要的是要注意“==" 是这样评估的, Integer 操作数未装箱而不是 int 操作数装箱。否则, count == 0 时会返回 false count 被初始化为 new Integer(0) (因为 ”==“测试参考相等性)。

1从技术上讲,第一个示例使用 自动装箱 (在 Java 1.5 之前,你无法通过 intcompareTo)第二个例子使用 拆箱. 。组合功能通常简称为“自动装箱”,然后通常会扩展为将两种类型的转换称为“自动装箱”。我为我对术语的不严谨使用表示歉意。

这是更好地避免不必要的自动装箱2倍的原因。

一方面,它比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()intValue(),如果你已经有了原始的只是直接检查的价值。

您也可以使用等于:

 Integer a = 0;

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

这相当于:

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

和也:

 if (a == 0) {

 }

(Java编译器将自动增加的的intValue ())

请注意自动装箱/ autounboxing可以引入一个显著开销(特别是内部循环)。

虽然你当然可以使用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) { }

还有一点要注意是,如果所述第二值是另一个整数对象,而不是字面“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

嗯,我可能会在这晚,但我想与大家分享的东西:

给定了输入:     的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 所以,我认为在yourcase“的compareTo”将更加准确。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top