有句名言,叫做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 结构
由于HashSet 结构的特殊性,如果我们需要使用HashSet 的特性来加快查找的话。
我们自己定义的类 hashCode 必须与 equals 方法兼容。
因为如果hashCode 返回的是id, equals 比较的name, 当equals 不等再添加元素到HashSet 里面去后,
散列冲突将会很严重。
总结
1 HashSet 中不存在equals 相同的数据。
2 HashSet 的存储是无序的。
3 hashCode 和equals 必须兼容。