前言

终于完结了考试,能够持续团队的学习了,持续上周的那个问题,尽管问题解决了,然而本人不晓得问题本源在哪,通过潘老师的解说,终于明确是啥问题了。

示例

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

后果:

falsetruetrue

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

后果:

123412345079117451537772520

通过对打印出的每个对象信息的值进行比照,咱们发现,两个对象的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));    }

后果:

falsetruetrue1234123412345079117451537772520507911745

通过以上后果咱们能够发现,此时应用“ 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());    }

后果:

123412341234

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

总结

之前对于对象比拟的机制是不理解的,在听了老师的解说之后豁然开朗,在本人尝试之后也理解了好多,在此感激潘老师的领导,新的学期行将开始,心愿早点进实验室学习,还记得本人立下的Flag,通宵就结了。

某大佬的感叹:


我的Flag:

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