Map简介
需要注意,这里的Map单词并不是“地图”的意思,而是“映射”的意思。
Java中的集合可以看成两大类。第一类是Collection,用于单值存储,也就是说一次只能一个int、char、Object等等。第二类就是Map,它用于双值存储,其中的“双值”就是我们所说的“键值对”。为方便理解“键值对”,可以把它类比成一把钥匙对一把锁,其中键就是钥匙,值(数据)对应的就是锁。如果想要访问一个数据,只能通过它对应的那个“钥匙”来得到。
Map类对象,用来将“键”映射到“值”,并且一个Map中不能包含重复的键,每个键只能映射一个值。Map的子类中,比较常用的有:HashMap、TreeMap、LinkedHashMap。
与Set的关系
Set的子类,就是基于Map实现的,像HashSet基于HashMap,TreeSet基于TreeMap。但是为什么Set会基于Map实现呢?我们都知道,Set集合不能存在重复的元素,而这个效果就是依靠Map中“不能包含重复的键”的这种特性实现的,Set将数据存储在Map中的“键”的位置,这样的话,如果Set新增了一条重复数据,Map就会发现自己即将出现重复的键,就不添加这个数据,从而实现了Set集合不能存在重复的元素。
常用方法
1. V put(K key, V value)
用于添加一个键值对。
需要注意的是,这里的返回值。如果添加的键已经存在,则会用新的值覆盖原来这个键对应的旧值,并且把旧值返回出来。如果添加的键不存在,返回null。
2.void putAll(Map<? extends K, ? extends V> m)
用于添加一组键值对。
3.V remove(K key)
通过制定键,来删除对应的键值对。删除的值会被返回。
4.boolean remove(K key, V value)
通过制定键和值,来删除对应的键值对,只有键和值都匹配才会删除,否则不会删除。
5.Set<K> keySet()
以Set形式返回此Map中的所有的键。
6.void clear()
清空所有键值对。
7.boolean containsKey(Object key)
判断Map中是否有指定键。
8.boolean containsValue(Object value)
判断Map中是否有指定键。
9.get(Object key)
通过指定键获取值。
五个子类的特点
1.HashMap
HashMap线程不安全,但是效率高。
2.Hashtable
Hashtable线程安全,效率低。
3.ConcurrentHashMap
ConcurrentHashMap使用了分段锁机制,使它线程安全,效率也相对较高。
分段锁机制:
分段锁机制意思就是,在这个Map的哈希表被多线程访问时,哈希表只会锁住被访问的哈希桶,而非锁住整个哈希表,这样如果有线程在访问这个哈希表的时候,其他线程可以访问其他的哈希桶,而不是绝对不能访问这个哈希表。
例如,如果线程1正在访问0下标处的哈希桶,那么其他线程可以访问下标为1、2、3 。 。 。的哈希桶。
4.TreeMap
TreeMap区别于其他Map,它底层使用二叉树实现,并且它里面的元素是有序的。
5.LinkedHashMap
LinkedHashMap可以看成是有序的HashMap,它是HashMap的子类,并且基于链表实现了元素有序。