4

前言

终于结束了考试,可以继续团队的学习了,继续上周的那个问题,虽然问题解决了,但是自己不知道问题根源在哪,经过潘老师的讲解,终于明白是啥问题了。

示例

   @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);
    }

结果:

false
true
true

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

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

    @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的值是相等的,但是调用的内存地址是不相等的,这就意味着这就是两个对象,再来看一个例子:

 @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,因为他们的内存地址是相等的,这就类似于指针,内存地址指向同一地址,那就是同一个对象。

equals()

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

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

重点在于longValue,由于方法所在文件为只读文件,所以只能通过自己打印去比较值:

    @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

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


锦城
854 声望21 粉丝

好好生活