代码之家  ›  专栏  ›  技术社区  ›  Vineet Reynolds

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

  •  10
  • Vineet Reynolds  · 技术社区  · 16 年前

    如果引用在比较时评估为相同的对象地址,则比较是否返回true?或者,它是否利用两个引用的hashCode值来确定对象是否相同?

    具体来说,我想知道 JVM管理哪些数据结构 OOP 进行参考比较?

    对我来说,不幸的是 JLS does not define how the == operator must work .Java API文档没有提到==应该做什么(它们是针对类的,对吧?)

    hashcode uniqueness ,并希望了解Sun JVM(或OpenJDK)是如何实现==运算符的。

    4 回复  |  直到 9 年前
        1
  •  10
  •   Reed Copsey    16 年前

    ==运算符只是比较引用。

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

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

        2
  •  3
  •   Mike Daniels    16 年前

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

        3
  •  2
  •   SingleShot    16 年前

    ==

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

        4
  •  0
  •   BenMorel Manish Pradhan    12 年前

    如果对象是同一个对象,则==运算符返回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的Integer始终是同一个对象,但2000的Integer将始终是不同的对象。

    这个实验表明,当对象相同时,“==”返回true。如果为“1”,则它们是相同的数字,并返回true。但如果“2000”被自动标记为不同的对象,则返回false。

    实验还表明,“==”不使用equals()或hashCode()。

    希望这能有所帮助。

    推荐文章