前言
终于结束了考试,可以继续团队的学习了,继续上周的那个问题,虽然问题解决了,但是自己不知道问题根源在哪,经过潘老师的讲解,终于明白是啥问题了。
示例
@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:
本文作者:河北工业大学梦云智开发团队 张文达
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。