Java 集合 HashMap & HashSet 拾遗
Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果 选择合适的散列函数, put() 和 get() 方法可以在常数时间内完成,因为较好的散列减少了散列冲突,使时间主要花在对桶寻址上(数组) ,而较少去遍历桶中的链表。但在对HashMap 进行迭代时,需要遍历整个table以及后面跟的冲突链表 。因此对于迭代比较频繁的场景,不宜将HashMap的初始大小设的过大。 有两个参数可以影响HashMap的性能:初始容量(inital capacity)和负载系数(load factor) 。初始容量指定了初始 table 的大小,负载系数用来指定自动扩容的临界值。当 entry 的数量超过 capacity*load_factor 时,容器将自动扩容并重新哈希。对于插入元素较多的场景,将初始容量设大可以减少重新哈希的次数。 将对向放入到HashMap或HashSet中时,有两个方法需要特别关心: hashCode() 和 equals() 。 hashCode() 方法决定了对象会被放到哪个 bucket 里,当多个对象的哈希值冲突时, equals() 方法决定了这些对象是否是“同一个对象” 。所以,如果要将自定义的对象放入到 HashMap 或