Map
1.概念:
接口类,继承没有继承自Collection,存储的是<key,value>
键值对;key不可以重复
2.注意事项:
1.key是唯一,不能为空;value可以修改,key不可以修改
2.map为接口
3.api
获得键值对:Map.Entry<k,v>键值对实体
Map.Entery类
getKey()
getValue()
v setValue(value )//将键值对中的value替换成指定的value
常用方法:
V get(Object key)//根据key返回对应的value
1.key存在,返回对应的value
2.key不存在,返回null
3.key为空,抛出空指针异常
getOrDefeult(Object key,V defaultValue)//
1.key存在,value存在,返回value
2.key存在,value不存在,返回对应的默认值
v put(key,value)
1.key 存在,将源value替换成现有的value
2.key不存在,将该键值对直接插入
3.key为空,抛出异常;value可以为空
v remove(key)//删除键值对
1.key存在,删除该键值对
2.key不存在,直接返回null
Set keySet()//返回所有的key,不重复集合
Collection values()//返回所有的value集合,可重复集合
Set<Map.Entry<K,V>> entrySet()//返回键值对
containsKey()//判断是否包含key O(logN)
containsValue()//判断是否包含value O(N)
()
size()//获取键值对的个数
4.treeMap,hashMap,hashTable,LinkedHashMap的区别?
hashMap: 哈希桶 O(1) 不一定 关于key是否有序,不关心,更高的查询效率 通过哈希函数计算哈希地址
treeMap: 红黑树 O(log2N) 关于key有序 key有序 key能够比较
- hashMap:根据key的hashCode值进行存储,访问速度快;最多允许一条记录的key为空,允许多条记录的value为null;非同步,不安全的
- treeMap:底层二叉树树结构,根据key排序,默认升序,也可以指定排序的比较器;不允许key的值为空;非同步,不安全的
- HashTable:与hashMap类似,key与value的值不允许为空;同步,比较慢
- LinkedHashMap:保存记录的插入顺序,key与value均允许为空;非同步,比hashMap慢
5.map排序:
treeMap:可以改变排序排序方式,需要比较器Comparator
1.对key排序
Map<String, String> map = new TreeMap<String, String>(
new Comparator() {
public int compare(String obj1, String obj2) {
// 降序排序
return obj2.compareTo(obj1);
}
});
2.对value排序
Collections的sort(List list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较
//这里将map.entrySet()转换成list
List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
//然后通过比较器来实现排序
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//升序排序
public int compare(Entry<String, String> o1,
Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
hashMap排序:
参照treeMap的value排序
List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//升序排序
public int compare(Entry<String, String> o1,
Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
现在假设我们根本不知道键的情况下,怎么获取键值对呢?
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(42, “湖南”);
map.put(11, “北京”);
Set<Entry<Integer, String>> set=map.entrySet();
Iterator<Entry<Integer, String>> iterator=set.iterator();
while(iterator.hasNext()){
Map.Entry mapEntry=(Map.Entry)iterator.next();
System.out.println(mapEntry.getKey()+"--------"+mapEntry.getValue());
}