java 集合之Interface Map<K,V>

  • 类型参数:K- 此映射所维护的键的类型;V- 映射值的类型

  • 将键映射到值的对象。 一个映射不能包含重复的键; 每个键最多可以映射到一个值。这个接口取代了 Dictionary 类,后者是一个完全抽象的类而不是一个接口。

  • Map 接口提供了三个 collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。 映射的顺序定义为映射的 collection 视图上的迭代器返回其元素的顺序。 某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。

  • 注意:如果将可变对象用作映射键,则必须非常小心。当对象是映射中某个键时,如果以影响 equals 比较的方式更改了对象的值,则映射的行为将是不确定的。 此项禁止的一种特殊情况是不允许映射将自身作为键包含。 虽然允许映射将自身包含为值,但建议格外小心:在这样的映射上 equalshashCode 方法的定义将不再是明确的。

  • 所有通用映射实现类都应该提供两个“标准”构造函数:一个 void(无参数)构造函数,它创建一个空映射,以及一个带有 Map 类型的单个参数的构造函数,它创建一个具有相同键值的新映射 映射作为其参数。 实际上,后一个构造函数允许用户复制任何映射,生成所需类的等效映射。 没有办法强制执行此建议(因为接口不能包含构造函数),但 JDK 中的所有通用映射实现都符合。

  • 此接口中包含的“破坏性”方法,即修改它们操作的映射的方法,如果此映射不支持该操作,则指定为抛出 UnsupportedOperationException。 在这种情况下,如果调用对地图没有影响,则这些方法可能(但不是必需)抛出 UnsupportedOperationException。 例如,如果要“叠加”映射的映射为空,则在不可修改的映射上调用 putAll(Map) 方法可能(但不是必需)引发异常。

  • 一些地图实现对它们可能包含的键和值有限制。 例如,有些实现禁止空键和值,有些实现对其键的类型有限制。

    • 尝试插入不合格的键或值会引发未经检查的异常,通常为 NullPointerException 或 ClassCastException。
    • 尝试查询不合格的键或值的存在可能会引发异常,或者它可能只是返回 false
    • 更一般地,尝试对不合格的键或值执行操作,其完成不会导致不合格的元素插入到映射中,可能会引发异常,也可能会成功,具体取决于实现的选择。 在此接口的规范中,此类异常被标记为“可选”。
  • Collections Framework 接口中的许多方法都是根据 equals 方法定义的。

    • 例如, containsKey(Object key) 方法的规范说:“当且仅当此映射包含键 k 的映射使得 (key==null ? k==null : key.equals(k) )” 本规范不应被解释为暗示使用非空参数键调用 Map.containsKey 将导致为任何键 k 调用 key.equals(k)。
    • 实现可以自由地实现优化,从而避免 equals 调用,例如,通过首先比较两个键的哈希码。 (Object.hashCode() 规范保证哈希码不相等的两个对象不能相等)更一般地说,各种集合框架接口的实现可以自由地利用底层对象方法的指定行为,只要实现者认为合适 .
  • 某些执行映射递归遍历的映射操作可能会失败,但映射直接或间接包含自身的自引用实例除外。 这包括 clone()、equals()、hashCode() 和 toString() 方法。 实现可以选择性地处理自引用场景,但是大多数当前的实现都没有这样做。

  • Map.of、Map.ofEntries 和 Map.copyOf 静态工厂方法提供了一种创建不可修改映射的便捷方法。 这些方法创建的 Map 实例具有以下特点:

    • 它们是不可修改的。 不能添加、删除或更新键和值。 调用 Map 上的任何 mutator 方法将始终导致抛出 UnsupportedOperationException。 但是,如果包含的键或值本身是可变的,这可能会导致 Map 行为不一致或其内容似乎发生变化。

    • 它们不允许空键和值。 尝试使用空键或值创建它们会导致 NullPointerException。

    • 如果所有键和值都是可序列化的,则它们是可序列化的。

    • 他们在创建时拒绝重复的键。 传递给静态工厂方法的重复键会导致 IllegalArgumentException。

    • 映射的迭代顺序未指定并且可能会发生变化。

    • 它们是基于价值的。 程序员应将相等的实例视为可互换的,不应将它们用于同步,否则可能会出现不可预测的行为。 例如,在未来的版本中,同步可能会失败。 调用者不应假设返回实例的身份。 工厂可以自由地创建新实例或重用现有实例。

    • 它们按照“序列化表单”页面上的指定进行序列化。

嵌套类摘要:static interface Map.Entry<K,V>,映射项(键-值对)。

方法

Modifier and Type Method Description
void clear() 从此映射中删除所有映射(可选操作)。
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map) 返回一个不可修改的 Map,其中包含给定 Map 的条目。
static <K, V> Map.Entry<K, V> entry(K k, V v) 返 回包含给定键和值的不可修改 Map.Entry。Set<Map.Entry<K, V>>
boolean equals(Object o) 比较指定的对象与此映射是否相等。
default void forEach(BiConsumer<? super K, ? super V> action) 为此映射中的每个条目执行给定的操作,直到处理完所有条目或该操作引发异常。
V get(Object key) 返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。 default V
int hashCode() 返回此映射的哈希代码值。
boolean isEmpty() 如果此映射不包含键值映射,则返回 true。
Set keySet() 返回此映射中包含的键的 Set 视图。
static <K, V> Map<K, V> of() 返回包含零映射的不可修改映射。
static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2){1~10个} 返回包含{1~10}个映射的不可修改映射。
V put(K key, V value) 将指定值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K, ? extends V> m) 将所有映射从指定映射复制到此映射(可选操作)。
default V putIfAbsent(K key, V value) 如果指定的键尚未与值关联(或映射为 null),则将其与给定值关联并返回 null,否则返回当前值。
V remove(Object key) 从此映射中删除键的映射(如果存在)(可选操作)。
default boolean remove(Object key, Object value) 仅当指定键当前映射到指定值时,才删除指定键的条目。
default V replace(K key, V value) 仅当当前映射到某个值时才替换指定键的条目。
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) 将每个条目的值替换为对该条目调用给定函数的结果,直到处理完所有条目或该函数抛出异常 .
default boolean replace(K key, V oldValue, V newValue) 仅当当前映射到指定值时才替换指定键的条目。
int size() 返回此映射中键值映射的数量。
Collection values() 返回此映射中包含的值的集合视图。
  • default V compute (K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) 尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为 null)
  • default V computeIfAbsent (K key, Function<? super K, ? extends V> mappingFunction) 如果指定的键尚未与值关联(或映射为 null),则尝试使用给定的映射函数计算其值 并将其输入此地图,除非为空。
  • default V computeIfPresent (K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) 如果指定键的值存在且非空,则尝试计算给定键的新映射,并且 它的当前映射值。
  • default V merge (K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) 如果指定的键尚未与值关联或与空值关联,则将其与 给定非空值。

常用方法

增加
  • V put(K key, V value)将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当 m.containsKey(k) 返回 true 时,才能说映射 m 包含键 k 的映射关系)。

    • key - 与指定值关联的键;value - 与指定键关联的值
    • 返回:以前与 key 关联的值,如果没有针对 key 的映射关系,则返回 null。(如果该实现支持 null 值,则返回 null 也可能表示此映射以前将 null 与 key 关联)。
Map<String,Integer> map = new HashMap<>();
System.out.println(map.put("fyz", 1)); //null
map.put("yjk",7);
map.put("xhr",8);
System.out.println(map.put("fyz", 2)); //1
map.put("zsh",9);
System.out.println(map.size()); //4
System.out.println(map); //{xhr=8, fyz=2, yjk=7, zsh=9}
删除

clear() remove(Object key)

map.remove("zsh"); //移除
System.out.println(map);//{xhr=8, fyz=2, yjk=7}
map.clear(); //清空
System.out.println(map); //{}
查看

entrySet() get(Object key) keySet() size() values()

System.out.println(map.entrySet()); //[xhr=8, fyz=2, yjk=7, zsh=9]
System.out.println(map.get("fyz")); //2
System.out.println(map.keySet()); //[xhr, fyz, yjk, zsh]
System.out.println(map.size()); //4
System.out.println(map.values()); //[8, 2, 7, 9]
使用视图遍历
 System.out.println("\n---------keySet()---------");
//keySet()对集合中的key进行遍历查看:
Set<String> set = map.keySet();
for(String s:set){System.out.print(s + "\t");
}
/*---------keySet()---------
xhr fyz yjk zsh */System.out.println("\n---------values()---------");
//values()对集合中的value进行遍历查看:
Collection<Integer> values = map.values();
for(Integer i:values){System.out.print(i + "\t");
}
/*---------values()---------
8   2   7   9   */System.out.println("\n---------get(Object key) keySet()---------");
Set<String> set2 = map.keySet();
for(String s:set2){System.out.print(map.get(s) + "\t");
}
/*---------get(Object key) keySet()---------
8   2   7   9*/System.out.println("\n---------entrySet()---------");
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> e:entries){System.out.print(e.getKey()+"----"+e.getValue() + "\t");
}
/*---------entrySet()---------
xhr----8    fyz----2    yjk----7    zsh----9    */
判断

containsKey(Object key) containsValue(Object value) equals(Object o) isEmpty()

System.out.println(map.containsKey("fyz")); //true
System.out.println(map.containsValue(8)); //false
System.out.println("判断是否为空:"+map.isEmpty()); //判断是否为空:false
Map<String,Integer> map2 = new HashMap<>();
map2.put("fyz", 1);
map2.put("yjk",7);
map2.put("xhr",8);
map2.put("fyz", 2);
map2.put("zsh",9);
System.out.println("判断是否相等  ==  :" + (map==map2)); //判断是否相等  ==  :false
System.out.println("判断是否相等equals:"+map.equals(map2));//true,equals进行了重写,比较的是集合中的值是否一致

java 集合之Interface Map<K,V> HashMap实现类相关推荐

  1. java集合框架07——Map架构与源代码分析

    前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...

  2. java集合课程,I学霸官方免费课程三十三:Java集合框架之Map集合

    I学霸官方免费教程三十三:Java集合框架之Map集合 Map接口 Map集合采用键值对(key-value)的方式存储数据,其中键不可以重复.值可以重复. 常用类有HashMap.TreeMap和P ...

  3. Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等

    1.Set和Map的关系: Set代表一种集合元素无序.不可重复的集合,Map代表一种由多个key-value对组成的集合. Set的集合继承体系: Map关系集合 Map集合的key特征:所有key ...

  4. Java 集合List及Map中forEach()方法

    我们先看一个forEach()方法遍历List集合的例子: //使用com.google.guava包创建集合List<String> list =Lists.newArrayList(& ...

  5. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  6. (Java集合框架)Map集合

    Map集合 概述 现实生活中,常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对象 ...

  7. Java集合篇:Map总结

    相关阅读: Java基础篇:hashCode的作用 Java集合篇:HashMap原理详解(JDK1.7及之前的版本) Java集合篇:HashMap原理详解(JDK1.8) Java集合篇:Hash ...

  8. Java集合(四):Map映射

    集是一个集合,它可以快速的查找现有的元素.但是,要查看一个元素,需要有要查找元素的精确副本.这不是一个非常通用的查找方式.通常,我们知道某些键的信息,并想要查找与之对应的元素.映射表(map)就是为此 ...

  9. Map(String ArrayList(Student))相关操作和遍历和利用Map(k v)统计字母出现次数

    public class MapSaveArrayListDemo {public static void main(String[] args) {//定义一个Mapy集合,且于存放ArrayLis ...

最新文章

  1. mysql实现树状查询_MySQL实现树状所有子节点查询的方法
  2. 砸下数百万美元分析CEO语气,这帮投资者用AI发现了比财报更多的细节
  3. 江苏省计算机学会科学技术奖,孙国梓
  4. Python学习笔记:I/O编程
  5. ModelSim入门及Testbench编写——合理利用仿真才是王道
  6. zsh配置其显示当前文件路径
  7. php soap 两个版本_Ceontos 安装php7以上的版本
  8. Java-时间复杂度和空间复杂度
  9. c3p0配置及其说明
  10. Impala内存优化
  11. Vuebnb 一个用 vue.js + Laravel 构建的全栈应用
  12. 分析表analyze table my_table compute statistics;
  13. 均值(average)与期望(mean)
  14. 别人有公众号你也可以有,5分钟申请公众号详细步骤
  15. struct usb_driver
  16. 境外服务器网站能挂支付宝么,支付宝如何境外改为境内?在国外可以使用吗?...
  17. 参考分享《Python深度学习》高清中文版pdf+高清英文版pdf+源代码
  18. hugeng007_tensorflow_demo
  19. 微信开发者工具-调试器
  20. 快速删除oracle中重复数据,效率高于直接删除数倍.

热门文章

  1. php中如何获得当前周数,PHP中根据输入的周数获取到该周的日期范围
  2. Android:短信的接收
  3. 百度网盘8种批量修改文件名称重命名的方法
  4. Java第一个程序的相关解释
  5. MySQL 异步查询提高查询速度
  6. iOS 调整图片尺寸和大小的两个方法
  7. Qt实现简单拼图游戏
  8. uniapp微信小程序自定义分享按钮
  9. android环信3.0v回撤,环信Android消息回撤
  10. 在电脑中怎样画思维导图