Java 整数值比较
我是一个Java新手,我刚刚读到一个整数类的变量,它可以在API中用三种不同的方式描述。我有以下代码:Java 整数值比较,java,integer,int,equals,autoboxing,Java,Integer,Int,Equals,Autoboxing,我是一个Java新手,我刚刚读到一个整数类的变量,它可以在API中用三种不同的方式描述。我有以下代码: if (count.compareTo(0)) { System.out.println(out_table); count++; } 这是在一个循环中,只输出out\u table 我的目标是找出如何查看integercount>0中的值 我意识到计数。比较(0)是正确的方法吗?还是计数等于(0) 我知道count==0不正确。是这
if (count.compareTo(0)) {
System.out.println(out_table);
count++;
}
这是在一个循环中,只输出out\u table
我的目标是找出如何查看integer
count>0
中的值
我意识到计数。比较(0)
是正确的方法吗?还是计数等于(0)
我知道
count==0
不正确。是这样吗?是否存在一个值比较运算符,其中它的值仅计数=0
要确定整数是否大于0,您可以:
- 检查
compareTo(O)
是否返回正数:
if (count.compareTo(0) > 0)
...
但这看起来很傻,不是吗?最好是
- 使用1:
这相当于:
if (count.intValue() > 0)
...
if (a.intValue() == 0) {
// a == 0
}
重要的是要注意,“=
”是这样计算的,其中整数
操作数未装箱,而不是整数
操作数装箱。否则,count==0
在将count
初始化为new Integer(0)
时将返回false(因为“=
”测试引用相等性)
1技术上,第一个示例使用(在Java 1.5之前,无法将int
传递给compareTo
),第二个示例使用。组合的特性通常简称为“自动装箱”,然后扩展为将两种类型的转换都称为“自动装箱”。很抱歉我对术语的使用不严格。整数是自动取消装箱的,所以您可以这样做
if (count > 0) {
....
}
虽然您当然可以在整数实例上使用compareTo
方法,但读取代码时并不清楚,因此您可能应该避免这样做
Java允许您使用自动装箱(请参阅)直接与int进行比较,因此您可以执行以下操作:
if (count > 0) { }
而Integer
实例count
会自动转换为int
进行比较
如果您在理解这一点上遇到困难,请查看上面的链接,或者想象它正在这样做:
if (count.intValue() > 0) { }
出于两个原因,最好避免不必要的自动装箱
首先,它比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中,原语和包装器对象之间的分离总是被描述为速度的混乱。自动装箱几乎隐藏了这一点,但并不完全如此——它更干净,只是为了跟踪类型。因此,如果你有一个整数对象,你可以调用compare()
或intValue()
,如果你有原语,就直接检查值 您也可以使用equals:
Integer a = 0;
if (a.equals(0)) {
// a == 0
}
这相当于:
if (count.intValue() > 0)
...
if (a.intValue() == 0) {
// a == 0
}
而且:
if (a == 0) {
}
(Java编译器会自动添加intValue())
请注意,自动装箱/自动取消装箱可能会带来很大的开销(尤其是在循环内部)。需要注意的另一件事是,如果第二个值是另一个整数对象而不是文字“0”,则“==”运算符会比较对象指针,并且不会自动取消装箱
即:
我可能会迟到,但我想和大家分享一件事:
根据输入:
System.out.println(大于零(-1))
返回false
public static boolean isGreaterThanZero(Integer value) {
return value == null?false:value.intValue() > 0;
}
返回true
因此,我认为在你的例子中,“compareTo”会更准确。前一个例子是使用自动装箱;后一种自动拆箱。+1:关于=
比较,在比较两个装箱数字(但不是一个装箱数字和一个原语数字)时应该非常谨慎,因为正如mmyers所提到的,=
测试的是引用相等,而不是包装值相等。请投票选择信息链接。请记住,count
必须为非空。运行时自动取消装箱空值时产生的异常令人困惑。+1表示自动取消装箱的负面影响。性能差异可能很大,尤其是在循环中自动(取消)装箱时。您必须使用新整数(0)
实例化a
和b
,否则isSame\u EqOperator
将是true
Goodpoint@nolith,尽管这是由于Java中的整数缓存,这在对的公认答案中得到了很好的解释。我将更改我的答案,使用您建议的编辑,并添加一条注释,说明为什么要显式使用constructor.Ummm。不是真的。。。在其他比较中,情况并非总是如此。如果比较两个整数并使用“==”会怎么样?然后比较实例,但有时JVM不会缓存它们,因此它会将相同的值报告为不同的值。请参阅。@Ingyher Integer在与int进行比较时自动取消装箱。@Alex78191:在本例中,一个装箱和一个原语比较的情况下,它起作用,最左边的值取消装箱。这对于两个整数对象的比较是不保证的,至少在2013年和所有JVM实现中都是如此。如果我记得的话,这就是重点。无论如何,使用if(count.intValue()>0){…}
作为一种实践几乎没有什么成本,但限制循环中的自动取消装箱可能是有益的。
public static boolean isGreaterThanZero(Integer value) {
return value == null?false:value.intValue() > 0;
}