通过分析JDK源代码研究Hash存储机制 - 编程入门网
删除指定 Entry,也就删除了 HashSet 中对应的元素
public boolean remove(Object o)
{
return map.remove(o)==PRESENT;
}
// 调用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素
public void clear()
{
map.clear();
}
...
}
由上面源程序可以看出,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上 由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它 是一个静态的 Object 对象。 HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。 通过分析JDK源代码研究Hash存储机制(6)时间:2010-12-08 IBM 李刚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 集合的功能。
上面程序中向 HashSet 里添加了一个 new Name("abc", "123") 对象之后, 立即通过程序判断该 HashSet 是否包含一个 new Name("abc", "123") 对象。 粗看上去,很容易以为该程序会输出 true。 实际运行上面程序将看到程序输出 false,这是因为 HashSet 判断两个对象 相等的标准除了要求通过 equals() 方法比较返回 true 之外,还要求两个对象 的 hashCode() 返回值相等。而上面程序没有重写 Name 类的 hashCode() 方法 ,两个 Name 对象的 hashCode() 返回值并不相同,因此 HashSet 会把它们当 成 2 个对象处理,因此程序返回 false。 由此可见,当我们试图把某个类的对象当成 HashMap 的 key,或试图将这个 类的对象放入 HashSet 中保存时,重写该类的 equals(Object obj) 方法和 hashCode() 方法很重要,而且这两个方法的返回值必须保持一致:当该类的两 个的 hashCode() 返回值相同时,它们通过 equals() 方法比较也应该返回 true。通常来说,所有参与计算 hashCode() 返回值的关键属性,都应该用于作 为 equ |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |