HashMap&HashSet理论知识

HashMap 和 HashSet 是 JavaCollection Framework 的两个重要成员

 

其中HashMap 是Map 接口的常用实现类,

对于 HashMap 而言,系统key-value 当成一个整体进行处理,系统总是根据 Hash 算法来计算 key-value 的存储位置,这样可以保证能快速存、取 Map key-value 对。对于任意给定的对象,只要它的 hashCode() 返回值相同,那么程序调用 hash(int h) 方法所计算得到的 Hash 码值总是相同的,如果两个 Entry key hashCode() 返回值相同,那它们的存储位置相同  

如果这两个 Entry key 通过 equals 比较返回 true,新添加 Entry value 将覆盖集合中原有 Entry value,但 key 不会覆盖。如果这两个 Entry key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部——具体说明继续看 addEntry() 方法的说明。 

当向 HashMap 中添加 key-value 对,由其 key hashCode() 返回值决定该 key-value 对(就是 Entry 对象)的存储位置。当两个 Entry 对象的 key hashCode() 返回值相同时,将由 key 通过 eqauls() 比较值决定是采用覆盖行为(返回 true),还是产生 Entry 链(返回 false)。

 

HashSet 是Set 接口的常用实现类。

对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素

 

HashSet 的实现

对于 HashSet 而言,它是基于HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素 

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

因此如果向 HashSet 中添加一个已经存在的元素,新添加的集合元素(底层由 HashMap key 保存)不会覆盖已有的集合元素。

 

虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 HashMap 来实现的。

java中集合的理解:

Java 集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的 Java 对象。

 

HashMap 的存储实现

当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例:

 HashMap<String , Double> map = new HashMap<String , Double>(); 
 map.put("语文" , 80.0); 
 map.put("数学" , 89.0); 
 map.put("英语" , 78.2); 

JDK 源码

JDK 安装目录下可以找到一个 src.zip压缩文件,该文件里包含了Java 基础类库的所有源文件。只要读者有学习兴趣,随时可以打开这份压缩文件来阅读Java 类库的源代码,这对提高读者的编程能力是非常有帮助的。需要指出的是:src.zip中包含的源代码并没有包含像上文中的中文注释。 

当系统开始初始化 HashMap 时,系统会创建一个长度为 capacity Entry 数组,这个数组里可以存储元素的位置被称为桶(bucket,每个 bucket都有其指定索引,系统可以根据其索引快速访问该 bucket 里存储的元素。 

无论何时,HashMap 的每个只存储一个元素(也就是一个 Entry),由于 Entry 对象可以包含一个引用变量(就是 Entry 构造器的的最后一个参数)用于指向下一个 Entry,因此可能出现的情况是:HashMap bucket 中只有一个 Entry,但这个 Entry 指向另一个 Entry ——这就形成了一个 Entry 链。如图 1 所示:

 

HashMap 的读取实现

HashMap 的每个 bucket 里存储的 Entry 只是单个 Entry ——也就是没有通过指针产生 Entry 链时,此时的 HashMap 具有最好的性能:当程序通过 key 取出对应 value 时,系统只要先计算出该 key hashCode() 返回值,在根据该 hashCode 返回值找出该 key table 数组中的索引,然后取出该索引处的 Entry,最后返回该 key 对应的 value 即可。

掌握上面理论知识之后,接下来看一个示例程序,测试一下自己是否真正掌握了 HashMap 和 HashSet 集合的功能。<见本人下一篇博客:HashMap和HashSet的HashCode()使用测试实例>

参考资料:点击打开链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值