Java基础——Map集合、Java9中的不可变集合

Map集合概述

Map用于保存具有映射关系的数据,Map中保存着两组值,一组用于保存map中的key一组用于保存Map中的value
Map的Key不允许重复,key和value之间存在单向一对一关系。

  • 如果把Map里所有的key放在一起来看,它们组成了一个Set集合,所有的key没有顺序并且Key和Key之间不能重复。
  • 如果把Map中所有的value放在一起看,又非常类似于一个List集合,value元素与元素之间可以重复,每个元素可以通过索引来查找(Map中的索引不再使用整数值而是以另一个对象作为索引)
  • 如果要从Map中取出元素,需要提供该元素的key索引

Map集合API

  • void clear() :清空该Map集合中所有的Key-Value对
  • boolean containKey(Object o) 查询Map中是否包含指定的key
  • boolean containValue(Object value) 查询Map中是否包含一个或多个value
  • Set entrySet() 返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象
  • Object get(Object key):返回指定Key所对应的value,若没有查询到则返回Null
  • boolean isEmpty():查询该Map是否为空
  • Set keySet():返回该Map中所有key组成的Set集合
  • Object put(Object key,Object value) 添加一个key-value对。如果当前map中已有该key-value对,则新的key-value对会覆盖原来的
  • void putAll(Map m) 将指定Map中的key-value对复制到本map中
  • Object remove(Object key) 删除指定Key所对应的key-value对,返回被删除Key所关联的value,如果该key不存在返回Null
  • boolean remove(Object key,Object value) java8新增的方法,删除指定key、value所对应的key-value对,如果成功删除返回true 否则返回false
  • int size() 返回该Map里key-value的对数
  • Collection values() 返回该Map里所有value组成的Collection
    在Mao集合中包括一个内部类Entry,该类封装了一个key-value对
  • Object getKey() 返回该Entry里包含的key值
  • Object getValue() 返回该Entry里包含的value值
  • Object setValue(V value) 设置该Entry里包含的value值,并返回新设置的value值

Java8 为Map新增的方法

  • Object compute(Object key,BiFunction remappingFunction) 该方法使用remappingFunction根据原key-value对计算一个新value,只要新value不为null,就用新value覆盖原value,如果原value不为null 但新value为null,则删除原key-value对,如果原、新value同时为Null则该方法不改变任何key-value对,直接返回Null
  • Object computeIfAbsent(Object key,Function mappingFunction) 如果参数Key在map中对应的value为Null 则使用mappingFunction根据Key计算一个新的结果,如果结果不为Null,则覆盖原来的value。如果原Map原来不包括该Key那么该方法会添加一组Key-value对
  • void forEach(BiConsumer action) 新增的遍历Map集合的key-value对
  • boolean replace(Object key,Object value) 将Map中指定Key-value对的原value替换成新的value,如果该key-value对在map中不存在,则执行替换并返回true 否则返回false
  • replaceAll(BiFunction function) 该方法使用BiFunction对原key-value对执行计算,并将计算结果作为该key-value对的value值

Java8改进的HashMap和Hashtable

Hashtable是一个线程安全的Map实现,但是HashMap是线程不安全的实现
Hashtable中不允许使用Null最为key和value
HashMap里的key不能重复,所以HashMap里最多只有一个key-value对的key为null但可以有无数多个key-value对的value为null

在HashMap、Hashtable中存储获取对象,用作key的对象必须实现hashCode()方法和equals()方法

HashMap、Hashtable不能保证其中key-value对的顺序。判断两个key相等的标准是:两个key通过equals()比较返回true,两个key的hashCode值也相等

LinkedHashMap 实现类

LinkedHashMap使用双向链表来维护key-value对的次序,迭代顺序与key-value对的插入顺序保持一致。
LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,因为以链表来维护内部顺序,所以在迭代访问Map里的全部元素时将有较好的性能。

SortedMap接口和TreeMap实现类

  • TreeMap就是一个红黑树数据结构
    • 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象
    • 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序,采用定制排序时不要求Map的key实现Comparable接口

想让TreeMap良好地工作,则需要重写该类的equals()方法和compareTo()方法时应保持一致的返回结果:也就是说当两个key通过equals()方法比较返回true时,它们通过compareTo()方法比较应该返回0

TreeMap API

  • Map.Entry fiestEntry() 返回该TreeMap中最小key所对应的key-value对
  • Object firstKey():返回该Map中的最小key值
  • Map.Entry lastEntry():返回该Map中最大key所对应key-value
  • Object lastKey() 返回该Map中的最大key值
  • Map.Entry higherEntry(Object key) 返回该Map中位于key后一个位的key-value对。
  • Object higherKey(Object key)返回Map中位于key后一位的key值(即大于指定key的最小key值)
  • Map.Entry lowerEntry(Object key)返回该Map中位于key前一位的key-value对(即小于指定key的最大key所对应的key-value)
  • NavigableMap subMap(Object fromKey,Object toKey) 返回该Map的子Map,其key的范围是从fromkey(包括)到tokey(不包括)
  • SortedMap tailMap(Object fromKey) 返回该Map的子Map,其key的范围是大于fromKey的所有key
  • SortedMap headMap(Object toKey)返回该Map的子Map,其key的范围是小于toKey的所有key

TreeMap通常比HashMap、Hashtable要慢,因为TreeMap底层采用红黑树来管理key-value底层采用红黑树来管理key-value对

TreeMap中的key-value总是处于有序状态

WeakHashMap 实现类

WeakHashMap的key的只保留了对实际对象的弱引用,如果WeakHashMap对象的Key所引用的对象没有被其他强引用变量所引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。

IdentityHashMap实现类

在IdentityHashMap,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等,这种对于普通的HashMap而言,只有key1和key2通过equals()方法比较返回true,且它们的hashCode值需要相等

各Map实现类的性能

TreeMap通常比HashMap、Hashtable要慢,因为TreeMap底层采用红黑树来管理key-value对使用
对于一般场景,程序应考虑使用HashMap,HashMap是为了快速查询而设计的
如果程序需要一个总是排好序的Map则可以考虑使用TreeMap

Java9中新增的不可变集合

Java9中可以直接调用Set、List、Map的of()方法即可创建包含N个元素的不可变集合。
这样的不可变集合不能向集合中添加元素,也不能从集合中删除元素

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