我是一个新手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
?
答案 0 :(得分:30)
要确定Integer
是否大于0,您可以:
检查compareTo(O)
是否返回正数:
if (count.compareTo(0) > 0)
...
但那看起来很傻,不是吗?更好的只是......
使用autoboxing 1 :
if (count > 0)
....
这相当于:
if (count.intValue() > 0)
...
请务必注意,“==
”的评估方式如此,Integer
操作数未加框,而不是int
操作数框。否则,count == 0
在count
初始化为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'会更准确。