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