WEB开发网
开发学院软件开发Java 通过分析 JDK 源代码研究 Hash 存储机制 阅读

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

 2009-11-28 00:00:00 来源:WEB开发网   
核心提示: 如果开始就知道 HashMap 会保存多个 key-value 对,可以在创建时就使用较大的初始化容量,通过分析 JDK 源代码研究 Hash 存储机制(9),如果 HashMap 中 Entry 的数量一直不会超过极限容量(capacity * load factor),HashMap 就无需

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

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 方法删除指定 Entry,也就删除了 HashSet 中对应的元素 
 public boolean remove(Object o) 
 { 
  return map.remove(o)==PRESENT; 
 } 
 // 调用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素 
 public void clear() 
 { 
  map.clear(); 
 } 
 ... 
 } 

上一页  4 5 6 7 8 9 10  下一页

Tags:通过 分析 JDK

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接