整数值比较

phi*_*ill 26 java int autoboxing integer equals

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

if (count.compareTo(0)) { 
            System.out.println(out_table);
            count++;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

我知道这count == 0是不正确的.这是正确的吗?它的价值比较运算符在哪里count=0?

Mic*_*ers 30

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

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

  • +1:关于`==`比较,在比较*两个**盒装*数字(但不是一个盒装和一个原始数字)时应该非常谨慎,因为正如mmyers所提到的,`==`测试参考相等,不是包装值的相等. (4认同)

Nat*_*ath 25

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

if (count > 0) {
    .... 
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯.并不是的.......在其他比较中,情况并非总是如此.如果您要比较两个整数并使用'=='怎么办?然后比较实例,但有时JVM不会缓存它们,因此它会将相同的值报告为不同的值.请参阅http://stackoverflow.com/questions/10002037/comparing-integer-values-in-java-strange-behavior. (2认同)

Ste*_* B. 13

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

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

void doSomethingWith(Integer integerObject){ ...
  int i = 1000;
  doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));
Run Code Online (Sandbox Code Playgroud)

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

void doSomethingWith (Integer count){
  if (count>0)  // gets compiled into count.intValue()>0
Run Code Online (Sandbox Code Playgroud)

调用此方法null将抛出一个NullPointerException.

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


dfa*_*dfa 13

你也可以使用equals:

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }
Run Code Online (Sandbox Code Playgroud)

这相当于:

 if (a.intValue() == 0) {
     // a == 0
 }
Run Code Online (Sandbox Code Playgroud)

并且:

 if (a == 0) {

 }
Run Code Online (Sandbox Code Playgroud)

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

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