目录

什么是Map集合?

​map集合的作用

Map和Set的关系

java8为Map新增的方法

java8改进的HashMap和Hashtable实现类

区别

和HashSet的关系

LinkedHashMap实现类

WeakHashMap实现类

IdentityHashMap实现类


什么是Map集合?

Map用于保存具有映射关系的数据,Map集合里保存着两组值,一组用于保存Map的ley,另一组保存着Map的value。

图解


map集合的作用

和查字典类似,通过key找到对应的value,通过页数找到对应的信息。用学生类来说,key相当于学号,value对应name,age,sex等信息。用这种对应关系方便查找。

Map和Set的关系

可以说关系是很密切了,虽然Map中存放的时键值对,Set中存放的是单个对象,但如果把value看做key的附庸,key在哪里,value就在哪里,这样就可以像对待Set一样来对待Map了。事实上,Map提供了一个Entry内部类来封装key-value对,再计算Entry存储时则只考虑Entry封装的key。

如果把Map集合里的所有value放在一起来看,它们又类似于一个List,元素可以重复,每个元素可以根据索引来找,只是Map中的索引不再是整数值,而是以另一个对象作为索引。

Map中的常用方法:

  • void clear():删除该Map对象中所有键值对;
  • boolean containsKey(Object key):查询Map中是否包含指定的key值;
  • boolean containsValue(Object value):查询Map中是否包含一个或多个value;
  • Set entrySet():返回map中包含的键值对所组成的Set集合,每个集合都是Map.Entry对象。
  • Object get():返回指定key对应的value,如果不包含key则返回null;
  • boolean isEmpty():查询该Map是否为空;
  • Set keySet():返回Map中所有key组成的集合;
  • Collection values():返回该Map里所有value组成的Collection。
  • Object put(Object key,Object value):添加一个键值对,如果集合中的key重复,则覆盖原来的键值对;
  • void putAll(Map m):将Map中的键值对复制到本Map中;
  • Object remove(Object key):删除指定的key对应的键值对,并返回被删除键值对的value,如果不存在,则返回null;
  • boolean remove(Object key,Object value):删除指定键值对,删除成功返回true;
  • int size():返回该Map里的键值对个数;

内部类Entry :Map中包括一个内部类Entry,该类封装一个键值对,常用方法:

  • Object getKey():返回该Entry里包含的key值;
  • Object getvalue():返回该Entry里包含的value值;
  • Object setValue(V value):设置该Entry里包含的value值,并设置新的value值。

实例:

        HashMap<String, Integer> hm = new HashMap<>();//放入元素hm.put("Harry",23);hm.put("Jenny",24);hm.put("XiaoLi",20);System.out.println(hm);//{XiaoLi=20, Harry=23, Jenny=24}System.out.println(hm.keySet());//[XiaoLi, Harry, Jenny]System.out.println(hm.values());//[20, 23, 24]Set<Map.Entry<String, Integer>> entries = hm.entrySet();        for (Map.Entry<String, Integer> entry : entries) {System.out.println(entry.getKey());System.out.println(entry.getValue());}

java8为Map新增的方法

  • Object compute(Object key,BiFurcation remappingFunction):使用remappingFunction根据原键值对计算一个新的value,只要新value不为null,就覆盖原value;如果新value为null则删除该键值对,如果同时为null则不改变任何键值对,直接返回null。
  HashMap<String, Integer> hm = new HashMap<>();//放入元素hm.put("Harry",23);hm.put("Jenny",24);hm.put("XiaoLi",20);        System.out.println(hm);//{XiaoLi=20, Harry=23, Jenny=24}hm.compute("Harry",(key,value)->(Integer)value+10);System.out.println(hm);//{XiaoLi=20, Harry=33, Jenny=24}
  • Object computeIfAbsent(Object key,Furcation mappingFunction):如果传给该方法的key参数在Map中对应的value为null,则使用mappingFunction根据key计算一个新的结果,如果计算结果不为null,则计算结果覆盖原有的value,如果原Map原来不包含该Key,那么该方法可能会添加一组键值对。
        HashMap<String, Integer> hm = new HashMap<>();//放入元素hm.put("Harry",23);hm.put("Jenny",24);hm.put("XiaoLi",20);hm.put("LiMing",null);//指定key为null则计算结果作为valuehm.computeIfAbsent("LiMing",(key)->10);System.out.println(hm);//{XiaoLi=20, Harry=23, Jenny=24, LiMing=10}//如果指定key本来不存在,则添加对应键值对hm.computeIfAbsent("XiaoHong",(key)->34);System.out.println(hm);//{XiaoLi=20, Harry=23, XiaoHong=34, Jenny=24, LiMing=10}
  • Object compute(Object key,BiFurcation remappingFunction):如果传给该方法的key参数在Map中对应的value不为null,则通过计算得到新的键值对,如果计算结果不为null,则覆盖原来的value,如果计算结果为null,则删除原键值对。
hm.computeIfPresent("Harry",(key,value)->(Integer)value*(Integer)value);System.out.println(hm);//{XiaoLi=20, Harry=529, Jenny=24, LiMing=null}
  • void forEach(BiConsumer action):遍历键值对。
        HashMap<String, Integer> hm = new HashMap<>();        //放入元素hm.put("Harry",23);hm.put("Jenny",24);hm.put("XiaoLi",20);hm.put("LiMing",null);hm.forEach((key,value)-> System.out.println(key+"->"+value));/*XiaoLi->20Harry->23Jenny->24LiMing->null*/
  • Object getOrDefault(Object key,V defaultValue):获取指定key对应的value,如果key不存在则返回defaultValue;
System.out.println(hm.getOrDefault("Harry",33));//23
  • Object merge(Object key,Object value,BiFurcation remappingFunction):该方法会先根据key参数获取该Map中对应的value。如果获取的value为null,则直接用传入的value覆盖原有的value,如果获取的value不为null,则使用remappingFunction函数根据原value、新value计算一个新的结果,并用得到的结果去覆盖原有的value。
 HashMap<String, Integer> hm = new HashMap<>();//放入元素hm.put("Harry",23);hm.put("Jenny",24);hm.put("XiaoLi",20);hm.put("LiMing",null);hm.merge("LiMing",24,(key,value)->value+10);System.out.println(hm);//{XiaoLi=20, Harry=23, Jenny=24, LiMing=24}hm.merge("Harry",24,(key,value)->value+10);System.out.println(hm);//{XiaoLi=20, Harry=34, Jenny=24, LiMing=24}
  • Object putIfAbsent(Object key,Object value):该方法会自动检测指定key对应的value是否为null,如果为null,则用新value去替换原来的null值。
  • Object replace(Object key,Object value):将key对应的value替换成新的value,如果key不存在则返回null。
  • boolean replace(K key,V oldValue,V newValue):将指定键值对的value替换成新的value,如果未找到则返回false;
  • replaceAll(BiFunction Function):使用BiFunction对原键值对执行计算,并将结果作为该键值对的value值。

java8改进的HashMap和Hashtable实现类

HashMap和Hashtable的关系完全类似于ArrayList和Vector的关系。

区别

  • Hashtable是线性安全的,HashMap是线性不安全的,所以后者效率更高。
  • Hashtable不允许使用null作为key和value,否则会引发异常,而HashMap可以;

和HashSet的关系

  • 与HashSet集合不能保证元素顺序一样,HashMap和Hashtable也不能保证键值对的顺序。他们判断两个key相等的标准也是:两个key通过equals方法比较返回true,两个key的hashCode值也相等。而判断value值相等的标准:只要两个对象通过equals方法比较返回true即可。
  • 不能修改集合中的key,否则程序再也无法准确访问到Map中被修改过的key。

LinkedHashMap实现类

和HashSet中的LinkedHashSet一样,HashMap也有一个LinkedHashMap子类,使用双向链表来维护键值对的次序,迭代顺序和插入顺序保持一致。

使用Properties读写属性文件
Properties类是Hashtable类的子类,该对象在处理属性文件时特别方便。Properties类可以把Map对象和属性文件关联起来,从而把Map对象的键值对写入属性文件中,也可以把属性文件中的“属性名=属性值”加载到Map对象中。

Properties相当于一个key、value都是String类型的Map

  • String getProperty(String key):获取Properties中指定的属性名对应的属性值。
  • String getProperty(String key,String defaultValue):和前一个方法相同,只不过如果key不存在,则该方法指定默认值。
  • Object setProperty(String key,String value):设置属性值,类似于Hashtable的put方法;
  • void load(InputStream inStream):从属性文件中加载键值对,把加载出来的键值对追加到Properties里。
  • void store(OutputStream out,String comments):将Properties中的键值对输出到指定的属性文件中。

实例:

    public static void main(String[] args) throws Exception {Properties props = new Properties();//向Properties中添加属性props.setProperty("username","yeeku");props.setProperty("password","123456");//保存到文件中props.store(new FileOutputStream("a.ini"),"comment line");//新建一个Properties对象Properties props2 = new Properties();props2.setProperty("gender","male");//将文件中的键值对追加到对象中props2.load(new FileInputStream("a.ini"));System.out.println(props2);//{password=123456, gender=male, username=yeeku}}

文件内容

还可以把键值对以XML文件的形式保存起来,同样可以从文件中加载出来,用法与上述案例相同。

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

TreeMap就是一个红黑树数据结构,每个键值对作为红黑树的一个节点。存储键值对时根据key对节点进行排序。可以保证所有键值对处于有序状态。
和TreeSet一样,TreeMap也有自然排序和定制排序两种排序方式。

与TreeSet类似的是,TreeMap中提供了一系列根据key顺序访问键值对的方法:

    public static void main(String[] args) {TreeMap<String, Integer> stuTreeMap = new TreeMap<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int num=o1.compareTo(o2);return num;}});stuTreeMap.put("LiMing",14);stuTreeMap.put("LiMing",24);stuTreeMap.put("Jenny",16);stuTreeMap.put("Denny",24);System.out.println(stuTreeMap);//{Denny=24, Jenny=16, LiMing=24}System.out.println(stuTreeMap.firstEntry());//Denny=24}

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

System.out.println(stuTreeMap.firstEntry());//Denny=24
  • Object firstKey():返回该Map中的最小key值,如果Map为空则返回null;
  • Object lastKey():返回该Map中的最大key值,如果Map为空则返回null;
  • Map.Entry higherEntry(Object key):返回该Map中位于key后一位的键值对;
  • Object higherKey(Object key):返回该Map中位于key后一位的key;
  • Map.Entry lowerEntry(Object key):返回该Map中位于key前一位的键值对;
  • Object lowererKey(Object key):返回该Map中位于key前一位的key;
  • NavigableMap tailMap(Object fromkey,boolean fromInclusive,Object toKey,boolean toInclusive):返回该Map的子Map,其key范围从fromkey(是否包含取决于第二个参数)到toKey(是否包含取决于第四个参数)。

WeakHashMap实现类

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

IdentityHashMap实现类

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

  IdentityHashMap map = new IdentityHashMap<>();map.put(new String("语文"), 89);map.put(new String("语文"), 90);map.put("java",70);map.put("java",71);System.out.println(map);//{java=71, 语文=90, 语文=89}

前面是两个对象虽然通过equal方法比较是相等的,但是通过==比较不相等,后面两个字符串在常量池中同一位置,所以使用==判断相等。
————————————————
版权声明:本文为CSDN博主「Mrkang1314」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mashaokang1314/article/details/83784159

【转】java中的Map集合相关推荐

  1. Java中遍历Map集合的5种方式总结

    这篇文章主要给大家介绍了关于Java中遍历Map集合的5种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 方式一 通过Map.keySet使用iterator遍历 ...

  2. JAVA中的Map集合

    JAVA中的Map集合 1.Map简介 java.util.map接口 1.Map称为查找表,该数据结构的样子是一个"多行两列"的表格,左列为key,右列为value,Map总是根 ...

  3. Java中的Map集合遍历总结(详尽版)

    因为Map集合中的键值对排列无序,所以不能用传统的for循环来遍历,只能使用加强循环(for-each)和迭代器进行遍历. 让我们通过例子来了解Map集合的遍历: package gather; im ...

  4. Scala中映射的语法(对应Java中的Map集合的定义)

    1. 映射 在Scala中,把哈希表这种数据结构叫做映射 1.1. 构建映射 1.2. 获取和修改映射中的值 好用的getOrElse 注意:在Scala中,有两种Map,一个是immutable包下 ...

  5. java 中map_Java Map集合详解

    Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象.其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素 ...

  6. Java中的Map集合及其子类HashMap,LinkedHashMap,TreeMap,ConcurrentHashMap

    一 .Map public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口哦取代了Dictionary类,后者完全是 ...

  7. 18、java中的Map集合

    1.Map集合 1.1Map集合概述和特点 Map集合概述 interface Map<K,V> K:键的类型:V:值的类型 Map集合的特点 键值对映射关系 一个键对应一个值 键不能重复 ...

  8. Java中使用Map and Fold进行功能性编程

    在函数式编程中,Map和Fold是两个非常有用的运算符,它们属于每种函数式语言. 如果Map和Fold运算符是如此强大且必不可少,那么您如何解释说即使Java编程语言缺少这两个运算符,我们也可以使用J ...

  9. java 集合初始化_6种方法初始化JAVA中的list集合

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 1.常规方式 List languages = ne ...

  10. java map中套map_Java Map – Java中的Map

    java map中套map Java Map is part of collections framework. Java Map object is used to store key-value ...

最新文章

  1. Linux_进程管理计划任务
  2. HDOJ 1016 HDU 1016 Prime Ring Problem ACM 1016 IN HDU
  3. boost::inplace_merge相关的测试程序
  4. 软件工程期末考试复习(四)
  5. [LeetCode] Interleaving String
  6. ANSYS——查看某一截面的云图分布(也叫做切片图)
  7. java socket实现简单即时通讯
  8. socket 编程 基于 select 实现的回射客户端/服务程序
  9. Django 文件上传与下载的相关问题
  10. C语言将字符串s连接到t的后面,下列给定程序中,函数fun的功能是:先将字符串s中的字符按正序存放到字符串t..._考试资料网...
  11. Ubuntu16.04安装VSCode
  12. 基于stm32单片机srf04超声波传感器测距Proteus仿真
  13. 聚合支付、第四方支付有哪些平台?
  14. unity3d shader之Julia集和Mandelbrot集绘制美丽图案
  15. 实时数仓的实时保障指南
  16. 2019天梯赛+第一次面试总结
  17. 可视化 | 人物画像的设计方法
  18. Python数据结构15:turtle模块制图,画直线,正方形,星星,递归可视化:分形树,谢尔宾斯基三角形
  19. 你不知道的Word中制作表格的7个技巧
  20. PHP时间差七个小时怎么回事,php 怎么解决8小时时间差的问题

热门文章

  1. 【TSP】基于matlab GUI蚁群算法求解旅行商问题【含Matlab源码 929期】
  2. 【卡号识别】基于matlab分割法银行卡数字识别【含Matlab源码 312期】
  3. 马斯克神经网络转换器_通过转换数据来减少人工神经网络的复杂性
  4. matlab 灰度化原理公式,MATLAB的Sobel图像边缘灰度值检测算法的详细公式和实现资料概述...
  5. Python argparse模块、argparse.ArgumentParser()用法解析
  6. 例2.2 成绩排序 - 九度教程第2题(排序)
  7. 计算器: 请输入两个数和一个符号,完成两个数的+ - * / % // **
  8. java多表查询实体类_自己设计一个JAVA+MyBatis解析实体类多表通用查询
  9. php5.4 无法连接mongo,php连接MongoDB总是失败,为什么?
  10. Java二十三设计模式之-----桥接模式