快速业务通道

通过分析JDK源代码研究Hash存储机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
少 Hash 表(就是 那个 Entry 数组)所占用的内存空间,但会增加查询数据的时间开销,而查询 是最频繁的的操作(HashMap 的 get() 与 put() 方法都要用到查询);减小负 载因子会提高数据查询的性能,但会增加 Hash 表所占用的内存空间。

掌握了上面知识之后,我们可以在创建 HashMap 时根据实际需要适当地调整 load factor 的值;如果程序比较关心空间开销、内存比较紧张,可以适当地增 加负载因子;如果程序比较关心时间开销,内存比较宽裕则可以适当的减少负载 因子。通常情况下,程序员无需改变负载因子的值。

如果开始就知道 HashMap 会保存多个 key-value 对,可以在创建时就使用 较大的初始化容量,如果 HashMap 中 Entry 的数量一直不会超过极限容量 (capacity * load factor),HashMap 就无需调用 resize() 方法重新分配 table 数组,从而保证较好的性能。当然,开始就将初始容量设置太高可能会浪 费空间(系统需要创建一个长度为 capacity 的 Entry 数组),因此创建 HashMap 时初始化容量设置也需要小心对待。

通过分析JDK源代码研究Hash存储机制(5)

时间:2010-12-08 IBM 李刚

HashSet 的实现

对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源 代码,可以看到如下代码:

public class HashSet<E>   extends AbstractSet<E>   implements Set<E>, Cloneable, java.io.Serializable   {   // 使用 HashMap 的 key 保存 HashSet 中所有元素   private transient HashMap<E,Object> map;   // 定义一个虚拟的 Object 对象作为 HashMap 的 value   private static final Object PRESENT = new Object();   ...   // 初始化 HashSet,底层会初始化一个 HashMap   public HashSet()   {    map = new HashMap<E,Object>();   }   // 以指定的 initialCapacity、loadFactor 创建 HashSet   // 其实就是以相应的参数创建 HashMap   public HashSet(int initialCapacity, float loadFactor)   {    map = new HashMap<E,Object>(initialCapacity,  loadFactor);   }   public HashSet(int initialCapacity)   {    map = new HashMap<E,Object>(initialCapacity);   }   HashSet(int initialCapacity, float loadFactor, boolean  dummy)   {    map = new LinkedHashMap<E,Object>(initialCapacity    , loadFactor);   }   // 调用 map 的 keySet 来返回所有的 key   public Iterator<E> iterator()   {    return map.keySet().iterator();   }   // 调用 HashMap 的 size() 方法返回 Entry 的数量,就得到该  Set 里元素的个数   public int size()   {    return map.size();   }   // 调用 HashMap 的 isEmpty() 判断该 HashSet 是否为空,   // 当 HashMap 为空时,对应的 HashSet 也为空   public boolean isEmpty()   {    return map.isEmpty();   }   // 调用 HashMap 的 containsKey 判断是否包含指定 key   //HashSet 的所有元素就是通过 HashMap 的 key 来保存的   public boolean contains(Object o)   {    return map.containsKey(o);   }   // 将指定元素放入 HashSet 中,也就是将该元素作为 key 放入  HashMap   public boolean add(E e)   {    return map.put(e, PRESENT) == null;   }   // 调用 HashMap 的 remove 方法

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号