Java认证之Java数组与容器类的分析资料(4)
( D9 s7 a+ D* B6 h1 Y" g6 z/ w 3.HashMap 的性能因子
0 W+ j, [8 ^7 P. r/ @6 Z2 ? 容量 (capacity): 散列表中 bucket 的数量。
+ u/ a3 C6 h6 q1 m" K 初始化容量 (initial capacity): 创建散列表时 bucket 的数量。可以在构造方法中指定 HashMap 和 HashSet 的初始化容量。
) W9 J- V V6 l) d 尺寸 (size): 散列表中记录的数量。 ( 数组的元素个数,非 list 中元素总和 )$ A9 ]9 |) ] a
负载因子 (load factor): 尺寸 / 容量。负载因子为 0 ,表示空的散列表, 0.5 表示半满的散列表。轻负载的散列表具有冲突少,适宜插入与查询的特点,但是使用迭代器遍历会比较慢。较高的负载会减少所需空间大小。当负载达到指定值时, 容器会自动成倍地增加容量,并将原有的对象重新分配,存入新的 bucket 中,这个过程称为“重散列”。: ?- D9 I5 j7 V5 g
4. 重写 hashCode() 的关键
5 ?: K4 Q6 H7 i8 P (1) 对同一个对象调用 hashCode() 都应该生成同样的值。
8 f( l. m3 d& N" p* t$ ^; l (2) hashCode() 方法不要依赖于对象中易变的数据,当数据发生变化时, hashCode() 就会生成一个不同的散列码,即产生了一个不同的 label 。
) _ p' O7 V( ~3 V% z) a4 k (3) hashCode() 不应依赖于具有唯一性的对象信息,例如对象地址。1 [ [+ k: r- J% T
(4) 散列码应该更关心速度,而不是唯一性,因为散列码不必是唯一的。" N, I1 k( c( p! x6 r4 w# w) G2 J
(5) 好的 hashCode() 应该产生分步均匀的散列码。在 Effective Java (Addison-Wesley 2001) 中, Joshua Bloch 给 hashCode() 给出了设计指导,可以参考。8 E p. j* W7 T: X2 N1 x
编写正确高效的 hashCode() 和 equals() 可以参考 Apache 的 Jakarta Commons 项目中的工具。+ Y* C5 S2 v1 u" X
java 集合类总结& W, P4 E& n3 o
对象的集合
2 |5 n. Z0 k+ m& U- l. K 如果程序的对象数量有限,且寿命可知,那么这个程序是相当简单的。
% l8 A0 ^7 ?1 ~- P2 M& P8 H, y6 ^, j3 a
|