关于java:为何属性值相同两对象不能直接

10次阅读

共计 1703 个字符,预计需要花费 5 分钟才能阅读完成。

前言

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

示例

   @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:

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

正文完
 0