一般来说,Map是由键值对组成的数据结构,集合中的每个键都是唯一的。下面用K和V分别代表key和value来解释java中Map的九大问题。0.Map转List类型。在java中,Map接口提供了三种集合获取方式:Keyset、valueset和key-valueset。它们都可以通过构造函数或addAll()方法转换为List类型。以下代码说明了如何从Map构造ArrayList://keylistListkeyList=newArrayList(map.keySet());//valuelistListvalueList=newArrayList(map.valueSet());//key-valuelistListentryList=newArrayList(map.entrySet());1、通过Entry遍历Mapjava中这种key-value对的方式称为Map.Entry。Map.entrySet()返回一个key-value集合,这是一种非常高效的遍历方式。for(Entryentry:map.entrySet()){//获取keyKkey=entry.getKey();//获取valueVvalue=entry.getValue();}Iterator我们也经常用到,尤其是在JDK1.5之前迭代器itr=map.entrySet().iterator();while(itr.hasNext()){Entryentry=itr.next();//getkeyKkey=entry.getKey();//getvalueVvalue=entry.getValue();}2.MapKey排序需要对Map的ke进行频繁的操作。一种方法是使用比较器:Listlist=newArrayList(map.entrySet());Collections.sort(list,newComparator(){@Overridepublicintcompare(Entrye1,Entrye2){returne1.getKey().compareTo(e2.getKey());}});另一种方法是ThroughSortedMap,但是必须实现Comparable接口。SortedMapsortedMap=newTreeMap(newComparator(){@Overridepublicintcompare(Kk1,Kk2){returnk1.compareTo(k2);}});sortedMap.putAll(map);3.对Map上的值进行排序这一点和上一点有点类似,代码如下:Listlist=newArrayList(map.entrySet());Collections.sort(list,newComparator(){@Overridepublicint比较(条目e1,条目e2){返回e1.getValue()。compareTo(e2.getValue());}});4.初始化一个静态常量Map当要创建一个全局静态Map时,我们有以下两种方法,它们是线程安全的。在Test1中,虽然我们声明了map是静态的,但是我们仍然可以在初始化的时候改变它的值,就像Test1.map.put(3,"three");在Test2中,我们传递了一个内部Class,将其设置为不可修改,那么当我们运行Test2.map.put(3,"three")时,它会抛出一个UnsupportedOperationException来禁止你修改它。publicclassTest1{privatestaticfinalMapmap;static{map=newHashMap();map.put(1,“one”);map.put(2,“two”);}}publicclassTest2{privatestaticfinalMapmap;static{MapaMap=newHashMap();aMap.put(1,“one”);aMap.put(2,“two”);map=Collections.unmodifiableMap(aMap);}}5、HashMap,TreeMap和Hashtable的区别在Map接口中,有三种实现:HashMap、TreeMap和Hashtable。它们之间是有区别的,详见文章《HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap》。6.Map中的反向查询当我们在Map中加入一个键值对后,就意味着Map中的key和value是一一对应的,一个key对应一个value。但是有时候我们需要反向查询,比如通过某个值来查找它的key。这种数据结构称为双向映射。不幸的是,JDK不支持它。Apache和Guava共同提供了这种双向映射实现。在实现中,规定了key和value必须是1:1的关系。7.Map的复制Java提供了很多复制Map的方法,但这些方法可能并不总是同步的。简单的说,就是一个Map发生变化,而复制过来的还是原样。下面是一个更高效的实现方法:MapcopiedMap=Collections.synchronizedMap(map);当然还有一个方法,就是克隆。但是我们的java鼻祖JoshBloch并不推荐这种方法。他曾在采访中谈到Map克隆的问题时说:克隆的方法在很多类中都有提供,因为人们确实需要它。但是克隆非常有限,而且在许多情况下会造成不必要的破坏。(原创《Copy constructor versus cloning》)8.创建一个空的Map如果map设置为不可用,可以如下实现map=Collections.emptyMap();相反,当我们要用到的时候,直接map=newHashMap();
