Java中==与equals的比较

1        ==是直接比较物理地址(磁盘地址),无论hashcode和equals怎么重写,其比较结果是不变的

2        equals是比较引用地址(jvm地址,只能比较引用类型),但是一般重写hashcode和equlas方法,让其比较引用类型的具体值,而不是地址

        为什么重写equals就必须重写hashcode:

                hashCode方法本质就是一个哈希函数,将对象的地址值映射为integer类型的哈希值

                而为什么要重写:因为hashcode的作用就是:将相同对象(这里的相同不相同的判定是equals方法)返回相同的哈希值

                所以重写equals方法时,一定要重写hashcode方法,这样才符合Java规定(必须保证重写后的equals方法认定相同的两个对象拥有相同的哈希值)

        例子:String类的equals方法:

String对象在调用equals方法比较另一个对象时,除了认定相同地址值的两个对象相等以外,还认定对应着的每个字符都相等的两个String对象也相等,即使这两个String对象的地址值不同(即属于两个对象)。

        我为什么要遵守这个规定?

        相同对象拥有不同哈希值会造成不便。几乎可以肯定地说,hashCode方法不仅仅是与equals配套使用的,它甚至是与Java集合配套使用的

        例:hashmap/hashtable的put方法,其实际调用的是putval方法

putval方法中判断2对象是否相等(put的对象是否在集合中存在):

       为了证明两个对象是同一对象,我们要求(二者哈希值相等)且(二者地址值相等或调用equals认定相等)

        其中的第一个要求就是调用的hashcode方法

        想象一下:如果不重写,那么第一个条件不满足,相当于:对应到我们put操作就相当于执行了hashMap.put("k","v1"),hashMap.put("k":"v2"),而不是使用v2替换v1的值,这样我们的HashMap就乱套了

你可能感兴趣的:(java,开发语言)