Map概念
要同时存储两个元素Key和Value,他们之间有映射关系,每个键不能重复,每个键只能映射到一个值。
当数据之间存在映射关系的时候,考虑使用Map集合。
Map常用方法
如果添加的键原来有值,后添加的值会覆盖前面的值,并返回之前的值。put会返回来先添加的值,后添加的值会覆盖原有的值。
Map tm =new TreeMap();
tm.put (key, value);//MAP没有add
tm.remove (key) ;//去除一个key和对应的value,若不存在key返回null
tm.get (key) ;//返回该Key的value
tm.values (); //返回所有value的集合
tm.keySet (); //返回key的Set集合
HashTable
底层是哈西数据结构,不可以存入null键null值,线程同步。
HashMap
底层是哈西表数据结构,允许使用nul键和null值,线程不同步。效率高。
TreeMap
底层是二叉树结构,不同步,可以给键排序。
和Set很像,Set底层使用的就是Map结构。其实是平行x轴的函数。
Map元素取出方式
1.keyset()
返回set集合。迭代器:取出了set集合用迭代器取键。。。get(键)将map集合转化成set,再取键取值。
2.EntrySet()
里面存放的时是关系,把关系取出来。返回Map.entry,将map集合中的映射关系存入到Set集合中。,entry接口是Map接口里面内部接口,Map需要直接访问MapSet中的数据,内部嵌套类,没有Map就没有Map.entry.
Map<String , String > tm =new TreeMap ();
tm.put ("b李白", "唐") ;
tm.put ("a李白", "唐") ;
tm.put ("杜甫", "唐") ;
tm.put ("苏轼", "宋") ;
//利用keyset()方法来获取键
Set<String > ketset =tm .keySet ();
Iterator<String > it =ketset .iterator ();
while(it .hasNext ()){
String
key =it .next ();
System .out.println( key+ "="+ tm. get(key ));
}
//利用entrySet()方法获取Map的键值对
Set <Map .Entry <String , String >> enterset =tm .entrySet ();
for(Map .Entry <String , String > me :enterset )
System .out.println( me. getKey()+"=="+me.getValue()) ;
}
}
Map.Entry里面存放的时映射关系,这个接口里面有gekKey和getValue的方法。
HashMap()和TreeMap()
HashMap基于hashCode()的实现,查找速度最优,TreeMap是根据键的自然顺序排列的,排列的顺序是通过comparable或者comparator决定,treeMap是唯一具有subMap的Map。
//定义TreeMap
Map <String , String > tm = new TreeMap <String , String >() ;
tm .put ( "b李白", "唐") ;
tm .put ( "a李白", "唐") ;
tm .put ( "杜甫", "唐") ;
tm .put ( "苏轼", "宋") ;
//定义一个HashMap
Map <String ,String > hm = new HashMap <String , String >() ;
hm .putAll ( tm) ;//将 tm中的元素全部装入 hm中
System .out .println ( tm) ;
System .out .println ( hm) ;
/*TreeMap: {a李白=唐, b李白=唐, 杜甫=唐,
苏轼=宋}
HashMap:
{杜甫=唐, 苏轼=宋, a李白=唐, b李白=唐}*/
结果是显而易见的,TreeMap按照字母的自然顺序排列了。