欢迎来到天天文库
浏览记录
ID:62033409
大小:70.00 KB
页数:6页
时间:2021-04-15
《HashMap详解(通俗易懂).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、java中HashMap详解 HashMap和HashSet是JavaCollectionFramework的两个重要成员,其中HashMap是Map 接口的常用实现类,HashSet是Set 接口的常用实现类。虽然HashMap和HashSet 实现的接口规范不同,但它们底层的 Hash存储机制完全一样,甚至HashSet本身就采用 HashMap来实现的。通过 HashMap、HashSet 的源代码分析其Hash存储机制ﻫ实际上,HashSet 和 HashMap之间有很多相似之处,对于HashSet
2、而言,系统采用Hash算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于HashMap而言,系统 key-value当成一个整体进行处理,系统总是根据Hash算法来计算 key—value 的存储位置,这样可以保证能快速存、取Map的 key-value对。ﻫ在介绍集合存储之前需要指出一点:虽然集合号称存储的是Java对象,但实际上并不会真正将Java对象放入 Set集合中,只是在Set集合中保留这些对象的引用而言。也就是说:Java集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的Ja
3、va对象。集合和引用ﻫ就像引用类型的数组一样,当我们把Java对象放入数组之时,并不是真正的把Java对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量。HashMap的存储实现ﻫ当程序试图将多个 key-value放入HashMap中时,以如下代码片段为例:Java代码 1.HashMap<String , Double〉 map = new HashMap
4、89.0); 4.map.put("英语" , 78.2); HashMap采用一种所谓的“Hash算法”来决定每个元素的存储位置。ﻫﻫ当程序执行map.put("语文",80.0); 时,系统将调用”语文"的 hashCode() 方法得到其hashCode值-—每个 Java对象都有 hashCode()方法,都可通过该方法获得它的hashCode 值。得到这个对象的hashCode值之后,系统会根据该hashCode值来决定该元素的存储位置。我们可以看HashMap 类的 put(Kkey, Vval
5、ue) 方法的源代码: ﻫﻫJava代码ﻫ public Vput(Kkey,Vvalue) ﻫ {ﻫ //如果key 为null,调用 putForNullKey方法进行处理ﻫ if(key==null)ﻫ returnputForNullKey(value);ﻫ //根据key的keyCode 计算 Hash 值ﻫ inthash=hash(key。hashCode()); ﻫ //搜索指定hash 值在对应 table 中的索引ﻫ int i=indexF
6、or(hash, table。length);ﻫ //如果i 索引处的Entry不为null,通过循环不断遍历e元素的下一个元素ﻫ for(Entry<K,V>e =table[i];e!=null;e= e.next) {ﻫ Objectk; //找到指定key 与需要放入的 key 相等(hash 值相同 //通过 equals比较放回true) if(e.hash==hash&&((k=e.key)==key ||ke
7、y。equals(k))) {ﻫ V oldValue =e。value; e.value =value;ﻫ e.recordAccess(this);ﻫ returnoldValue;ﻫ } } //如果i 索引处的 Entry为null,表明此处还没有Entryﻫ modCount++; //将key、value添加到i索引处ﻫ addEntry(hash, key,
8、value,i); ﻫ return null; } 上面程序中用到了一个重要的内部接口:Map。Entry,每个Map.Entry其实就是一个 key-value 对。从上面程序中可以看出:当系统决定存储 HashMap中的key-value对时,完全没有考虑Entry中的value,仅仅只是根据key来计算并决定每个Entry的存储位置。这也说明了前面的结论
此文档下载收益归作者所有