为什么属性值相同两对象不能直接“ == ”

前言

终于结束了考试,能够继续团队的学习了,继续上周的那个问题,虽然问题解决了,可是本身不知道问题根源在哪,通过潘老师的讲解,终于明白是啥问题了。git

示例

@Test
    void example() {
        Long A = 1234L;
        Long B = 1234L;
        System.out.println( A == B);
        System.out.println(A.equals(B));

        long a = 1234L;
        long b = 1234L;
        System.out.println( a == b);
    }

结果:github

false
true
true

Long类型的A B 是两个对象,均为1234L,按照我以前的想法,既然两个对象的值同样,那么就相等,可是我却忽略了对象的比较方式,普通变量经过值进行比较,对象是经过内存调用进行比较的。segmentfault

查看一下每一个对象的Hash值以及内存调用:ide

@Test
    void example() {
        Long A = 1234L;
        Long B = 1234L;
        System.out.println(A.hashCode());
        System.out.println(B.hashCode());
        System.out.println(System.identityHashCode(A));
        System.out.println(System.identityHashCode(B));
    }

结果:学习

1234
1234
507911745
1537772520

经过对打印出的每一个对象信息的值进行对比,咱们发现,两个对象的HashCode的值是相等的,可是调用的内存地址是不相等的,这就意味着这就是两个对象,再来看一个例子:spa

@Test
    void example() {
        Long A = 1234L;
        Long B = 1234L;
        Long C = A;
        System.out.println( A == B);
        System.out.println( A == C);
        System.out.println(A.equals(B));
        System.out.println(A.hashCode());
        System.out.println(B.hashCode());
        System.out.println(System.identityHashCode(A));
        System.out.println(System.identityHashCode(B));
        System.out.println(System.identityHashCode(C));
    }

结果:指针

false
true
true
1234
1234
1234
507911745
1537772520
507911745

经过以上结果咱们能够发现,此时使用“ A == C“ 进行相等的断定,结果是true,由于他们的内存地址是相等的,这就相似于指针,内存地址指向同一地址,那就是同一个对象。code

equals()

为什么使用Spring 内置的equals()方法就能判别对象相等呢,看一下这个方法:对象

public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

重点在于longValue,因为方法所在文件为只读文件,因此只能经过本身打印去比较值:blog

@Test
    void example() {
        Long A = 1234L;
        Long B = 1234L;
        Long C = A;
        System.out.println(A.longValue());
        System.out.println(B.longValue());
        System.out.println(C.longValue());
    }

结果:

1234
1234
1234

查询了好多关于longValue()的资料,没有查到他的机制,猜想是有相似于HashCode的属性进行转换而后进行比较。

总结

以前对于对象比较的机制是不了解的,在听了老师的讲解以后恍然大悟,在本身尝试以后也了解了好多,在此感谢潘老师的指导,新的学期即将开始,但愿早点进实验室学习,还记得本身立下的Flag,通宵就结了。

某大佬的感慨:

qq_pic_merged_1598680626090.jpg
个人Flag:
qq_pic_merged_1598680666553.jpg

本文做者:河北工业大学梦云智开发团队 张文达

相关文章
相关标签/搜索