Java 两个包装器对象如何可以相等,但不能同时相等

Java 两个包装器对象如何可以相等,但不能同时相等,java,integer,comparison,Java,Integer,Comparison,我有以下代码: class ABC { public static void main(String[] args) { Integer inta = new Integer(10); Integer intb = new Integer(10); if (inta <= intb) { System.out.println("inta is less than intb"); }

我有以下代码:

class ABC
{
    public static void main(String[] args) {
        Integer inta = new Integer(10);
        Integer intb = new Integer(10);
        if (inta <= intb) {
            System.out.println("inta is less than intb");
        }
        if (inta >= intb) {
            System.out.println("inta is greater than intb");
        }
        if (inta != intb) {
            System.out.println("inta is not equal to intb");
        }
    }
}

有人能解释为什么会这样吗?一个对象如何能同时相等和不相等?

它满足第一个和第二个,因为编译器需要大于(
)或小于比较(
使用
inta.compareTo(intb)
)的基元类型,并检查返回的值

e、 g

int res=inta.compareTo(intb);
如果(res<0)
{
System.out.println(“inta小于intb”);
}
如果(分辨率>0)
{
System.out.println(“inta大于intb”);
}
如果(res!=0)
{
System.out.println(“inta不等于intb”);
}

重复我对OP的评论:前两个测试中使用的运算符不正确,因为它们测试“小于或等于”和“大于或等于”,并将其更改为<和>,这将适用于这些情况,因为在这些情况下,基本int是不固定的。但是,==正在检查它们是否是相同的对象,而不是相同的对象,因此它将返回
false
,除非您有类似
inta==inta
的内容,否则包装器对象仍然是对象;如果执行对象等价性在它们上面(
==
),除非它们是完全相同的引用,否则将始终是
false

取消装箱是因为我们正在使用,这将取消装箱到一个运算符可以遵守的类型-在本例中为
int
。比较就像没有包装一样进行

通过使用
valueOf()
,事情会变得有趣

如果您的表情是这样的:

Integer inta = Integer.valueOf(10);
Integer intb = Integer.valueOf(10);
…然后执行
inta==intb
将等于
true
,因为这两个值都在[-128127]的缓存范围内

因为您试图查看一个值是否大于、大于或等于另一个值,然后考虑使用它。<代码>整数是一个<代码>可比的实体,因此您可以简单地这样做:

System.out.println(inta.compareTo(intb) < 0); // to check for a < b
System.out.println(inta.compareTo(intb) == 0); // to check for a == b
System.out.println(inta.compareTo(intb) > 0); // to check for a > b
System.out.println(inta.compareTo(intb)<0);//检查a0);//检查a>b

您也可以尝试使用
整数inta=10;整数intb=10;
,您将得到不同的结果。@这与缓存无关。@assylias我尝试过它,得到以下输出inta小于intb inta大于intb
=
大于或等于.And==检查它们是否是同一个对象,而不是。使用compareTo()并检查从该对象返回的值。@cole op不是这样做并得到false吗?我认为您误解了缓存的应用位置。
Integer inta = Integer.valueOf(10);
Integer intb = Integer.valueOf(10);
System.out.println(inta.compareTo(intb) < 0); // to check for a < b
System.out.println(inta.compareTo(intb) == 0); // to check for a == b
System.out.println(inta.compareTo(intb) > 0); // to check for a > b