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不可变集合

你可能感兴趣的:(Java基础——Map集合、Java9中的不可变集合)