==、equals和hashcode的关系

514 阅读1分钟

==

==对于基本类型而言比较的的是值是否相等,对于引用类型比较的是对象所在堆中的地址是否相同。

equals

equals比较的是值是否相等;比如String的equals的方法:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

首先用到了==比较地址是否相同,地址不相同的话比较值是否相同;

hashcode

场景:想把自定义的类作为key加入哈希表的时候,要把这个类的hashCode和equals方法重写

哈希表的存储结构就是想要把具有相同key值的数据保存在同一个链表中,再通过equals方法确定具体是哪个值,找到value。

如果不重写hashCode方法,默认使用Object的hashCode的方法,hashCode返回的值是对象的地址,所有如果两个对象定义的变量都相等,使用hashCode方法应该返回同样的值。

如果不重写的话,只能通过同一个对象才能获取到value的值。

下面就是根据对象的name和tmp值来实现hashCode方法,返回hash值:

没有重写hashCode:

企业微信截图_7b19523e-474c-4aab-ad33-486987f585c1.png

重写hashCode: 企业微信截图_e06c8ac4-7349-4134-bdb6-6def929e04bc.png