之前讲过了Collection类下的两个主要容器:List和Set,今天我们来讲讲没有继承自Collection的容器:Map。
Map提供了一个更通用的元素存储方法,Map提供了一个键值对的存储方式,一个键映射到一个值。、
Map中的常用方法
返回类型 | 方法名(参数类型) |
---|---|
void | clear() 从该地图中删除所有的映射(可选操作)。 |
boolean | containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。 |
Set<Map.Entry<K,V>> | entrySet() 返回此地图中包含的映射的 |
boolean | equals(Object o) 将指定的对象与此映射进行比较以获得相等性 |
int | hashCode() 返回此地图的哈希码值。 |
boolean | isEmpty() 如果此地图不包含键值映射,则返回 true 。 |
Set<K> | keySet() 返回此地图中包含的键的 |
V | put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。 |
void | putAll(Map<? extends K,? extends V> m) 将指定地图的所有映射复制到此映射(可选操作)。 |
V | remove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射。 |
int | size() 返回此地图中键值映射的数量。 |
default V | replace(K key, V value) 只有当目标映射到某个值时,才能替换指定键的条目。 |
default boolean | replace(K key, V oldValue, V newValue) 仅当当前映射到指定的值时,才能替换指定键的条目。 |
Map中的常用类
我们来看看Map的结构图
可以看出主要有三个实现类
- HashMap
- TreeMap
- WeakHashMap
- HashTable
HashMap
HashMap是最常用的Map,根据键的Hash值来存储数据,具有很快的访问速度。HashMap允许key、value为null,HashMap是非同步的。
TreeMap
TreeMap的特点就是其值是有序的,默认按升序排序,也可以指定比较器。TreeMap不允许key为null。TreeMap是非同步的。
WeakHashMap
WeakHashMap与HashMap基本一样,区别在于其键的引用类型。WeakHashMap的键是弱引用(WeakReference)类型,采用弱引用类型的好处是方便GC(垃圾回收器)进行垃圾回收,即方便内存的释放。
HashTable
与HashMap类似,但是HashTable不允许key和value的值为null,HashTable是线程同步的。
ConcurrentHashMap
在这里要特别提一下ConcurrentHashMap。HashMap是非同步的,虽然HashTable能解决HashMap的非同步问题,但是HashTable采用的是使用synchronized关键字进行线程同步,这样做的效率很低。ConcurrentHashMap就是为了解决线程同步但效率不高的问题。ConcurrentHashMap采用了分段锁的机制,后续我们会对这个分段锁详细介绍。