在java中等于和==行为

RKP*_*RKP 6 java

请你解释下面的行为.

public class EqAndRef {

    public static void main(String[] args) {
        Integer i = 10;
        Integer j = 10;

        Double a = 10D;
        Double b = 10D;

        System.out.println(i.equals(j));
        System.out.println(i == j);


        System.out.println(a.equals(b));
        System.out.println(a == b);


    }
}
Run Code Online (Sandbox Code Playgroud)

输出jdk 6

true
true
true
false
Run Code Online (Sandbox Code Playgroud)

为什么a == b是假的而我= = j不是假的?

5go*_*der 19

Integer小号ij构造(通过自动拳击)从整数常量从范围是从-128到127,从而,保证由JVM被汇集,从而对同一对象(见轻量级图案)被用于它们.因此,它们通过对象引用进行比较.

对于Doubles ab另一方面,没有这样的池保证,在您的情况下,您有两个不相同的对象.

使用==比较对象,如果你不是说要检查身份将被视为犯罪嫌疑人,应当避免.equals重写这两种类型的方法以比较盒装值(与对象标识相对),这就是它们true在两种情况下都返回(并且应该被使用)的原因.


Muh*_*mad 2

初始化Integers 然后你会得到@5gon12eder所说的差异

\n\n

整数 si 和 j 是从 \xe2\x80\x93128 到 127 范围内的整数文字构造的(通过自动装箱),保证由 JVM 池化,因此它们使用相同的对象(请参阅享元模式)。因此,它们通过对象引用进行比较。

\n\n

尝试这段代码来初始化你的整数

\n\n
    Integer i = new Integer(10);\n    Integer j = new Integer(10);\n
Run Code Online (Sandbox Code Playgroud)\n