Java自动装箱规则

Java自动装箱规则,java,autoboxing,Java,Autoboxing,我是一个java新手,所以被下面的示例弄糊涂了。可以认为“==”符号将比较整数和int中的“自动装箱”整数之间的值,并比较整数之间的引用地址吗 双打和0/0怎么样 import edu.princeton.cs.introcs.*; public class Autoboxing { public static void cmp(Integer first, Integer second) { if (first < second) St

我是一个java新手,所以被下面的示例弄糊涂了。可以认为“==”符号将比较整数和int中的“自动装箱”整数之间的值,并比较整数之间的引用地址吗

双打和0/0怎么样

import edu.princeton.cs.introcs.*;

public class Autoboxing {

    public static void cmp(Integer first, Integer second) {
        if (first < second)
            StdOut.printf("%d < %d\n", first, second);
        else if (first == second)
            StdOut.printf("%d == %d\n", first, second);
        else if (first > second)
            StdOut.printf("%d > %d\n", first, second);
        else
            StdOut.printf("%d and %d are incomparable\n", first, second);
    }

    public static void main(String[] args) {
        cmp(new Integer(42), 43);
        cmp(new Integer(42), new Integer(42));
        cmp(43, 43);
        cmp(142, 142);

        Integer a0 = 1000;
        int b0 = 1000;
        Integer c0 = 1000;
        StdOut.println("a0==b0?" + (a0==b0));
        StdOut.println("a0==c0?" + (a0==c0));
        StdOut.println("b0==c0?" + (b0==c0));

        double x1 = 0.0, y1 = -0.0;
        Double a1 = x1, b1 = y1;
        StdOut.println(x1 == y1);
        StdOut.println(a1.equals(b1));

        double x2 = 0.0/0.0, y2 = 0.0/0.0;
        Double a2 = x2, b2 = y2;
        StdOut.println(x2 != y2);
        StdOut.println(!a2.equals(b2));
    }

}
import-edu.princeton.cs.introcs.*;
公共类自动装箱{
公共静态无效cmp(整数优先,整数第二){
如果(第一次<第二次)
StdOut.printf(“%d<%d\n”,第一,第二);
else if(第一个==第二个)
printf(“%d==%d\n”,第一,第二);
else if(第一个>第二个)
printf(“%d>%d\n”,第一,第二);
其他的
printf(“%d和%d不可比较\n”,第一,第二);
}
公共静态void main(字符串[]args){
cmp(新的整数(42),43);
cmp(新整数(42),新整数(42));
cmp(43,43);
化学机械抛光(142142);
整数a0=1000;
int b0=1000;
整数c0=1000;
println(“a0==b0?”+(a0==b0));
标准输出println(“a0==c0?”+(a0==c0));
println(“b0==c0?”+(b0==c0));
双x1=0.0,y1=-0.0;
双a1=x1,b1=y1;
StdOut.println(x1==y1);
标准输出ln(a1等于(b1));
双x2=0.0/0.0,y2=0.0/0.0;
双a2=x2,b2=y2;
StdOut.println(x2!=y2);
StdOut.println(!a2.等于(b2));
}
}
结果是:

42 < 43
42 and 42 are incomparable
43 == 43
142 and 142 are incomparable
=====
a0==b0?true
a0==c0?false
b0==c0?true
=====
true
false
=====
true
false
42<43
42和42是无与伦比的
43 == 43
142和142是无与伦比的
=====
a0==b0?为真
a0==c0?错误
b0==c0?为真
=====
真的
假的
=====
真的
假的
以下是您的教程

你也可以通过

0.0/0.0
NaN
至少在数学上你不能比较
无穷大。我想这就是为什么这个比较不起作用的原因

正零和负零比较相等;因此,表达式0.0==-0.0的结果为真,0.0>-0.0的结果为假

NaN是无序的,因此:

  • 数值比较运算符=如果 一个或两个操作数均为NaN(§15.20.1)

  • 如果任一操作数为NaN,则相等运算符==返回false

  • 特别是,如果x或y为NaN,(x=y)将为假

  • 不等式运算符!=如果任一操作数为NaN(§15.21.1),则返回true

  • 特别是,x=当且仅当x为NaN时,x为真

如果您检查方法,它有两个例外

也有真正的价值。但是,有两个例外:

  • 如果d1和d2都表示Double.NaN,那么equals方法 返回true,即使Double.NaN==Double.NaN的值为false

  • 如果d1代表+0.0,而d2代表-0.0,反之亦然,则即使+0.0==-0.0的值为真,相等测试的值也为假


此定义允许哈希表正常运行。

==
只能用于检查变量是否相等(如果变量是基元类型)。对于对象变量,
=
用于比较对象的引用。如果要比较对象的值,请使用
.equals()
方法。

我不建议将装箱整数与==进行比较,因为它仅适用于某些值。

当出现
算术运算符时,将进行取消装箱操作

例如:

但当
==
出现时,这取决于具体情况

如果装箱类型出现在
两侧
,它将比较
参考
。但是如果基本类型出现在
一侧
,而另一侧是装箱类型,则装箱类型将
取消装箱

例如:

PS:In
Java.lang.Integer
Cache,支持JLS要求的-128和127(含)之间的值的自动装箱的对象标识语义。

因此:


你试过了吗?System.out.println(“eq”+(新整数(10)=10));这里解释的答案谢谢~所以a2和b2都是布尔值false,因此彼此相等?
a2。如果两者都是
NAN
,则equals(b2)
将始终返回true,这在Java doc of equals方法中有记录。我也在阅读文章,似乎对于int,==比较了-127-127之间的值。是的。这是一种缓存。当你有整数时使用.equals(),当你有整数时使用==但是为什么
objectO1=3
对象o2=3
System.out.println(o1==o2)返回
true
==
的两侧都是装箱类型这是由于整数缓存造成的。在引擎盖下,编译器将上述赋值替换为
Object o1=Integer.valueOf(3)和<代码>对象o2=整数。值(3)。Integer.valueOf(int)的实现保存Integer的某些实例以供重用。因此,尽管==运算符两侧的两个对象从未解除绑定,但它们具有相同的引用。更多:
Integer a = 10;
a = a+10; //1.unboxing a to int 2.calculate a+10 3.boxing 20 to Integer.
System.out.print(a > 10); //1.unboxing a to int 2. compare
Integer a = new Integer(129);
Integer b = new Integer(129);
System.out.println(a == b); // compare reference return false
System.out.println(a == 129); // a will unboxing and compare 129 == 129 return true
Integer a = 127;
Integer b = 127; //cached, the same as b a==b return ture

Integer c = 129;
Integer d = 129; // not cached, c==d return false