Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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_Comparison_Object Comparison - Fatal编程技术网

Java 如何比较两个整数?

Java 如何比较两个整数?,java,comparison,object-comparison,Java,Comparison,Object Comparison,我必须比较两个Integer对象(而不是int)。比较它们的标准方法是什么 Integer x = ... Integer y = ... 我可以这样想: if (x == y) =运算符仅比较引用,因此这仅适用于较低的整数值。但也许自动拳击开始了 if (x.equals(y)) 这看起来像是一个昂贵的手术。有没有这样计算的散列码 if (x.intValue() == y.intValue()) 有点冗长 编辑:感谢您的回复。虽然我知道现在该怎么做,但事实是分布在所有现有答案上的

我必须比较两个
Integer
对象(而不是
int
)。比较它们的标准方法是什么

Integer x = ...
Integer y = ...
我可以这样想:

if (x == y) 
=
运算符仅比较引用,因此这仅适用于较低的整数值。但也许自动拳击开始了

if (x.equals(y)) 
这看起来像是一个昂贵的手术。有没有这样计算的散列码

if (x.intValue() == y.intValue())
有点冗长


编辑:感谢您的回复。虽然我知道现在该怎么做,但事实是分布在所有现有答案上的(甚至是删除的答案:),我真的不知道该接受哪一个。因此,我将接受最佳答案,它涉及所有三种比较可能性,或至少前两种。

使用
equals
方法。你为什么这么担心它太贵了?

我会选择x.equals(y),因为这是检查所有类是否相等的一致方法

就性能而言,equals实际上更昂贵,因为它最终调用intValue()

编辑:在大多数情况下,应避免自动装箱。这会让人很困惑,尤其是作者不知道自己在做什么。你可以试试这段代码,结果会让你大吃一惊

Integer a = 128;
Integer b = 128;

System.out.println(a==b);
这看起来像是一个昂贵的手术。有没有这样计算的散列码

if (x.intValue() == y.intValue())
这不是一个昂贵的操作,也不会计算哈希码。Java不会神奇地计算哈希代码,
equals(…)
只是一个方法调用,与任何其他方法调用都没有区别

JVM甚至很可能会优化方法调用(内联方法内部发生的比较),因此此调用不会比在两个基本
int
值上使用
=
昂贵多少

注意:不要过早地应用微优化;您的假设(如“这一定很慢”)很可能是错误的或无关紧要的,因为代码不是性能瓶颈。

就是“等于”。为了安全起见,您应该测试空值:

x == y || (x != null && x.equals(y))
x==y测试null==null,IMHO应该为true

如果JIT调用的次数足够多,那么代码将由JIT内联,因此性能考虑应该无关紧要

当然,如果可以的话,避免使用“整数”而使用普通的“int”是最好的方法

[补充]


此外,还需要空检查来保证相等性测试是对称的——x.equals(y)应该与y.equals(x)相同,但如果其中一个为空,则不是对称的。

这就是equals方法所做的:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
正如您所看到的,这里没有哈希代码计算,但是还有一些其他操作正在进行。虽然
x.intValue()==y.intValue()
可能会稍微快一点,但您正在进入微优化领域。另外,编译器可能会优化
equals()
调用,尽管我不确定这一点


我通常会使用原语
int
,但如果必须使用
Integer
,我会坚持使用
equals()

Integer类实现
Compariable
,因此您可以尝试

x.compareTo(y) == 0
另外,如果不是相等,而是比较这些整数

x.compareTo(y)<0
将告诉您x是否小于y

x.compareTo(y)>0
将告诉您x是否大于y


当然,在这些示例中,在进行这些调用之前确保x是非null是明智的。

次要注意:由于Java 1.7 Integer类有一个静态的
比较(Integer,Integer)
方法,因此您可以只调用
Integer.compare(x,y)
并完成它(关于优化的问题除外)


当然,该代码与1.7之前的Java版本不兼容,因此我建议改为使用
x.compareTo(y)
,这与1.2兼容。

比较整数并按升序或降序打印其值。您所要做的就是实现Comparator接口并重写其compare方法,并按如下方式比较其值:

@Override
public int compare(Integer o1, Integer o2) {
    if (ascending) {
        return o1.intValue() - o2.intValue();
    } else {
        return o2.intValue() - o1.intValue();
    }

}

我只是在代码中遇到了这个问题,我花了一段时间才弄明白。我在做两个排序列表的交集,只得到输出中的小数字。在比较过程中,我可以使用
(x-y==0)
而不是
(x==y)

不应该使用整数x=。。。首先,使用int x=。。。这只是一个展示x和y类型的例子。事实上,这些值来自一个列表,其中a不能使用int。我可以把你比作夏天吗?@starblue:原始包装器类的存在有一个(非常好的)原因。“首先,你不应该使用整数x=…”听起来充其量也有点误导。包装器的存在是为了将整数对象放入数据结构,而不是用于包含单个整数的变量。不是绝对值,但考虑到在程序集级别进行整数比较是多么便宜,我认为它只会变得更糟。不要关心微观优化。那么你认为Integer.equals()到底做了什么呢?我把赌注押在“a.value==b.value”@ammoQ:本质上是这样的,但似乎有一个带有instanceof operation的if子句,将b转换为整数,并调用其intValue()方法。因此,它肯定比原始整数比较更昂贵。@Joonas:但这听起来像是JVM中的JIT编译器很容易处理的事情?equals是在真正的
=
之前执行
实例检查、
强制转换和调用
intValue()
。当然,这不是进行过早优化的理由。如果引用为null,则让NullPointerException抛出几乎总是更好的。但是,如果没有有效的情况下值为null,则肯定不会使用“Integer”而不是“int”?虽然这对非null值有效,但如果调用对象本身为nu,则会失败