Java集合系列06之Map接口概览

系列文章

前言

前面介绍集合的框架时,我们提到集合框架中主要有ListSetMap三种数据类型,List我们已经分析过了,而Set的实现依赖于MapHashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,因此我们再来分析Map

本文源码分析基于jdk 1.8.0_121

关系图

Map框架
  • Map是具有映射关系的集合接口,储存内容是键值对
  • AbstractMap是继承于Map的抽象类,实现了Map中大部分方法,类似AbstractList
  • SortedMap 是继承于Map的接口,储存有序的键值对,排序是通过Comparator实现的
  • NavigableMap 是继承于SortedMap的接口,NavigableMap有一系列的导航方法;如"获取大于/等于某对象的键值对"、“获取小于/等于某对象的键值对”等等
  • TreeMap 继承于AbstractMap,并实现了NavigableMap接口,储存有序的键值对
  • HashMap 继承于AbstractMap,存储无序的键值对
  • WeakHashMap 继承于AbstractMap,存储无序的“弱键值对”
  • Hashtable 继承于Dictionary,实现了Map接口,储存无序的键值对,且是线程安全的,支持Enumeration遍历。

Map

Map的定义如下:

public interface Map<K,V>

其储存了键值对,且不允许包含重复的键,一个键只能对应一个值,Map可以单独查看键集、值集或键-值映射关系。

Map API

void                 clear()
boolean              containsKey(Object key)
boolean              containsValue(Object value)
Set<Entry<K, V>>     entrySet()
boolean              equals(Object o)
V                    get(Object key)
int                  hashCode()
boolean              isEmpty()
Set<K>               keySet()
V                    put(K key, V value)
void                 putAll(Map<? extends K, ? extends V> map)
V                    remove(Object key)
int                  size()
Collection<V>        values()
  • keySet() 方法用于返回键集
  • values() 方法用于返回值集
  • entrySet() 方法用于返回键-值映射关系

Map.Entry

其定义如下:

interface Entry<K,V>

Map.EntryMap的内部接口,Map.Entry是键值对,Map通过entrySet() 获取Map.Entry的键值对集合。

Map.Entry API

K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();

AbstractMap

其定义如下:

public abstract class AbstractMap<K,V> implements Map<K,V> 

AbstractMap提供了Map的大部分实现,要实现不可修改的映射,只需扩展此类并提供 entrySet()方法的实现即可。要实现可修改的映射,编程人员必须另外重写此类的 put 方法(否则将抛出 UnsupportedOperationException),entrySet().iterator() 返回的迭代器也必须另外实现其 remove 方法。

AbstractMap API

abstract Set<Entry<K, V>>     entrySet()
         void                 clear()
         boolean              containsKey(Object key)
         boolean              containsValue(Object value)
         boolean              equals(Object o)
         V                    get(Object key)
         int                  hashCode()
         boolean              isEmpty()
         Set<K>               keySet()
         V                    put(K key, V value)
         void                 putAll(Map<? extends K, ? extends V> m)
         V                    remove(Object key)
         int                  size()
         String               toString()
         Collection<V>        values()
         Object               clone()

SortedMap

其定义如下:

public interface SortedMap<K,V> extends Map<K,V> 

SortedMap是一个有序的键值映射,排序方式有两种:自然排序和指定Comparator

SortedMap API

Comparator<? super K>     comparator()
K                         firstKey()
SortedMap<K, V>           headMap(K endKey)
K                         lastKey()
SortedMap<K, V>           subMap(K startKey, K endKey)
SortedMap<K, V>           tailMap(K startKey)
Set<K>                    keySet();
Collection<V>             values();
Set<Map.Entry<K, V>>      entrySet();

NavigableMap

其定义如下:

public interface NavigableMap<K,V> extends SortedMap<K,V>

NavigableMap是继承于SortedMap的接口,具有了针对给定搜索目标返回最接近匹配项的导航方法。

NavigableMap API

Entry<K, V>             ceilingEntry(K key)
Entry<K, V>             firstEntry()
Entry<K, V>             floorEntry(K key)
Entry<K, V>             higherEntry(K key)
Entry<K, V>             lastEntry()
Entry<K, V>             lowerEntry(K key)
Entry<K, V>             pollFirstEntry()
Entry<K, V>             pollLastEntry()
K                       ceilingKey(K key)
K                       floorKey(K key)
K                       higherKey(K key)
K                       lowerKey(K key)
NavigableSet<K>         descendingKeySet()
NavigableSet<K>         navigableKeySet()
NavigableMap<K, V>      descendingMap()
NavigableMap<K, V>      headMap(K toKey, boolean inclusive)
SortedMap<K, V>         headMap(K toKey)
SortedMap<K, V>         subMap(K fromKey, K toKey)
NavigableMap<K, V>      subMap(K fromKey, boolean fromInclusive, boolean toInclusive)
SortedMap<K, V>         tailMap(K fromKey)
NavigableMap<K, V>      tailMap(K fromKey, boolean inclusive)
  • lowerEntryfloorEntryceilingEntryhigherEntry 分别返回与小于、小于等于、大于等于、大于给定键的键关联的 Map.Entry 对象,如果不存在这样的键,则返回 null
  • firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。
  • lowerKey、floorKey、ceilingKey 和 higherKey分别返回与小于、小于等于、大于等于、大于给定键的键
  • navigableKeySet、descendingKeySet分别获取正序/反序的键集,descendingMap()返回此映射中所包含映射关系的逆序视图
  • headMap、subMap、tailMap返回特定的键-值对的子集

Dictionary

其定义如下:

public abstract class Dictionary<K,V> 

NavigableMapJDK 1.0定义的键值对的接口,它也包括了操作键值对的基本函数。

Dictionary API

Enumeration<V>     elements()
V                  get(Object key)
boolean            isEmpty()
Enumeration<K>     keys()
V                  put(K key, V value)
V                  remove(Object key)
int                size()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容