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

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

 2009-11-28 00:00:00 来源:WEB开发网   
核心提示: 由上面源程序可以看出,HashSet 的实现其实非常简单,通过分析 JDK 源代码研究 Hash 存储机制(10),它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,掌握上面理论知识之后,接下来看一个示

由上面源程序可以看出,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。

HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。

HashMap 的 put 与 HashSet 的 add

由于 HashSet 的 add() 方法添加集合元素时实际上转变为调用 HashMap 的 put() 方法来添加 key-value 对,当新放入 HashMap 的 Entry 中 key 与集合中原有 Entry 的 key 相同(hashCode() 返回值相等,通过 equals 比较也返回 true),新添加的 Entry 的 value 将覆盖原来 Entry 的 value,但 key 不会有任何改变,因此如果向 HashSet 中添加一个已经存在的元素,新添加的集合元素(底层由 HashMap 的 key 保存)不会覆盖已有的集合元素。

掌握上面理论知识之后,接下来看一个示例程序,测试一下自己是否真正掌握了 HashMap 和 HashSet 集合的功能。

 class Name 
{ 
  private String first; 
  private String last; 
   
  public Name(String first, String last) 
  { 
    this.first = first; 
    this.last = last; 
  } 
 
  public boolean equals(Object o) 
  { 
    if (this == o) 
    { 
      return true; 
    } 
     
 if (o.getClass() == Name.class) 
    { 
      Name n = (Name)o; 
      return n.first.equals(first) 
        && n.last.equals(last); 
    } 
    return false; 
  } 
} 
 
public class HashSetTest 
{ 
  public static void main(String[] args) 
  { 
    Set<Name> s = new HashSet<Name>(); 
    s.add(new Name("abc", "123")); 
    System.out.println( 
      s.contains(new Name("abc", "123"))); 
  } 
} 

上一页  5 6 7 8 9 10 

Tags:通过 分析 JDK

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