终于结束了考试,能够继续团队的学习了,继续上周的那个问题,虽然问题解决了,可是本身不知道问题根源在哪,通过潘老师的讲解,终于明白是啥问题了。git
@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); }
结果:github
false true true
Long类型的A B 是两个对象,均为1234L,按照我以前的想法,既然两个对象的值同样,那么就相等,可是我却忽略了对象的比较方式,普通变量经过值进行比较,对象是经过内存调用进行比较的。segmentfault
查看一下每一个对象的Hash值以及内存调用:ide
@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的值是相等的,可是调用的内存地址是不相等的,这就意味着这就是两个对象,再来看一个例子:spa
@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,由于他们的内存地址是相等的,这就相似于指针,内存地址指向同一地址,那就是同一个对象。code
为什么使用Spring 内置的equals()方法就能判别对象相等呢,看一下这个方法:对象
public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; }
重点在于longValue,因为方法所在文件为只读文件,因此只能经过本身打印去比较值:blog
@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:
本文做者:河北工业大学梦云智开发团队 张文达