==运算符是如何在Java中实现的?

==运算符是如何在Java中实现的?,java,jvm,Java,Jvm,具体来说,在对象引用相等的情况下,==运算符做什么 如果引用在比较时计算到相同的对象地址,比较是否返回true?还是利用两个引用的hashCode值来确定对象是否相同 具体来说,我想知道==操作引用了JVM管理的哪些数据结构,以进行引用比较。==是否依赖于执行引用比较 不幸的是,对我来说,这是一场灾难。JavaAPI文档没有提到==应该做什么(它们是针对类的,对吗?) PS:我对上的这个问题有点好奇,我更想知道Sun JVM(或OpenJDK)是如何实现==运算符的。因为引用只是一个数字,所以引

具体来说,在对象引用相等的情况下,==运算符做什么

如果引用在比较时计算到相同的对象地址,比较是否返回true?还是利用两个引用的hashCode值来确定对象是否相同

具体来说,我想知道==操作引用了JVM管理的哪些数据结构,以进行引用比较。==是否依赖于执行引用比较

不幸的是,对我来说,这是一场灾难。JavaAPI文档没有提到==应该做什么(它们是针对类的,对吗?)


PS:我对上的这个问题有点好奇,我更想知道Sun JVM(或OpenJDK)是如何实现==运算符的。

因为引用只是一个数字,所以引用比较归结为两个数字的比较。不需要散列。

运算符比较对象引用以查看它们是否相同,即它们引用内存中的相同对象


equals()。
equals()
的默认实现使用了
=
操作符,但覆盖此行为通常是有意义的。例如,如果两个BankAccount引用具有相同的帐号,即使它们是完全不同的对象,您也可能希望它们被认为是等效的。

==运算符只是比较引用

JVM中的引用只是一个标准的对象指针。这可计算为单个32位或64位整数值(取决于平台)


当比较两个对象引用时,实际上只是比较两个32位或64位整数,如果它们相同,则等于相等。整数值是内存中的一个位置。

如果对象是同一个对象,==运算符返回true。这里没有访问hashCode()或equals()的权限

请尝试以下操作以确认:

public class Test {
    static void testEqualEqual(Integer I0, Integer I1, boolean IsEquals) {
        if(!(IsEquals == (I0 == I1)))
            throw new AssertionError();
    }
    static void testEqual(Integer I0, Integer I1, boolean IsEquals) {
        if(!(IsEquals == (I0.equals(I1))))
            throw new AssertionError();
    }
    static void testHash(Integer I0, Integer I1, boolean IsEquals) {
        if(!(IsEquals == (I0.hashCode() == I1.hashCode())))
            throw new AssertionError();
    }

    public static void main(String ... args) {
        testEqualEqual(   1,    1, true);
        testEqualEqual(2000, 2000, false);

        testEqual(   1,    1, true);
        testEqual(2000, 2000, true);

        testHash(   1,    1, true);
        testHash(2000, 2000, true);
        System.out.println("Done");
    }
}
要理解这一点,您首先应该知道,自动装箱时将缓存255号。这意味着1的整数始终是相同的对象,但2000的整数始终是不同的对象

这个实验表明,当对象相同时,'=='返回true。在“1”的情况下,它们是相同的数字,并且返回true。但是,如果“2000”是不同的对象,则返回false

实验还表明,'='不使用equals()或hashCode()


希望这能有所帮助。

据我理解,JVM将每个对象的信息存储在OOP(普通对象指针)中。我想知道==运算符是否使用此信息。更确切地说,==实现从何处获取此参考值以用于比较?@Vinet:查看我的答案以了解有关数字是如何“生成”的详细信息-指针是一个数字。里德,我明白你的意思。想知道在JVM源代码中哪里可以找到==运算符的实现吗?任何指针都会有帮助。我担心这正在进入C/C++领域。你必须看看java.Lang.Object的equals方法的实现:我相信我的评论有一些误解。如果我参考equals方法实现,我会找到一个(this==obj)比较。实际上,我想知道JVM本身将对象指针存储在哪里,这样当比较地址时,它们将返回true或false。我最终得到了它。==操作转换为字节码形式的if_acmpne指令;在执行过程中,这会从操作数堆栈中弹出对象引用并比较它们。我还没有弄清楚这些参考文献是如何获得的。但是那可以等等。谢谢,整数包装类的缓存属性的使用非常聪明。然而,我更感兴趣的是了解JVM中存储对象引用的实际类和数据结构,并最终用于引用比较操作。我现在明白你的意思,但我担心答案将在很大程度上取决于你正在查看的JVM。我认为每个JVM都有不同的内部结构(尽管实现了相同的规范)。如果您真的想知道,请检查下载的源代码。java.net/openjdk/jdk7/“>openjdk.:D