当前位置: 首页 > 科技观察

关于JavaMap你应该掌握的8个问题

时间:2023-03-13 01:41:36 科技观察

前言这几天看了几篇国外关于JavaMap的博文。开发中的常见问题,希望对大家有所帮助;如果有不对的地方,请指出,非常感谢~本章所有代码demo都已上传到github1,如何将Map转成List在日常开发中,我们经常会遇到这个问题在这种场景下,将Map转换为List。map转List有3种方式:mapkey转listmapvalue转listmapkey-value转list伪代码如下://keylistListkeyList=newArrayList(map.keySet());//valuelistListvalueList=newArrayList(map.values());//key-valuelistListentryList=newArrayList(map.entrySet());示例代码:publicclassTest{publicstaticvoidmain(String[]args){Mapmap=newHashMap<>();map.put(2,"jay");map.put(1,"whx");map.put(3,"huaxiao");//转换一个map的keyForlistListkeyList=newArrayList<>(map.keySet());System.out.println(keyList);//转换map的值将listListvalueList=newArrayList<>(map.values());System.out.println(valueList);将map的key值转换成listListentryList=newArrayList(map.entrySet());System.out.println(entryList);}}运行结果:[1,2,3][whx,jay,huaxiao][1=whx,2=jay,3=huaxiao]2.如何遍历一个Map我们经常需要遍历一个map,可以通过以下两种方式实现:通过entrySet+for实现遍历for(Entryentry:map.entrySet()){//getkeyKkey=entry.getKey();//getvalueVvalue=entry.getValue();}示例代码:publicclassEntryMapTest{publicstaticvoidmain(String[]args){Mapma??p=newHashMap<>();map.put(2,"jay");map.put(1,"whx");map.put(3,"huaxiao");for(Map.Entryentry:map.entrySet()){//getkeyIntegerkey=(Integer)entry.getKey();//getvalueStringvalue=(String)entry.getValue();System.out.println("key:"+key+",value:"+value);}}}通过Iterator+while实际遍历Iteratoritr=map.entrySet().iterator();while(itr.hasNext()){Entryentry=itr.next();//getkeyKkey=entry.getKey();//getvalueVvalue=entry.getValue();}实例代码:publicclassIteratorMapTest{publicstaticvoidmain(String[]args){Mapma??p=newHashMap<>();map.put(2,"jay");map.put(1,"whx");map.put(3,"huaxiao");Iteratoritr=map.entrySet().iterator();while(itr.hasNext()){Map.Entryentry=(Map.Entry)itr.next();//getkeyIntegerkey=(Integer)entry.getKey();//getvalueStringvalue=(String)entry.getValue();System.out.println("客y:"+key+",value:"+value);}}}运行结果:key:1,value:whxkey:2,value:jaykey:3,value:huaxiao3,如何根据key对Map进行排序MapKeys排序,在日常开发中很常见,主要有两种实现方式把Map.Entry放进list,再用Comparator对list进行排序Listlist=newArrayList(map.entrySet());Collections.sort(list,(Entrye1,Entrye2)->{returne1.getKey().compareTo(e2.getKey());});实例代码:publicclassSortKeysMapTest{publicstaticvoidmain(String[]args){Mapma??p=newHashMap<>();map.put("2010","jay");map.put("1999","whx");map.put("3010","huaxiao");List>list=newArrayList<>(map.entrySet());集合。排序(列表,(Map.Entrye1,Map.Entrye2)->{returne1.getKey().toString().compareTo(e2.getKey().toString());});for(Map.Entryentry:list){System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());}}}使用SortedMap+TreeMap+Comparator实现1.SortedMapsortedMap=newTreeMap(newComparator(){2.@Override3.publicintcompare(Kk1,Kk2){4.returnk1.compareTo(k2);5.}6.});7.sortedMap.putAll(map);实例代码:publicclassSortKeys2MapTest{publicstaticvoidmain(String[]args){Mapma??p=newHashMap<>();map.put("2010","jay");map.put("1999","whx");map.put("3010","华夏");SortedMapsortedMap=newTreeMap(newComparator(){@Overridepublicintcompare(Stringk1,Stringk2){returnk1.compareTo(k2);}});sortedMap.putAll(map);Iteratoritr=sortedMap.entrySet().iterator();while(itr.hasNext()){Map.Entryentry=(Map.Entry)itr.next();//getkeyStringkey=(String)entry.getKey();//getvalueStringvalue=(String)entry.getValue();System.out.println("key:"+key+",value:"+value);}}}运行结果:key:1999,value:whxkey:2010,value:jaykey:3010,value:huaxiao4、如何对Map的values进行排序Listlist=newArrayList(map.entrySet());Collections.sort(list,(Entrye1,Entrye2)->{returne1.getValue().compareTo(e2.getValue()));});实例代码:publicclassSortValuesMapTest{publicstaticvoidmain(String[]args){Mapma??p=newHashMap<>();map.put("2010","jay");map.put("1999","whx");map.put("3010","huaxiao");List>list=newArrayList<>(map.entrySet());Collections.sort(list,(Map.Entrye1,Map.Entrye2)->{returne1.getValue().toString().compareTo(e2.getValue().toString());});for(Map.Entryentry:list){System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());}}}运行结果:key:3010,value:huaxiaokey:2010,value:jaykey:1999,value:whx5,如何初始化一个static/immutableMap初始化一个staticimmutablemap,仅仅staticfinal+static代码块还是不行,如下:publicclassTest1{privatestaticfinalMapma??p;static{map=newHashMap();map.put(1,"one");map.put(2,"two");}publicstaticvoidmain(String[]args){map.put(3,"three");Iteratoritr=map.entrySet().iterator();while(itr.hasNext()){Map.Entryentry=(Map.Entry)itr.next();//getkeyIntegerkey=(Integer)entry.getKey();//getvalueStringvalue=(String)entry.getValue();System.out.println("key:"+key+",value:"+value);}}}这里map继续添加元素(3,"three"),发现是OK,运行结果如下:key:1,value:onekey:2,value:twokey:3,value:three要真正实现静态不可变映射,需要Collections.unmodifiableMap,代码如下:publicclassTest2{privatestaticfinalMapma??p;static{MapaMap=newHashMap<>();aMap.put(1,"one");aMap.put(2,"two");map=集合。unmodifiableMap(aMap);}publicstaticvoidmain(String[]args){map.put(3,"3");Iteratoritr=map.entrySet().iterator();while(itr.hasNext()){Map.Entryentry=(Map.Entry)itr。next();//getkeyIntegerkey=(Integer)entry.getKey();//getvalueStringvalue=(String)entry.getValue();System.out.println("key:"+key+",value:"+value);}}}运行结果如下:可以发现,如果继续往map中添加元素,会报错,实现了真正的immutablemap。6、HashMap、TreeMap和Hashtable、ConcurrentHashMap的区别7、如何创建空map如果map是不可变的,可以这样创建:Mapmap=Collections.emptyMap();orMapma??p=Collections.emptyMap();//map1.put("1","1");错误如果你想让你的空地图添加元素,你可以创建Mapmap=newHashMap();8、关于maphashmap的复制与hashmap的复制有关,在日常开发中用的比较多。主要有=、clone、putAll,但是都是浅拷贝,使用的时候要注意,可以看下面的例子:例1,用=拷贝一个map:publicclassCopyMapAssignTest{publicstaticvoidmain(String[]args){MapuserMap=newHashMap<>();userMap.put(1,newUser("jay",26));userMap.put(2,newUser("fany",25));//ShallowcloneMapclonedMap=userMap;//SameasuserMapSystem.out.println(clonedMap);System.out.println("\nChangesreflectinbothmaps\n");//ChangeavalueisclonedMapclonedMap.get(1).setName("test");//验证bothmaps的内容System.out.println(userMap);System.out.println(clonedMap);}}运行结果:{1=User{name='jay',age=26},2=User{name='fany',age=25}}Changesreflectinbothmaps{1=User{name='test',age=26},2=User{name='fany',age=25}}{1=User{name='test',age=26},2=User{name='fany',age=25}}从运行结果可以看出,修改cloneMap时,两个map都发生了变化,所以=是一个浅拷贝。示例2,使用hashmap克隆副本:{publicstaticvoidmain(String[]args){HashMapuserMap=newHashMap<>();userMap.put(1,newUser("jay",26));userMap。put(2,newUser("fany",25));//ShallowcloneHashMapclonedMap=(HashMap)userMap.clone();//SameasuserMapSystem.out.println(clonedMap);System.out.println("\nChangesreflectinbothmaps\n");//ChangeavalueisclonedMapclonedMap.get(1).setName("test");//验证bothmaps的内容System.out.println(userMap);System.out.println(clonedMap);}}运行结果:{1=User{name='jay',age=26},2=User{name='fany',age=25}}Changesreflectinbothmaps{1=User{name='test',age=26},2=User{name='fany',age=25}}{1=User{name='test',age=26},2=User{name='fany',age=25}}来自运行原来修改cloneMap的时候两个map都变了,所以hashmap的clone也是浅拷贝。例3,通过putAllpublicclassCopyPutAllMapTest{publicstaticvoidmain(String[]args){HashMapuserMap=newHashMap<>();userMap.put(1,newUser("jay",26));userMap.put(2、newUser("fany",25));//ShallowcloneHashMapclonedMap=newHashMap<>();clonedMap.putAll(userMap);//SameasuserMapSystem.out.println(clonedMap);System.out.println("\nChangesreflectinbothmaps\n");//改变一个值被clonedMapclonedMap.get(1).setName("test");//验证两个maps的内容System.out.println(userMap);System.out.println(clonedMap);}}运行结果:{1=User{name='jay',age=26},2=User{name='fany',age=25}}Changesreflectinbothmaps{1=User{name='test',age=26},2=User{name='fany',age=25}}{1=User{name='test',age=26},2=User{name='fany',age=25}}从运行结果来看,修改cloneMap,两个map都变了,所以putAll还是浅拷贝。那么,如何实现深拷贝呢?可以通过序列化来实现。下面是GoogleGson序列化HashMap实现深拷贝的例子:publicclassCopyDeepMapTest{publicstaticvoidmain(String[]args){HashMapuserMap=newHashMap<>();userMap.put(1,newUser("jay",26));userMap.put(2,newUser("fany",25));//ShallowcloneGsongson=newGson();StringjsonString=gson.toJson(userMap);Typetype=newTypeToken>(){}.getType();HashMapclonedMap=gson.fromJson(jsonString,type);//SameasuserMapSystem.out.println(clonedMap);System.out.println("\nChangesreflectinonlyonemap\n");//ChangeavalueisclonedMapclonedMap.get(1).setName("test");//验证两个maps的内容System.out.println(userMap);System.out.println(clonedMap);}}运行结果:{1=User{name='jay',age=26},2=User{name='fany',age=25}}Changesreflectinonlyonemap{1=User{name='jay',age=26},2=User{name='fany',age=25}}{1=User{name='test',age=26},2=User{name='fany',age=25}}fromrun结果发现cloneMap,userMap的修改还没有变了,所以很深复制