题
我是一名 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
时会返回 falsecount
被初始化为new Integer(0)
(因为 ”==
“测试参考相等性)。
1从技术上讲,第一个示例使用 自动装箱 (在 Java 1.5 之前,你无法通过 int
到 compareTo
)第二个例子使用 拆箱. 。组合功能通常简称为“自动装箱”,然后通常会扩展为将两种类型的转换称为“自动装箱”。我为我对术语的不严谨使用表示歉意。
这是更好地避免不必要的自动装箱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”将更加准确。