一、介绍
- java.util.Map,哈希表,也称散列表
- Map集合存储元素是成对出现的
- Map集合的键是唯一的,每个键最多只能映射到一个值,不同键映射的值是可重复的
二、实现类
1、HashMap
extends AbstractMap
- 无序
- 线程不安全
- key和value都可以存
null
- 底层
- jdk7及以前:数组+链表
- jdk8:数组+链表+红黑树
2、LinkedHashMap
extends HashMap implements Map
- 有序,底层是哈希表+链表
- 线程不安全
3、TreeMap
extends AbstractMap
- 有序,根据key排序
- 基本类型、包装类、String:自然排序,从小到大
- 自定义对象类型:指定排序规则
- 线程不安全
- 要根据key排序,所以key不能存
null
,value可以存null - 基于红黑树实现
4、HashTable
- 线程安全
- 使用
synchronize
对整个方法进行加锁,性能比较低,不再推荐使用
- key、value都不能存
null
5、ConcurrentHashMap
extends AbstractMap
- 线程安全
- 它不是使用
synchronize
对整个方法加锁,而是利用segment
段落锁来对其进行加锁,推荐使用
三、API
1、Map
1、添加
Object put(K k,V v);
void putAll(Map<?,?> m);
V putIfAbsent(K key, V value)
2、获取
V get(Object key);
V getOrDefault(Object key, V defaultValue);
3、删除
V remove(Object key)
boolean remove(Object key, Object value)
4、是否为空
boolean isEmpty();
5、大小
int size();
6、否包含指定的key、value
boolean map.containsKey(Object key);
boolean map.containsValue(Object value);
7、清空
map.clear();
2、HashMap
1、初始化
new HashMap(int initialCapacity, float loadFactor) {
public HashMap(int initialCapacity);
public HashMap(Map m);
Map<K,V> Collections.singletonMap(K key, V value);
Map<String,String> map=new HashMap<String,String>(){{
put("紧急", "紧急");
put("高危险", "高危");
}};
3、LinkedHashMap
4、TreeMap
1、构造方法
public TreeMap();
public TreeMap(Comparator<? super K> comparator);
public TreeMap(Map<? extends K, ? extends V> m);
2、自动排序
TreeMap<Integer,Integer> tm1=new TreeMap<>();
tm1.put(1,11);
tm1.put(3,33);
tm1.put(2,22);
System.err.println(tm1.toString());
TreeMap<String,Integer> tm2=new TreeMap<>();
tm2.put("100",1);
tm2.put("12",3);
tm2.put("110",2);
System.err.println(tm2.toString());
TreeMap<Integer,Integer> tm3=new TreeMap<>((o1,o2)->o2-o1);
tm3.put(1,11);
tm3.put(3,33);
tm3.put(2,22);
System.err.println(tm3.toString());
3、get
K firstKey();
Map.Entry<K,V> firstEntry();
K lastKey();
Map.Entry<K,V> lastEntry();
4、删除并返回
Map.Entry<K,V> pollFirstEntry();
Map.Entry<K,V> pollLastEntry();
四、遍历
- 由key不重复和value可重复也可知它应当该返回什么集合
1、遍历key
Set<K> map.keySet();
2、遍历value
Collection<V> map.values();
3、遍历键值对
Set<Map.Entry<K, V>> map.entrySet()
Iterator<Entry<String,String>> it=map1.entrySet().iterator();
Entry<String,String> en=it.next();
map.forEach((k,v)->{
})