Map以按键/数值对的形式存储数据,和数组很类似,在数组中存在的索引,它们本身也是对象。

Map的接口

Map---实现Map

Map.Entry--Map的内部类,描写叙述Map中的按键/数值对。

SortedMap---扩展Map,使按键保持升序排列

关于怎么使用,通常是选择Map的子类,而不直接用Map类。

以下以HashMap为例。

public     static     void     main(String     args[])

{

HashMap     hashmap     =     new     HashMap();

hashmap.put("Item0",     "Value0");

hashmap.put("Item1",     "Value1");

hashmap.put("Item2",     "Value2");

hashmap.put("Item3",     "Value3");

Set     set     =     hashmap.entrySet();

Iterator     iterator     =     set.iterator();

while     (iterator.hasNext()

{

Map.Entry     mapentry     =     (Map.Entry)     iterator.next();

System.out.println(mapentry.getkey()     +     "/"     +     mapentry.getValue());

}

}

注意,这里Map的按键必须是唯一的,比方说不能有两个按键都为null。

假设用过它,就会知道它的用处了。

又比方:

Map map = new HashMap();

map.put("Order", (Order) obj);

资料:

Collection容器中包括Set和List接口,Set中又包括HashSet,List中包括LinkedList和ArrayList;单独的Map接口中仅仅有HashMap。

java.util 中的集合类包括 Java 中某些最经常使用的类。 最经常使用的集合类是 List 和 Map。 List 的详细实现包括 ArrayList 和 Vector,它们是可变大小的列表,比較适合构建、存储和操作不论什么类型对象的元素列表。 List 适用于按数值索引訪问元素的情形,当中的数据有顺序且能够反复。而Set中数据无顺序且不能够反复。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作“键”和“值”),当中每一个键映射到一个值。 从概念上而言,您能够将 List 看作是具有数值键的 Map。 而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系。本文将着重介绍核心 Java 发行套件中附带的 Map,同一时候还将介绍怎样採用或实现更适用于您应用程序特定数据的专用 Map。

了解 Map 接口和方法

Java 核心类中有非常多提前定义的 Map 类。 在介绍详细实现之前,我们先介绍一下 Map 接口本身,以便了解全部实现的共同点。 Map 接口定义了四种类型的方法,每一个 Map 都包括这些方法。 以下,我们从两个普通的方法(表 1)開始对这些方法加以介绍。

表 1: 覆盖的方法。 我们将这 Object 的这两个方法覆盖,以正确比較 Map 对象的等价性。equals(Object o)

比較指定对象与此 Map 的等价性

hashCode()

返回此 Map 的哈希码

Map 构建

Map 定义了几个用于插入和删除元素的变换方法(表 2)。

表 2: Map 更新方法: 能够更改 Map 内容。clear()

从 Map 中删除全部映射

remove(Object key)

从 Map 中删除键和关联的值

put(Object key, Object value)

将指定值与指定键相关联

clear()

从 Map 中删除全部映射

putAll(Map t)

将指定 Map 中的全部映射拷贝到此 map

虽然您可能注意到,纵然如果忽略构建一个须要传递给 putAll() 的 Map 的开销,使用 putAll() 通常也并不比使用大量的 put() 调用更有效率,但 putAll() 的存在一点也不稀奇。 这是由于,putAll() 除了迭代 put() 所运行的将每一个键值对加入�到 Map 的算法以外,还须要迭代所传递的 Map 的元素。 但应注意,putAll() 在加入�全部元素之前能够正确调整 Map 的大小,因此如果您未亲自调整 Map 的大小(我们将对此进行简介),则 putAll() 可能比预期的更有效。

查看 Map

迭代 Map 中的元素不存在直接了当的方法。 假设要查询某个 Map 以了解其哪些元素满足特定查询,或假设要迭代其全部元素(不管原因怎样),则您首先须要获取该 Map 的“视图”。 有三种可能的视图(參见表 3)

全部键值对 — 參见 entrySet()

全部键 — 參见 keySet()

全部值 — 參见 values()

前两个视图均返回 Set 对象,第三个视图返回 Collection 对象。 就这两种情况而言,问题到这里并没有结束,这是由于您无法直接迭代 Collection 对象或 Set 对象。要进行迭代,您必须获得一个 Iterator 对象。 因此,要迭代 Map 的元素,必须进行比較烦琐的编码

Iterator keyValuePairs = aMap.entrySet().iterator();Iterator keys = aMap.keySet().iterator();Iterator values = aMap.values().iterator();

值 得注意的是,这些对象(Set、Collection 和 Iterator)实际上是基础 Map 的视图,而不是包括全部元素的副本。 这使它们的使用效率非常高。 还有一方面,Collection 或 Set 对象的 toArray() 方法却创建包括 Map 全部元素的数组对象,因此除了确实须要使用数组中元素的情形外,其效率并不高。

我执行了一个小測试(随附文件里的 Test1),该測试使用了 HashMap,并使用下面两种方法对迭代 Map 元素的开销进行了比較:

int mapsize = aMap.size();Iterator keyValuePairs1 = aMap.entrySet().iterator();for (int i = 0; i < mapsize; i++){   Map.Entry entry = (Map.Entry) keyValuePairs1.next();   Object key = entry.getKey();   Object value = entry.getValue();   ...}Object[] keyValuePairs2 = aMap.entrySet().toArray();for (int i = 0; i < rem; i++) {{   Map.Entry entry = (Map.Entry) keyValuePairs2[i];   Object key = entry.getKey();Profilers in Oracle JDeveloper

Oracle JDeveloper 包括一个嵌入的监測器,它測量内存和运行时间,使您可以高速识别代码中的瓶颈。 我曾使用 Jdeveloper 的运行监測器监測 HashMap 的 containsKey() 和 containsValue() 方法,并不是常快发现 containsKey() 方法的速度比 containsValue() 方法慢非常多(实际上要慢几个数量级!)。 (參见图 1 和图 2,以及随附文件里的 Test2 类)。   Object value = entry.getValue();   ...}

此 測试使用了两种測量方法: 一种是測量迭代元素的时间,还有一种測量使用 toArray 调用创建数组的其它开销。 第一种方法(忽略创建数组所需的时间)表明,使用已从 toArray 调用中创建的数组迭代元素的速度要比使用 Iterator 的速度大约快 30%-60%。 但假设将使用 toArray 方法创建数组的开销包括在内,则使用 Iterator 实际上要快 10%-20%。 因此,假设因为某种原因要创建一个集合元素的数组而非迭代这些元素,则应使用该数组迭代元素。 但假设您不须要此中间数组,则不要创建它,而是使用 Iterator 迭代元素。

表 3: 返回视图的 Map 方法: 使用这些方法返回的对象,您能够遍历 Map 的元素,还能够删除 Map 中的元素。entrySet()

返回 Map 中所包括映射的 Set 视图。 Set 中的每一个元素都是一个 Map.Entry 对象,能够使用 getKey() 和 getValue() 方法(另一个 setValue() 方法)訪问后者的键元素和值元素

keySet()

返回 Map 中所包括键的 Set 视图。 删除 Set 中的元素还将删除 Map 中对应的映射(键和值)

values()

返回 map 中所包括值的 Collection 视图。 删除 Collection 中的元素还将删除 Map 中对应的映射(键和值)

訪问元素

表 4 中列出了 Map 訪问方法。Map 通常适合按键(而非按值)进行訪问。 Map 定义中没有规定这肯定是真的,但通常您能够期望这是真的。 比如,您能够期望 containsKey() 方法与 get() 方法一样快。 还有一方面,containsValue() 方法非常可能须要扫描 Map 中的值,因此它的速度可能比較慢。

表 4: Map 訪问和測试方法: 这些方法检索有关 Map 内容的信息但不更改 Map 内容。get(Object key)

返回与指定键关联的值

containsKey(Object key)

假设 Map 包括指定键的映射,则返回 true

containsValue(Object value)

假设此 Map 将一个或多个键映射到指定值,则返回 true

isEmpty()

假设 Map 不包括键-值映射,则返回 true

size()

返回 Map 中的键-值映射的数目

对使用 containsKey() 和 containsValue() 遍历 HashMap 中全部元素所需时间的測试表明,containsValue() 所需的时间要长非常多。 实际上要长几个数量级! (參见图 1 和图 2,以及随附文件里的 Test2)。 因此,假设 containsValue() 是应用程序中的性能问题,它将非常快显现出来,并可以通过监測您的应用程序轻松地将其识别。 这样的情况下,我相信您可以想出一个有效的替换方法来实现 containsValue() 提供的等效功能。 但假设想不出办法,则一个可行的解决方式是再创建一个 Map,并将第一个 Map 的全部值作为键。 这样,第一个 Map 上的 containsValue() 将成为第二个 Map 上更有效的 containsKey()。

java中的map是什么_Java中Map的使用相关推荐

  1. java map 允许重复_java中key值可以重复的map:IdentityHashMap

    在Java中,有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 ...

  2. java map集合使用_JAVA中Map集合的使用举例

    首先创建一个Emp类,再将几个Emp对象添加到Map集合中. Emp的id作为Map的键,并将id为"005"的对象从集合中删除. package com.han; import ...

  3. java map 自动排序_Java中Map的排序

    Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可 ...

  4. java map传入参数_JAVA中map中参数的添加修改

    Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对. S ...

  5. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国

    学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin 当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用 ...

  6. java 怎么把list流化_Java 中的数据流和函数式编程

    原标题:Java 中的数据流和函数式编程 学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin(作者) 当 Java SE 8(又名核心 Java 8)在 201 ...

  7. Java如何解决mysql读写延迟_java中延迟任务的处理方式

    1.利用延迟队列 延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到-- 应用场景比较多, ...

  8. java中怎么使用json数据_JAVA中使用JSON进行数据传递

    1.是不是只有xml传递数据的技术才是webservice? 可以这么理解.webservice是基于SOAP协议,SOAP协议是基于XML的文本协议.所以webservice可以简单理解为是基于XM ...

  9. java中怎么使用json数据_java中使用Json数据

    PS:11.15看了一下午终于把项目中flexigrid中复杂封装数据类型--->json-->返回前台显示的整个过程:原理看明白了!!! 1.json理解: 步骤1: 就是把后台的Lis ...

  10. java中遍历是什么意思_java中的遍历总结与不同.

    java中的遍历方式: 在java中总会遇到遍历,或许是数组,或许是集合,而数组是有限的长度,但是在集合中呢?理想中只要你的内存足够,就可以存取你想要的任何长度. 但是再说到遍历,可以分为遍历一个有序 ...

最新文章

  1. ACL 2022录用结果出炉:国内多支团队晒“战绩”,清华一实验组18篇入选
  2. 想学python有什么用-Python为什么这么火?学习python有什么用?
  3. js中如何通过身份证号计算出生日期和年龄
  4. js-innerHTML
  5. LINUX之网络编程j简述
  6. 谷歌母公司将分拆出新量子公司,名为“沙箱”
  7. 一个关于反序列化的小问题
  8. ​我们为何需要更安全的系统编程语言?
  9. DataGrip 上手体验,真香!
  10. python输出去掉空格
  11. 总结常见的10种破解密码方法
  12. 市场需求上升,网络安全硬件平台行业逐渐占据主导地位
  13. 中国数码门锁市场趋势报告、技术动态创新及市场预测
  14. cinta作业5:循环群
  15. 编译php7.1.4出现 undefined reference to isfinite
  16. 从零开始的前端—HTML 02
  17. 格式工厂找不到qlv文件无法添加qlv文件 怎么办 解决方法
  18. 孤独的日子,往往是你迅速成长的日子
  19. 南大金陵学院 计算机,以赛促学,南大金陵学子在全国大学生计算机设计大赛摘得一等奖1项和二等奖4项...
  20. 引起网络广播风暴的原因

热门文章

  1. Snmp4j编程简介之一
  2. ffmpeg_struct: AVRational
  3. Java实现大数操作
  4. hive get_json_object json_tuple json解析详解
  5. scala中map与flatMap浅析
  6. php 字符串包含另一个字符串_利用PHP的字符串解析特性Bypass
  7. python兔子编程_少儿编程分享:手把手教你用Python编写兔獾大作战(完)
  8. 图片相似度识别在线_玩转腾讯词向量:词语相似度计算和在线查询
  9. win8/10上的应用程序怎样以兼容模式运行?
  10. php二维数组以某个键进行排序