Java Hour 28 HashSet

有句名言,叫做10000小时成为某一个领域的专家。姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧。

Hour 28

HashSet 为查找而生

LinkedList查找效率低下,ArrayList 在不知道X 的位置序号的时候,效率也是极低的。

提到HashSet 就不得不提HashCode.

Object 类自带了该方法。

public native int hashCode();

一般来说是这个对象的内存地址转成的一个整形数值。

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;
    }

最终结果就是:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

这个也许是Java 的好处吧,可以很方便的查看到源码。

在C# 中,查看源码的功能总是比较的曲折,当然有Resharper 的人除外。

HashSet 结构

Java Hour 28 HashSet

由于HashSet 结构的特殊性,如果我们需要使用HashSet 的特性来加快查找的话。

我们自己定义的类 hashCode 必须与 equals 方法兼容。

因为如果hashCode 返回的是id, equals 比较的name, 当equals 不等再添加元素到HashSet 里面去后,

散列冲突将会很严重。

总结

1 HashSet 中不存在equals 相同的数据。

2 HashSet 的存储是无序的。

3 hashCode 和equals 必须兼容。

上一篇:【转】C#程序打包安装部署之添加注册表项


下一篇:查看SQL Server服务运行帐户和SQL Server的所有注册表项