java集合 之 Map集合
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集合的更多相关文章
- Java常用的几种集合, Map集合,Set集合,List集合
Java中 Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...
- 黑马程序员——JAVA基础之Map集合
------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...
- 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 ...
- java集合(List集合与Map集合的数据转换)
List集合与Map集合的数据转换 实现List和Map数据的转换. 具体要求如下: 功能1:定义方法public void listToMap( ){ }将List中Student元素封装到Map中 ...
- 红黑树规则,TreeSet原理,HashSet特点,什么是哈希值,HashSet底层原理,Map集合特点,Map集合遍历方法
==学习目标== 1.能够了解红黑树 2.能够掌握HashSet集合的特点以及使用(特点以及使用,哈希表数据结构) 3.能够掌握Map集合的特点以及使用(特点,常见方法,Map集合的遍历) 4.能够掌 ...
- Java Collection、Map集合总结
1.Java中的Collection集合总结 Collection |---List(存储有序,可重复) |---ArrayList 底层数据结构是数组,查询快,增删慢. 线程不安全.效率高 |--- ...
- Java基础知识强化之集合框架笔记53:Map集合之Map集合的遍历 键值对对象找键和值
1. Map集合的遍历(键值对对象找键和值) Map -- 夫妻对 思路: A: 获取所有结婚证的集合 B: 遍历结婚证的集合,得到每一个结婚证 C: 根据结婚证获取丈夫和妻子 转换: A: ...
- Java基础知识强化之集合框架笔记52:Map集合之Map集合的遍历 键找值
1. Map集合的遍历 Map -- 夫妻对 思路: A:把所有的丈夫给集中起来. B:遍历丈夫的集合,获取得到每一个丈夫. C:让丈夫去找自己的妻子. 转换: A:获取所有的键 B:遍 ...
- Java基础知识强化之集合框架笔记51:Map集合之Map集合的功能概述与测试
1. Map集合的功能概述 (1)添加功能 V put(K key,V value):添加元素.这个其实还有另一个功能?先不告诉你,等会讲 如果键是第一次存储,就直接存储元素,返回null 如果键不是 ...
随机推荐
- 没有Google的日子很难过...But you can try...
作为开发人员,经常会通过Google查询一些资料(别问我为什么不用百度,当你输入关键字,然后给你提示没有查询到结果,或者一页全是垃圾资料的时候你就知道了).但是,N个月前,Google不好使了,同时N ...
- kubernetes学习笔记
docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用 ...
- SQL Server窗口函数:ROWS与RANGE
几乎每次我展示SQL Server里的窗口时,人们都非常有兴趣知道,当你定义你的窗口(指定的一组行)时,ROWS与RANGE选项之间的区别.因此在今天的文章里我想给你展示下这些选项的区别,对于你的分析 ...
- Html5+css3+angularjs+jquery+webAPi 开发手机web(一)
前言 随着浏览器的发展 HTML5+CSS3 的使用也越来越广泛,一直想学这个,想学那个折腾下来几乎没学到什么东西.工作经验告诉我,要掌握一门技术,就需要在项目中去磨练, 所以我就准备开发一个手机端的 ...
- 关于 getWriter() has already been called for this response 的错误解决办法
java.lang.IllegalStateException: getWriter() has already been called for this response 今天在做显示图片的时候,( ...
- Sql Server来龙去脉系列 必须知道的权限控制基础篇
题外话:最近看到各种吐槽.NET怎么落寞..NET怎么不行了..NET工资低的帖子.我也吐槽一句:一个程序猿的自身价值不是由他选择了哪一门技术来决定,而是由他自身能创造出什么价值来决定. 在进入本篇内 ...
- EF增删查改(三)------终极版
1.Add #region 1.1 新增学生信息(定义成Int类型,返回受影响的行数) /// <summary> /// 新增学生信息 /// </summary> /// ...
- ADO.NET基础01
数据库中数据的导入导出 在使用一些数据库时,很多时候都要将文件导入导出到指定的文件夹中: 数据的导入导出就必须用到stream函数,这就必须用到Using System.IO的命名空间: **在数 ...
- Import-Module ServerManager Import-Module : 未能加载指定的模块“ServerManager”,因为在任何模块目录中都没有找到有效模块文件...(通过Setup Factory调用PowerShell的脚本)
操作系统: Windows server 2008 R2(64位) C:\Windows\System32\WindowsPowerShell\v1.0\Modules 下有ServerManager ...
- 用stimulsoft Reports报表工具制作简单报表的过程
这是在数据库sql server中People表的数据