Map接口的实现类有HashMap TreeMap LinkedHashMap
HashMap:一般情况下,使用HashMap插入、删除、定位元素。底层实现链表加数组
TreeMap:按自然规律大小顺序或自定义顺序遍历,使用TreeMap 。底层实现二叉树
LinkedHashMap:按照添加的顺序输出,不进行大小排序。底层实现双向链表是HashMap的子类
Eg: Maplinkedhashmap = new LinkedHashMa();
Map treemap =new TreeMap ();
linkedhashmap.put(“2”,”ab”);
linkedhashmap.put(“1”,”cd”);
treemap.put(“2”,”ab”);
treemap.put(“1”,”cd”);
遍历linkedhashmap的时候,先遍历到的key是2,因为2是先放进去的
遍历treemap的时候,先遍历到的key是1,因为是按顺序升序排列
线程安全性
HashMap TreeMapLinkedHashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null,不支持线程同步,即任一时刻可以有多个线程同时写HashMap,会导致数据的不一致性。如果需要同步,使用Collections的synchronizedMap来包装一下使HashMap具有同步的能力
Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。
实现Map同步的写法:
Map<String String> map = Collections.synchronizedMap(new LinkedHashMap(<String String));
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class TestLinkedHashMap {
public static void main(String args[])
{
System.out.println("*************************LinkedHashMap*************");
Map<Integer,String> map = new LinkedHashMap<Integer,String>();
map.put(6, "apple");
map.put(3, "banana");
map.put(2,"pear");
for (Iterator it = map.keySet().iterator();it.hasNext();)
{
Object key = it.next();
System.out.println( key+"="+ map.get(key));
}
System.out.println("*************************HashMap*************");
Map<Integer,String> map1 = new HashMap<Integer,String>();
map1.put(6, "apple");
map1.put(3, "banana");
map1.put(2,"pear");
for (Iterator it = map1.keySet().iterator();it.hasNext();)
{
Object key = it.next();
System.out.println( key+"="+ map1.get(key));
}
}
}
运行结果如下:
*************************LinkedHashMap*************
6=apple
3=banana
2=pear
*************************HashMap**************************
2=pear
6=apple
3=banana
分析:LinkedHashmap 的特点是put进去的对象位置未发生变化,而HashMap会发生变化.
常用方法
Objectput(Object key, Object value):
将互相关联的一个关键字和一个值放入该映射,如果关键字已存在,那么与此关键字相关联的新值将取代旧值,返回关键字的旧值。如果关键字原先并不存在,返回null
Objectremove(Object key): 从映射中删除与key相关的值
voidclear(): 删除所有映射
voidputAll(Map t): 将来自特定映射的所有元素添加给该映射
Objectget(Object key):
获取与关键字key相关的值,并返回与关键字key相关的对象,如没有找到key,返回null
booleancontainKey(object key)
booleancontainValue(object value)
booleanisEmpty()
intsize
视图操作
Set keySet() 返回映射中所有关键字的视图集 Set keys = Map.keySet()
Collectionvalues() 返回映射中所有值的视图集
SetentrySet() 返回Map.Entry对象的视图集,即映射中的关键值/对
Map.Entry类
Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键值/对
通过这个集合的迭代器,您可以获得每一个条目(唯一获取方式)的键或值并对值进行更改。当条目通过迭代器返回后,除非是迭代器自身的remove()方法或者迭代器返回的条目的setValue()方法,其余对源Map外部的修改都会导致此条目集变得无效,同时产生条目行为未定义。
(1) Object getKey(): 返回条目的关键字
(2) Object getValue(): 返回条目的值
(3) Object setValue(Objectvalue): 将相关映像中的值改为value,并且返回旧值
例子:java代码
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("1", 1);
map.put("2", 2);
map.put("3", 3);
map.put("3", 3);
Iterator itor=map.entrySet().iterator();
while(itor.hasNext()){
Map.Entry<String,Integer> entry=(Map.Entry<String,Integer>)itor.next();
System.out.println("key="+entry.getKey().toString());
System.out.println("values="+entry.getValue().toString());
}
Map<Integer,String> map = new LinkedHashMap<Integer,String>();
map.put(1, "星期一");
map.put(2, "星期二");
map.put(3, "星期三");
map.put(4, "星期四");
map.put(5, "星期五");
map.put(6, "星期六");
map.put(7, "星期日");
for(Map.Entry<Integer, String> entry: map.entrySet()) {
System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
}
輸出結果:
1:星期一 2:星期二 3:星期三 4:星期四 5:星期五 6:星期六 7:星期日