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

如何在Java中实现==操作符?

  •  9
  • Vineet Reynolds  · 技术社区  · 15 年前

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

    如果引用在比较时对相同的对象地址进行计算,比较是否返回true?或者它是否使用两个引用的hashcode值来确定对象是否相同?

    具体来说,我想知道 由JVM管理的数据结构 被==操作引用以进行引用比较。是否==依赖 OOP 进行参考比较?

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

    附言:我对这个问题有点好奇 hashcode uniqueness ,并希望知道sun jvm(或openjdk)是如何实现==运算符的。

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

    ==运算符只比较引用。

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

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

        2
  •  3
  •   Mike Daniels    15 年前

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

        3
  •  2
  •   SingleShot    15 年前

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

    这个 equals() 方法比较对象引用以查看它们是否等效,尽管不一定相同。默认实现 等式() 使用 = 运算符,但重写此行为通常是有意义的。例如,如果两个银行帐户引用具有相同的帐号,即使它们是完全不同的对象,也可能希望它们被视为等效的。

        4
  •  0
  •   BenMorel Manish Pradhan    10 年前

    如果对象是同一对象,==运算符返回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的整数始终是不同的对象。

    实验表明,当对象相同时,==返回真。在“1”的情况下,它们是相同的数字,它返回true。但在“2000”的情况下,自动盒是不同的对象,所以它返回false。

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

    希望这有帮助。