Java集合框架之Map实例解析.docx

上传人:李司机 文档编号:7179919 上传时间:2024-06-29 格式:DOCX 页数:21 大小:47.13KB
返回 下载 相关 举报
Java集合框架之Map实例解析.docx_第1页
第1页 / 共21页
Java集合框架之Map实例解析.docx_第2页
第2页 / 共21页
Java集合框架之Map实例解析.docx_第3页
第3页 / 共21页
Java集合框架之Map实例解析.docx_第4页
第4页 / 共21页
Java集合框架之Map实例解析.docx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《Java集合框架之Map实例解析.docx》由会员分享,可在线阅读,更多相关《Java集合框架之Map实例解析.docx(21页珍藏版)》请在三一办公上搜索。

1、JaVa集合框架之M叩实例解析1、Map概述1.1 什么是MapM叩是潞键映射到值(keyale)的对象,个映射不能包含正现的键:好个键双笫只能映时到一个值,MaP接口供应三种Colkxlion视图,允许以键集(keySel。)、值集(VidUCS()或神-值映射关系i(cntrySct()的形式衽看某个映射的内容(即狭得谊位对的内容).映时依次定义为迭代器在映射的CpIkXIion视图上返回其元素的依次.即可以映射得到键、俵和迸值的Set佻合,元素的依次是用得到的Sct集合所确定的.某些映射实现可明确保证其依次,如TreeMaP类:另些映射实现则不保证依次,如HaShM叩炎。1.2 Map与

2、Collection的区分1.Map存播的是键值对形式的元素,镀唯。值可以虫笑。2 .Collcction存储的是单列元索,子接口Scl元素唯一,子接11.ist元素可乖攵.3 .Map集合的数据结构使针对健行效.跟值无关.COUediOn集合的数据结构是针对元泰有效关于Collection可以这里hiva乐/柑架之CoIlectiCn实例解析2、MaP继承体系下面列出了常见Map集合的稣承体系与他们的特点Map键唯一IHashMap基于哈希表的Map接口的实现。此实现供应全部可选的映射操作,并允许运用null值和null键。(除了非同步和允许运用null之外,HashMaP类与Hashtab

3、le大致相同。)此类不保证映射的依次,特殊是它不保证该依次恒久不变。此实现不是同步的.I1.inkedHashMapMaP接I的哈希表和链接列表实现,具有可预知的迭代依次。此实现与HashM叩的不同之处在F,后者维护着一个运行全部条目的双重链接列表.此链接列表定义了迭代依次,该迭代依次通常就是招铤插入到映射中的依次(插入依次)。此实现不是同步的IWeakHashMap以弱键实现的基于哈希表的MaP在WeakHashMap中,当某个键不再正常运用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻挡垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时

4、,其条目从映射中有效地移除,null值和null键都被支持。IHashtable此类实现个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。Hashtable是同步的ITreeMap基于红黑树(Red-Blacktree)的NavigableMap实现。该映射依据其键的自然依次进行排序,或者依据创建映射时供应的Comparator进行排序,详细取决于运用的构造方法。此实现不是同步的3、MaP泛型接口MaP特点:由keyahe键信为组成,键不行爪纹,值可无取大致包含如下功旎:插入(put、putAlIO)ON除(rcmovc()获得(CntrySC1()、get。、kcyS

5、ct().sizc()valucs()推断(ConUinSKCy()、containsValue()cqualOisEmp将校(replacc()rcplacC(KkCy,VoIdValuc,VnewValuc)jdkl.8之后后而示例会讲到它的)方法摘要voidclear()从今映射中移除全部映射关系(可选操作)。booleanContainSKey(ObjeCtkey)假如此映射包含指定犍的映射关系,则返回truebooleanContainsValue(Objectvalue)假如此映射招一个或多个键映射到指定值,则返回true。SetMap.EntryentrySet()返回此映射中包

6、含的映射关系的Set视图。booleanequals(Objecto)比较指定的对象与此映射是否相等。Vget(Objectkey)返回指定犍所映射的值:假如此映射不包含该键的映射关系,则返回nullinthashCode()返回此映射的哈希码值.booleanisEmpty()假如此映射未包含链-值映射关系,则返回true.Setkeyset()返回此映射中包含的键的Set视图。Vput(Kkey,Vvalue)将指定的值与此映射中的指定键关联(可选操作)。voidputAll(Mapm)从指定映射中将全部映射关系灾制到此映射中(可选操作).Vremove(Objectkey)假如存在一个槌

7、的映射关系,则将其从今映射中移除(可选操作)。intsize()返回此映射中的键-值映射关系数。Collectionvalues()返回此映射中包含的值的Collection视图。3.1、 MaP集合遍历的常见方式方式1、依据键次得值(key-value)1 .获得全部犍的桀合2 .遍历键的集合,获得到每个健3 .依据键找值方式2、依据犍位对对象获得键和侬CiurySct-kcy.valuc)1 .获得全部键值对对象的集合2 .遍历键值对对象的集合,获得到每一个键值对对象3 .依据键值对对象找键和值3.11MaP运用示例publicclassMapReviewpublicstaticvoidm

8、ain(Stringargs)Mapmap=newHaShMaPString,String();map.put(000,qqq);map.put(003rrr);map.put(001,www);map.put(002,eee);map.put(004,sss);System.out.println(ma);/干脆打印输出键值时遍历1:通过键值对对象entryset获得键与值SetEntryentrySet-map.entrySet();for(Entryentry:entrySet)Stringkey=entry.getKey();Stringvalue=entry.getValue();S

9、ystem.out.println(key=+key+value=+value);System.out.println();遍历2:通过键keyset获得值Setkeyset-map.keySet();/得到键的集合for(Stringkey:keyset)Stringvalue-map.get(key);System.out.println(key=,+key+VaIUe=+value);System.out.println();/获得MaP值的集合Collectionvalues=map.values();System.out.println(values);/推断是否存在键和值Syste

10、m.out.println(containsKey=+map.containsKey(001);System.out.println(McontainsKey=+map.containsValue(eee;/向MaP集合添加元素时,若键存在,则返回之前与键对应的值Stringputmap.put(000,aaa);System.out.println(put=,+put);/output:qqq/defaultVreplace(Kkey,Vvalue)/替换功能,将旧值替换成新值,并返回旧值(若有的话)Stringreplace=map.replace(n03n,666);System,out

11、.println(,replace=+replace);System.out.println(map);/defaultbooleanreplace(Kkey,VoldValue,VnewValue/只有当键key存在,并且OldValue与newValue相等时,旧的值才会被替换成新的位,并且返回truebooleansuccess=map.replace(004,sss,111);System.out.println(*replace2=,+success);/output:true)3.2. HashMap3.21. .HashMap的特点v三足哈布&结构,可以保il.网的nil:-I1

12、1.,一当向已存在key的MaP中添加元素时,会覆盖掉旧值,并将旧值返回。它允许运用null值和null键,但不保证映射的依次,特殊是它不保证该依次恒久不变(即不会保证存储的依次与输出的依次恒久不变)“此实现不是同步的。留能对于自定义对象,需取写其equals和hashCode方法才能保证其key的唯一性3.22. HashMap与Hashtable的异同除了非I用步和允许运用null之处,HashMap类与Hashtable大致相同3.23. HashMap的运用示例publicclassHashMapReviewpublicstaticvoidmain(Stringargs)testl()

13、;test2();)*自定义类型做key,*需重写其equals和hashcode方法才能保证其key的唯性privatestaticvoidtest2()HashMapcInfo,Stringmap=newHashMapvInfo,String();lnfo(0,aaa,)000);Info(l,bbb,)llll);InfO(3,ddd)3333);lnfo(0,aaa,),4444);Info(2,ccc)2222);map.put(newmap.put(newmap.put(newmap.put(newmap.put(newPrintMaP(map);/output:/key=Info

14、id=3jadress=dddvalue=3333/key=Infoid=2,adress=cccvalue=2222/key=Infoid=,adress=aaavalue=00/key=Info(id三l,adress三bbbvalue三llll/key=Infoid=,adress=aaaValUe=4444/,与Inf。没有度?jequals和hashCode方法时,key出现重复元素)*String或基本数据类型的包装类做key.他们已重叮hashCode与equals方法*键唯一,重或添加会替换旧值成新值privatestaticvoidtestl()HaShMaPString,S

15、tringmap=newHaShMaPString,String();123);789);“456”);“321”);map.put(aaa,map.pt(bbb,map.put(aaa,map.put(ccc,System.out.println(map);/output:/aaa=456,ccc=321,bbb=789/重复的键不会重新插入,只会替换旧值成新值privatestaticvoidPrintMaP(MaPInf。,Stringmap)SetEntryentrySet=map.entrySet();for(Entryentry:entrySet)System.out.printI

16、n(key=+entry.getKey()+value=+entry.getValue();)324一个HashMap面试题需求如下:已知一个HaShMaPInteger,PerSon集合,PerSOn有name(String)和age(int)属性。请”一个方法实现对HaShMaP的排序功能。该方法接收HaShMaPInteger.PerSOn为形参.返回类型为HaShMaPelnteger,Person.要求对HaShMaP中的Person的age升序进行排序。排序时key=value键值对不得拆散。分析:HashMap本身是不保证元素的依次不变的,要对其排序可运用1.inkedHashM

17、aP,它是有序的并且还是HaShMaP的子类,我们可以运用它来完成排序的目的。最终返I可它的实例即可满意要求并且还符合多态的编程思想示例代码publicclassSortedHashMapDemopublicstaticvoidmain(Stringargs)HaShMaPInteger,Personmap=new1.inkedHashMap();map.put(0,newPerson(小明,20);map.put(l,newPerSOn(小二,26);map.put(2,newPerson(,H,19);map.put(3,newPerSon(阿七”,33);map.put(4,newPer

18、son(卜四,25);ma.put(4,newPerSOn(小花,19);System.out.println(map);HaShMaPInteger,PersonSortedHashMap-SortedHashMap(map);System.out.Println(SortedHashMap);)publicstaticHaShMaPInteger,PersonSortedHashMap(HashMapmap)/获得键值对Set集合SetEntryentrySet=map.entrySet();/将键值对Set集合转化为1.ist以用Collections来排序1.istEntrylist=

19、newArray1.istMap.Entry(entrySet);/通过COlleCtiOnS来揖序,添加比较器,比较年龄Collections.sort(listjnewComparatorEntry()Overridepublicintcompare(Entryol,Entryo2)intresult=o2.getValue().age-ol.getValueO-age;result=result=?o2.hashCode()-ol.hashCode():result;returnresult;);/创建1.inkedHashMap来存储排好序的IiSt元素1.inkedHaShMaPIn

20、teger,PersonIinkedHashMap=new1.inkedHashMap();/遍历1.ist.将元素添加到IinkedHashMap1I1for(Entryentry:list)IinkedHashMap.put(entry.getKey(),entry.getValue0);)returnIinkedHashMap;)classPersonStringname;intage;publicPerson(Stringname,intage)super();this.name=name;this.age=age;)OverridepublicStringtoString()retu

21、rnPersonname=+name+,age=+age+;3.3、1.inkedHashMap3.311.inkedHaShMaP特点:MaP接口的哈希表和链接列表实现,具仃可预知的迭代依次。此链接列表定义了迭代依次(即存储的依次与输出的依次相同),该迭代依次通常就是将键播入到映射中的依次(插入依次).此实现不是同步的.I.:当key为SIring或基本数据类型包装类,键相同自动替换IH值为新侑(因为他们已花写了hashCodc与equals方法)当key为El定义对&,霜让此重写hashCodc与equals方法才能保证key的唯一性3.321.inkedHashMap运用示例public

22、class1.inkedHashMapReview(publicstaticvoidmain(Stringargs)testi();test2();test3();* 自定义对象为key* 需止共近写hashCodeljequals方法才能保证key的唯一性* /privatestaticvoidtest3()1.inkedHaShMaPInf。,Integermap=newIinkedHashMapCnfo,Integer();map.put(newlnfo(0,vvv),000);map.put(newlnfo(0,vvv),333);map.put(newInfo(l,ccc),111)

23、;System.out.println(map);/output:当Info没有也写hashCode与equals方法,Infoid=。,adress=vvv=0,Infoid=0,adress=vvv=333,Infoid=l,adress=ccc=lll/output:当Info一写hashCode,jequals方法/Infoid=。,adress=vvv=333,Infoid=l,adress=ccc=1111String做key*String类实现jhashCode与equals方法,键相同自动替换旧值为新值*/* 基本数据类型包装类重写了hashCode与equals方法,键相同自

24、动咨换旧值为新值* /privatestaticvoidtest2()1.inkedHashMapmap三new1.inkedHashMap();map.pt(l,66);map.put(2,67);map.put(3,68);map.put(l,69);自动装箱Integer.valuef(69)System.out.println(map);/output/1三69,2=67,3=68/输出依次与存储相同,ill爱添加已有的键会替换掉旧俏privatestaticvoidtestl()1.inkedHaShMaPString,Stringmap三new1.inkedHashMap();ma

25、p.put(aa,121);map.put(bb,122);map.put(cc,123”);map.pt(aa,122m);map.put(dd,122);map.put(ee”,122);System.out.println(map);/output/aa=122,bb=122,cc=123,dd=122,ee=122/输出依次与存储相同,型&添加已有的键会替换掉旧值)3.4、HashtableHashtable是同步的,它不允许运用null值和null键。除此之外与HashMaP大致相I叽示例略3.41运用PropertiesProPCrtiCS类继承自HaShtabIc.衣示了一个长久

26、的网性集,ElUt(ft对(key-value)组成.与HaShulble不同的是,Prvpcrlies属性列衣中每个键及其对应值都是一个字符舟,因此不举荐运用HaShtabIe的put方法为PrCPCniCS添加屈性”Properties可通过store方法保存花流中或通过load方法从流中加梯如卜三种方式:1,通过字节输入输出流voidload(InputStreaminStream)从输入流中读取属性列表(展和元素对。voidstore(OutputStreamout,Stringcomments)以适合运用Ioad(InputStream)方法加载到Properties表中的格式,将此

27、Properties表中的风性列表(键和元素对写入输出流。2.通过字符输入输出流voidload(Readerreader)按简洁的面对行的格式从输入字符流中读取属性列表(键和元素对。voidStOre(Writerwriter,Stringcomments)以适合运用Ioad(Reader)方法的格式,将此Properties表中的属性列表(键和元素对)写入输出字符。.r1.i.n!voidIoadFromXM1.(InputStreamin)将指定输入流中由XM1.文档所表示的全部属性加教到此属性表中。voidStoreToXM1.(Outputstreamos,Stringcomment

28、)发出一个表示此表中包含的全部属性的XM1.文档。voidStoreToXM1.(Outputstreamos,Stringcomment,Stringencoding)运用指定的编码发出个表示此表中包含的全部属性的XM1.文档。通过如下方法存取键值StringgetProperty(Stringkey)用指定的键在此属性列表中搜寻属性.StringgetProperty(Stringkey,Stringdefaultvalue)用指定的键在属性列表中搜寻属性。ObjectsetProperty(StringkeyjStringvalue)调用Hashtable的方法PUtovoidIist(

29、PrintStreamout)将属性列表输出到指定的输出流。voidlist(PrintWriterout)将属性列表输出到指定的输出流,SetStringPropertyNamesO返回此属性列表中的键集,其中该键及其对应值是字符串,假如在.主属性列表中未找到同名的键,则还包括默认属性列表中不同的键.下面通过示例运用ProPCrIieS1 .创建一个属性文件/*创建一个属性文件* gthrowsIOException* /privatestaticvoidcreate()throwsIOException/创建一个空的属性文件Propertiesprop=newProperties();/创

30、建一个文件输出流,用于写出属性文件到本地FileWriterwriter三newFiIeWriter(config.properties);亦可以运用FileOutputStream/设置属性键与值prop.setProperty(name,pecuyu);prop.setProperty(character,kind);/通过字符输出流将键值对写入属性文件prop.StoreQvriter,thisisnew);writer.close();)画义属性文件内容* 读取一个属性文件* /privatestaticvoidload()throwsFileNotFoundException,IOE

31、xception(/创建属性文件Propertiesprop=newProperties();/从流中读取屈性列表到属性文件prop.load(newFHeInputStream(config.properties);/亦可运用FileReader/通过键取值Stringname=prop.getProperty(name);Stringcharacterprop.getProperty(character);/System.out.println(name=+name+character=+character);prop.Iist(System-Out);/将属性键值对列出并打印到限制台Se

32、tStringPropertyNames=prop.StringPropertyNames();/犍的Set集合for(Stringkey:StringPropertyNames)Stringvalue=prop.getProperty(key);/通过键获得值System.out.println(key=+key+value=+value);)3.5、 WeakHashMap3.51 特点以弱键实现的堪于哈希表的Map。在WeakHashMap中,当某个键不再正常运用时,将自动移除其条目.更精确地说,对一个给定的键,其映射的存在并不阻挡垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,

33、然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的Map实现有所不同1null值和null键都被支持3.52 实现附遨事项WeakHashMap中的值对彖由一般的强引用保持“因此应当当心诬慎,确保值时象不会干脆或间接地强引用其自身的键,因为这会阻挡键的丢弃。留意,值对象可以通过WeakHaShMaP本身间接引用其对应的神:这就是说,某个值时象可能强引用某个其他的键对象,而与该键对象相关联的值对象转而强引用第一个值对象的键“处理此问即的一种方法是,在插入前将值自身包装在WeakReferences中,如:m.put(keyjnewWeakReference(Value)

34、.然后,分别用get进行解包。3.6、 TreeMap3.61 TreeMap特点- 战于红黑树(Red-Blacktree)的NavigableMap实现,该映射依据其键的自然依次进行排序,或者依据创建映射时供应的ComParatOr进行排序,详细取决于运用的构造方法。- 堆值对是红黑树结构,可.以保证键的排序和唯一性- 此实现不是同步的筑为TeCMaP供应小序方案依据其镀的自然依次进行排序(自定义对象须实现COmparable接口井底局compare方法依蜘创建映射时供成的ComparatoriS.行排序,详细取决于运用的构造方法.3.62 分析TreeMaP的put方法源码1、推断Ent

35、ry是否有元素,没有则new一个.并添加新元素2,通过自然排序与比较零排序来为TreeMaP排序,优先运用Comparator来排序通过Entry对象未来画保插入元素的唯性,它建立在CoflIPare方法的基础上,此方法返回0时,表示插入的键存在,干脆替换旧值并返回。因此在运用TreeMap时,门定义对象须实现ComParabIe接口并戊写compare方法或在创建TreeMap时供应Comparatorcmp=cprpare(key,t.key);if(cmp0)t=t.right;elsereturnt.setValue(value);3、在插入元素后武新调整红黑树7即EnttyW)海码如

36、下publicVput(Kkey,Vvalue)Entryt三root;/推断Entry是否有元索,没有则new一个if(t=null)ComPare(key,key);/type(andpossiblynull)checkroot三newEntry(key,value,null);size=1;modCount+;returnnull;)intcmp;Entryparent;/通过自然排序与比较器排序/splitcomparatorandcomparablepathscpr=comparator;Comparatorif(cpr!=null)doif(CfnP0)t=t.right;else

37、returnt.setValue(value);while(t!null);)elseif(key=null)thrownewNullPointerException();SuppressWarnings(unchecked)Comparablek=(CoflIParablev?superK)key;doparent=t;CmP=kpareTo(t.key);if(cmp0)t=t.right;elsereturnt.setValue(value);while(tI=null);Entrye-newEntry(key,value,parent);if(cmpmap=newTreeMaPCStr

38、ing,String();map.put(a,111);* 实现Comparable接口并jg写COmPare方法* %构造TreeMap对象时,需传入Comparator* 当两者都有,以C。叩arator来排序* /privatestaticvoidtest2()TreeMapvInfo,Stringmap=newTreeMapvInfo,String(newComparator()Overridepublicintcompare(Infool,Infoo2)intnum=o2.getld()-ol.getld();num-num0?o2.getAdress().hashCode()-ol

39、.getAdress().hashCode():num;returnnum;);map.put(newInfo(0,hhh),qqq);map.put(newInfo(001,hhh),aaa);map.put(newInfo(002,hhh),zzz);map.put(newlnfo(000,hhh),qqq);System.out.println(map);map.put(b,123”);map.put(,ch,121,);map.put(c,121);SetEntryentryset=map.entrySet();for(Entryentry:entrySet)System.out.pr

40、intIn(key三+entry.getKey()+val+entry.getValue();/output:/key=aValue=Illkey=bvalue=123key=cvalue三1214、COneCIionS集合工具类与ArrayS的运用4.1 AiTayS将数组转化为1.iStArrays的as1.isl方法将故也依化为1.isl.留意:获得的1.iSt是不行修改的Stringarray=newStringnewhorld,new,dream);/将数组转化为list,留意,获得的1.ist是不行修改的1.istas1.ist=Arrays.as1.ist(array);Syst

41、em.out.println(as1.ist);4.2 Collections大致功能:增删改杳nzedCo!leclion.SynchroniMSehSynChrOniZedSOHCdMap、SynchronizedSortedSecI1.S制CpOy、返回觇图IIS1.ifoQUeuc、I7,enumeration)等常用方法摘要staticbooleanaddAll(Collectionc,T.elements)将全部指定元素添加到指定collection中.staticQueueas1.ifoQueue(Dequedeque)以后进先出(1.ifo)Queue的形式返可某个Deque的视图。staticintbinarysearch(1.ist?extendsComparablelist,Tkey)运用二分搜寻法搜寻指定列表,以获得指定对象。staticintbinarySearch(1.istlist,Tkey,Comparator

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号