Map用于保存具有映射关系的数据,具有两组值:一组用于保存Map中的key;另一组用于保存Map中的value,形成key-value的存储形式

Map集合中包含的一些方法:

void clear():删除Map集合中的所有key-value对。

boolean containsKey(object key):查询Map集合中是否包含指定的key,如果包含,返回true。

boolean containsValue(Object value): 查询Map集合中是否包含指定的value,如果包含返回true。

set entrySet():返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。

Object get(Object key):返回指定的key所对应的value;如果此Map中不包括该key,则返回null。

boolean isEmpty():查询该Map是否为空,如果为空则返回null。

set keyset():返回该map中所有key所组成的集合。

Object put(Object key,Object value):添加一个key-value对,如果当前Map中已有一个与该key相等的key-value对,则新的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):删除指定key,value所对应的key-value对。如果成功删除,则返回true,否则返回false。

int size():返回该Map中key-value的个数。

Collection values():返回该Map中所有value组成的collection。

Java8为Map新增的方法:

Object compute(Object key, BiFunction remappingFunction):该方法使用remappingFunction根据原key-value对计算一个新的value。只要新的value不为null,就使用新的value覆盖原value;如果原value为null,但新value不为null,则删除原key-value对;如果原value、新value同时为null,那么该方法不改变任何key-value对,直接返回null。

Object computeIfAbsent(Object key, Function mappingFunction):如果传入的key参数在Map中对应的value为null,该方法将使用mappingFunction根据原key、value计算一个新的结果,如果该计算结果不为null,则用该计算结果覆盖原value;如果原Map原来不包括该key,该方法可能会添加一组key-value对。

Object computeIfPresent(Object key, BiFunction remappingFunction):如果传给该方法的key参数在Map中对应的value不为null,该方法将使用remappingFunction根据原key、value计算一个新结果,如果该计算结果不为null,则使用该结果覆盖原来的value;如果计算结果为null,则删除原key-value对。
void forEach(BiConsumer action):该方法是Java8为Map新增的一个遍历key-value对的方法。

Object getOrDefault(Object key, V defaultValue):获取指定的key对应的value。如果该key不存在,则返回defaultValue。

Object merge(Object key, Object value, BiFunction remappingFunction):该方法会先根据key参数获取该Map中对应的value。如果获取的value为null,则直接使用传入的value覆盖原value(在这种情况下,可能会添加一组key-value);如果获取的value不为null,则使用remappingFunction函数根据原value、新value计算一个新的结果,并用新的结果去覆盖原有的value。

Object putIfAbsent(Object key, Object value):该方法会自动检测指定的key对应的value是否为null,如果该key对应的value为null,则使用传入的新value代替原来的null。

Object replace(Object key, Object value):将Map中指定key对应的value替换成新value。如果key在Map中不存在,该方法不会添加key-value对,而是返回null。

Boolean replace(K key, V oldValue, V newValue):将Map中指定的key-value对的原value替换成新value。如果在Map中找到指定的key-value对,则执行替换并返回true,否则返回false。

replaceAll(BiFunction function):该方法使用function对原key-value对执行计算,并将计算结果作为key-value对的value值。

Java8改进的HashMap和Hashtable实现类

HashMap和Hashtable是Map接口的典型实现类。HashMap和Hashtable存在两点典型区别:

1、   Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能更高一些;但如果有多个线程访问同一个Map对象时,使用Hashtable会更好。

2、   Hashtable不允许使用null作为key和value,如果试图将null值放进Hashtable中,将会引发NullPointerException异常,但HashMap可以使用null作为key或value。

PS:

A、   由于HashMap中的key不能重复,所以HashMap中只能最多有一个key-value对的key为null,但可以有无数多个key-value对的value为null。

B、   Hashtable是一个古老的类,他的名字甚至没有遵守java命名规范。与Vector类似,尽量少用Hashtable实现类,即使是需要创建线程安全的Map实现类,也无需使用Hashtable实现类。

C、   HashMap和Hashtable判断两个key值相等的的标准是:两个key通过equals()方法比较返回true,两个key的Hashcode值也相等。

LinkHashMap实现类

LinkHashMap是使用双向链表来维护key-value对的次序(其实只考虑了key的次序),该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序一致。

使用Properties读写属性文件

Properties是Hashtable的子类,该对象在处理属性文件时十分方便。Prooperties类将Map对象和属性文件关联起来,从而可以将Map对象中的key-value对写入属性文件中,也可以将属性文件中的“属性名=属性值”加载到Map对象中。由于属性文件中的属性名和属性值都是字符串类型,所以Properties里的key、value都是字符串类型的。

该类提供了如下三个方法来修改Properties中的key、value值:

String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map中的get(Object key)方法。

String getProperty(String key, String defaultValue): 获取Properties中指定属性名对应的属性值,如果Properties中不存在指定的key时,则该方法指定默认值。

Object setProperty(String key, String value):设置属性值。

它还提供了两个读写属性文件的方法:

Void load(InputStream instream):从属性文件中加载key-value对,将加载到的key-value对追加到Properties中(Properties是Hashtable的子类,他不保证key-value对之间的次序)。

Void store(OutputStream out, String comments):将Properties中的Key-value对输出到指定的属性文件中。

SortedMap接口和TreeMap实现类

正如Set接口派生出SortedSet子接口,SortedSet接口有一个TreeSet实现类一样。Map接口也派生出一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类。

TreeMap就是一个红黑树数据结构,每个key-value对作为红黑树的一个节点。TreeMap在存储key-value对(节点),需要根据key对节点进行排序。TreeMap保证所有的key-value对处于有序状态。TreeMap有两种排序方式:

自然排序:TreeMap的所有key必须实现Comparable接口,而且所有key必须是同一个类的对象,否则会抛出ClassCastException异常。

定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的key进行排序。采用定制排序不要求TreeMap中的key实现Comparator接口。

TreeMap提供了一系列根据key顺序访问key-value对的方法。

Map.Entry firstEntry():返回该Map中最小key对应的key-value对;如果该Map为空,则返回null。

Object firstKey():返回该Map中最小的key值;如果该Map为空,则返回null。

Map.Entry lastEntry():返回该Map中最大的key所对应的key-value对;如果该Map为空或不存在这样的key,则都返回null。

Object lastKey():返回该Map中最大的key;如果该Map为空或不存在这样的key,则返回null。

Map.Entry higherEntry(Object key):返回该Map中大于指定key的后一位key-value对(大于key的最小key)。如果该Map为空,则返回null。

Object higherKey(Object key):返回该Map中大于指定key的最小key;如果该Map为空,则返回null。

Map.Entry lowerEntry(Object key):返回该Map中位于指定key前一位的key-value对(即小于指定key的最大key对应的key-value对);如果该Map为空或不存在这样的key-value对,则返回null。

Object lowerKey(Object key):返回该Map中位于指定key前一位key(小于指定key的最大key)。如果该Map为空或不存在这样的key,则返回null。

NavigableMap subMap(Object fromKey, boolean fromInclusive, Object toKey,  boolean toInclusive):返回该Map的子Map,其key范围是从fromKey(是否包括有传入的第二个参数决定)到toKey(是否包括由第四个参数决定)。

SortedMap subMap(Object fromKey, Object toKey):返回该Map的子Map,其key值得范围是由fromKey(包括)到toKey(不包括)。

SortedMap tailMap(Object fromKey):返回该Map的子Map,其范围是大于fromKey(包括)的所有key。

NavigableMap tailMap(Object fromKey, boolean inclusive):返回该Map的子Map,其key值的范围是大于fromKey(是否包括取决于第二个参数)的所有key。

SortedMap headMap(Object tokey):返回该Map的子Map,其key的范围是小于tokey(不包括)的所有key。

NavigableMap heapMap(Object tokey, boolean inclusive):返回该Map的子Map,其key的范围是小于tokey(是否包括取决于第二个参数)的所有key。

WeakHashMap实现类

WeakHashMap与HashMap的用法基本相似。与HashMap的区别在于,HashMap的值保留了对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap中的所有key所引用的对象就不会被垃圾回收,hashMap也不会主动删除这些key-value对;但WeakHashMap只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。

IdentityHashMap实现类

这个Map实现类的实现机制与HashMap基本类似,但它在处理两个key值相等时比较独特:在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为这两个key相等;对于普通的HashMap而言,只要key1和key2通过equals()方法比较返回true,且它们的hashCode值相等即可。

EnumMap实现类

EnumMap是一个和枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式的指定它对应的枚举类。EnumMap具有以下特征:

1.EnumMap在内部以数组的形式保存,所以这种实现形式十分紧凑高效。

2.EnumMap根据key的自然顺序(即枚举值在枚举类中定义顺序)来维护key-value对的顺序。当程序通过keySet()、entrySet()、values()等方法便利EnumMap是可以看到这些顺序。

3.EnumMap不允许使用null来做为key,但允许null作为value。如果试图使用null来做为key,程序将抛出NullPointerException异常。

4.创建EnumMap时必须指定一个枚举类,从而将该EnumMap和指定枚举类关联起来。

java集合 之 Map集合的更多相关文章

  1. Java常用的几种集合, Map集合,Set集合,List集合

    Java中  Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...

  2. 黑马程序员——JAVA基础之Map集合

    ------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...

  3. java学习笔记—集合之Map集合

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Times } p.p2 { margin: 0.0p ...

  4. java集合(List集合与Map集合的数据转换)

    List集合与Map集合的数据转换 实现List和Map数据的转换. 具体要求如下: 功能1:定义方法public void listToMap( ){ }将List中Student元素封装到Map中 ...

  5. 红黑树规则,TreeSet原理,HashSet特点,什么是哈希值,HashSet底层原理,Map集合特点,Map集合遍历方法

    ==学习目标== 1.能够了解红黑树 2.能够掌握HashSet集合的特点以及使用(特点以及使用,哈希表数据结构) 3.能够掌握Map集合的特点以及使用(特点,常见方法,Map集合的遍历) 4.能够掌 ...

  6. Java Collection、Map集合总结

    1.Java中的Collection集合总结 Collection |---List(存储有序,可重复) |---ArrayList 底层数据结构是数组,查询快,增删慢. 线程不安全.效率高 |--- ...

  7. Java基础知识强化之集合框架笔记53:Map集合之Map集合的遍历 键值对对象找键和值

    1. Map集合的遍历(键值对对象找键和值) Map -- 夫妻对  思路:  A: 获取所有结婚证的集合  B: 遍历结婚证的集合,得到每一个结婚证  C: 根据结婚证获取丈夫和妻子 转换:  A: ...

  8. Java基础知识强化之集合框架笔记52:Map集合之Map集合的遍历 键找值

    1. Map集合的遍历  Map -- 夫妻对 思路:  A:把所有的丈夫给集中起来.  B:遍历丈夫的集合,获取得到每一个丈夫.  C:让丈夫去找自己的妻子.  转换:  A:获取所有的键  B:遍 ...

  9. Java基础知识强化之集合框架笔记51:Map集合之Map集合的功能概述与测试

    1. Map集合的功能概述 (1)添加功能 V put(K key,V value):添加元素.这个其实还有另一个功能?先不告诉你,等会讲 如果键是第一次存储,就直接存储元素,返回null 如果键不是 ...

随机推荐

  1. Tools - Windows

    1)文本操作 Ctrl + C / Ctrl + V / Ctrl + X / Ctrl + Z / Ctrl + A:复制/粘贴/剪贴/撤销/全选. 2)窗口左右分屏 Win + 方向键:上(最大化 ...

  2. Vex – 超轻量!可以轻松自定义的现代风格弹窗插件

    Vex 的独特之处在于现代风格设计,能够自定义弹出模式.皮肤.Vex 超轻量,压缩后不到 2KB,提供了简洁的 API,可以根据自己的项目需要快速自定义.支持在移动设备上使用,测试通过的浏览器:IE8 ...

  3. C++ 多态的实现原理与内存模型

    多态在C++中是一个重要的概念,通过虚函数机制实现了在程序运行时根据调用对象来判断具体调用哪一个函数. 具体来说就是:父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际 ...

  4. 2014 Asia AnShan Regional Contest --- HDU 5073 Galaxy

    Galaxy Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5073 Mean: 在一条数轴上,有n颗卫星,现在你可以改变k颗 ...

  5. HBase Scan Timeout-OutOfOrderScannerNextException

    最近迁移数据时需要执行大Scan,HBase集群经常碰到以下日志: Exception in thread "main" org.apache.hadoop.hbase.DoNot ...

  6. 安装、部署... Windows服务 .net程序 安装 命令

    @echo offInstallutil.exe 程序目录 F:\test\TestWindows.exe 服务程序目录@sc start "服务名称"@sc config &qu ...

  7. TCP和UDP之间的区别

    TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供超时重发,丢弃重复数据,检验数据,流量控制等 ...

  8. 【JavaScript回顾】闭包

    什么是闭包? 闭包是指有权访问另一个 函数作用域中的变量的函数(也就是说,你这个函数用到的变量另外一个域的就算闭包) <script> function f1() { var age = ...

  9. LODOP打印插件

    HTML代码(请先下载对应LODOP插件安装)  -    打印onclike事件CreatePrintPage()打印函数,LODOP.PREVIEW()打印预览. <div class=&q ...

  10. 2. npm 的使用

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...