前言
终于完结了考试,能够持续团队的学习了,持续上周的那个问题,尽管问题解决了,然而本人不晓得问题本源在哪,通过潘老师的解说,终于明确是啥问题了。
示例
@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:
本文作者:河北工业大学梦云智开发团队 张文达