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