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,您可以:
检查是否compareTo(O)返回正数:
if (count.compareTo(0) > 0)
...
Run Code Online (Sandbox Code Playgroud)
但那看起来很傻,不是吗?更好......
使用自动装箱1:
if (count > 0)
....
Run Code Online (Sandbox Code Playgroud)
这相当于:
if (count.intValue() > 0)
...
Run Code Online (Sandbox Code Playgroud)
重要的是要注意" =="是这样评估的,Integer操作数是未装箱的而不是装箱的int操作数.否则,count == 0在count初始化时将返回false new Integer(0)(因为" =="参数相等的测试).
1从技术上讲,第一个示例使用自动装箱(在Java 1.5之前无法传递int给compareTo),第二个示例使用取消装箱.合并后的功能通常简称为"自动装箱",通常会将其扩展为调用两种类型的转换"自动装箱".对于我对术语的松散使用,我深表歉意.
Nat*_*ath 25
整数是自动装箱的,所以你可以这样做
if (count > 0) {
....
}
Run Code Online (Sandbox Code Playgroud)
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())
请注意,自动装箱/自动装箱可能会带来很大的开销(尤其是内部循环).