一、map实现类
接口类java.util.Map有四个实现类:HashMap、Hashtable、LinkedHashMap、TreeMap
HashMap:最常用,遍历时随机
Hashtable:相较HashMap:键值均不能为null(编译时不会报错);线程安全,多线程可共用一个Hashtable
LinkedHashMap:键按插入顺序排序,遇到需按插入顺序遍历时可用
TreeMap:红黑树算法,键按升序排序,遇到需按键大小顺序遍历时可用。因此key的类型需要实现Comparable接口重写int compareTo(Object arg0)方法来保证能排序
此外com.google.common.collect.HashMultimap<K, V>实现了键可重复的Map,前面四种若插入时遇到重复键则后面的键值对会覆盖前面的键值对
二、初始化
以HashMap为例
1、静态初始化
Map<String, Object> map = new HashMap<String, Object>(){
{
put("key1", "value1");
put("key2", "value2");
}
};
注:此时HashMap的泛型类型不能缺省;效率比动态初始化低
2、动态初始化
Map<String, Object> map = new HashMap<>(); // 然后再put赋值
3、初始化常量Map
利用java.util.Collections的Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m)方法
class FinalMap {
private static final Map<String, Object> map;
static {
Map<String, Object> mapTemp = new HashMap<String, Object>() {
{
put("key1", "value1");
put("key2", "value2");
}
};
map = Collections.unmodifiableMap(mapTemp);
}
}
三、遍历
java.util.Map接口中有一些方法可用于遍历
1、遍历键
调用Set<K> keySet(); 遍历Set
2、遍历值
调用Collection<V> values();遍历Collection
3、遍历键和值
调用Set<Map.Entry<K, V>> entrySet();遍历Set。在java.util.Map.Entry<K, V>接口中,有K getKey();和V getValue();两个方法可以分别获取键和值
四、是否包含某个键或值
java.util.Map接口中有boolean containsKey(Object key);和boolean containsValue(Object value);方法
五、判断两个map的键值对是否相等
实现类对象调用实现了的java.util.Map接口的equals方法,甚至譬如HashMap和Hashtable的对象间也可做此判断
六、删除某个键值对
java.util.Map接口中的V remove(Object key);、boolean remove(Object key, Object value) 网上有文章论述说多线程时删除失败,这里采用迭代器的方式进行删除
上述的Set<K> keySet();方法获得键的Set后调用Set的Iterator<E> iterator();方法获得其迭代器,通过遍历迭代器的方式调用迭代器的void remove();方法进行移除
并且那篇文章说遍历的时候新增键值对会有同样的并发问题,建议也用迭代器新增。但是个人目前未发现该种新增的方法,毕竟Iterator不像ListIterator一样有add方法
七、自定义排序map
用List<Map.Entry<K, V>>存储map.entrySet(),以ArrayList为例,利用public ArrayList(Collection<? extends E> c)这个构造方法可以将Set类型转为List,然后利用java.util.Collections的void sort(List<T> list, Comparator<? super T> c)方法自定义比较器来将Map.Entry<K, V>排序
参考文章列表:
https://blog.csdn.net/i_peter/article/details/51004023
https://blog.csdn.net/liuxiao723846/article/details/50454622
http://www.cnblogs.com/zuge/p/5977123.html
https://blog.csdn.net/xzw_123/article/details/50239743
https://blog.csdn.net/fg2006/article/details/6411200
https://www.cnblogs.com/bukudekong/p/3889740.html
https://blog.csdn.net/we_shell/article/details/46344343?ref=myread