HashCode

169 阅读1分钟

Object - hashCode

    public native int hashCode();  
    
-   hashCode()返回该对象的哈希码值(也叫散列码)  
-   hashCode()主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable..

问题点 & 应用场景

-   当一个不可重复的对象集合进行添加时,新增的对象要与使用集合内的所有对象进行地址equals()比较,
    当集合的数据量较为庞大时,就会很影响效率,此时时间复杂度为O(n)

-   给每个对象生成对应的Hash值,把所有已经存在的元素的Hash值保存到一张table里,
    当我们添加新的元素的时候,给对应元素生成对应的Hash值,然后再对比table里所有的Hash对比,不存在则新增,存在则不添加

equals 和 hashcode 的关系(规则)

-   如果equalstrue,hashcode一定相等
-   如果equalsfalse,hashcode不一定不相等
-   如果hashcode值相等,equals不一定相等
-   如果hashcode值不等,equals一定不等

重写equals方法时,一定要重写hashcode方法

TestModel model = new TestModel("小花狗");
TestModel model2 = new TestModel("小花狗");

-   上述当重写equals方法后,判断对象为true,但其hashcode却不一致
    (因为hashCode是获取对象的内存地址后再去进行hash算法的),这样就会违反规则。

String - hashCode

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

-   hashCode计算方式: 循环遍历相加每隔字符*31