why在重写equals时还必须重写hashcode方法

首先咱们先来看下String类的源码:能够发现String是重写了Object类的equals方法的,而且也重写了hashcode方法java

public boolean equals(Object anObject) {算法

    if (this == anObject) {this

        return true;code

    }对象

    if (anObject instanceof String) {源码

        String anotherString = (String)anObject;hash

        int n = count;效率

        if (n == anotherString.count) {List

        char v1[] = value;程序

        char v2[] = anotherString.value;

        int i = offset;

        int j = anotherString.offset;

        while (n-- != 0) {

            if (v1[i++] != v2[j++])

            return false;

        }

        return true;

        }

    }

    return false;

    }

public int hashCode() {

    int h = hash;

    if (h == 0) {

        int off = offset;

        char val[] = value;

        int len = count;

            for (int i = 0; i < len; i++) {

                h = 31*h + val[off++];

            }

            hash = h;

        }

        return h;

    }

 

 

那为何在重写equals方法时都要重写equals方法呢:
首先equals与hashcode间的关系是这样的:

一、若是两个对象相同(即用equals比较返回true),那么它们的hashCode值必定要相同;

二、若是两个对象的hashCode相同,它们并不必定相同(即用equals比较返回false)   

自个人理解:因为为了提升程序的效率才实现了hashcode方法,先进行hashcode的比较,若是不一样,那没就没必要在进行equals的比较了,这样就大大减小了equals比较的

次数,这对比须要比较的数量很大的效率提升是很明显的,一个很好的例子就是在集合中的使用;

咱们都知道java中的List集合是有序的,所以是能够重复的,而set集合是无序的,所以是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法同样比较的

话,若是原来集合中之后又10000个元素了,那么放入10001个元素,难道要将前面的全部元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,所以hashcode

就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据

只要看对应的hashcode地址上是否有值,那么就用equals比较,若是没有则直接插入,只要就大大减小了equals的使用次数,执行效率就大大提升了。

继续上面的话题,为何必需要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的状况下hashcode值一定相同,若是重写了equals而未重写

hashcode方法,可能就会出现两个没有关系的对象equals相同的(由于equal都是根据对象的特征进行重写的),但hashcode确实不相同的

相关文章
相关标签/搜索