Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 整数值比较_Java_Integer_Int_Equals_Autoboxing - Fatal编程技术网

Java 整数值比较

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不正确。是这

我是一个Java新手,我刚刚读到一个整数类的变量,它可以在API中用三种不同的方式描述。我有以下代码:

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;
}