实现类

类型区别

HashMap

最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。

TreeMap

能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。

Hashtable

与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

LinkedHashMap

保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。

四种常用Map插入与读取性能比较

插入10次平均(ms)

  1W 10W 100W
HashMap 56 261 3030
LinkedHashMap 25 229 3069
TreeMap 29 295 4117
Hashtable 24 234 3275

读取10次平均(ms)

  1W 10W 100W
HashMap 2 21 220
LinkedHashMap 2 20 216
TreeMap 5 103 1446
Hashtable 2 22 259

增强for循环遍历

使用keySet()遍历

  1. for (String key : map.keySet()) {
  2. System.out.println(key + " :" + map.get(key));
  3. }

使用entrySet()遍历

  1. for (Map.Entry<String, String> entry : map.entrySet()) {
  2. System.out.println(entry.getKey() + " :" + entry.getValue());
  3. }

迭代器遍历

使用keySet()遍历

  1. Iterator<String> iterator = map.keySet().iterator();
  2. while (iterator.hasNext()) {
  3. String key = iterator.next();
  4. System.out.println(key + " :" + map.get(key));
  5. }

使用entrySet()遍历

  1. Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
  2. while (iterator.hasNext()) {
  3. Map.Entry<String, String> entry = iterator.next();
  4. System.out.println(entry.getKey() + " :" + entry.getValue());
  5. }

性能比较

  1. 增强for循环使用方便,但性能较差,不适合处理超大量级的数据。

  2. 迭代器的遍历速度要比增强for循环快很多,是增强for循环的2倍左右。

  3. 使用entrySet遍历的速度要比keySet快很多,是keySet的1.5倍左右。

Map 排序

HashMap、Hashtable、LinkedHashMap排序

  1. //注:TreeMap也可以使用此方法进行排序,但不推荐。
  2. Map<String, String> map = new HashMap<String, String>();
  3. map.put("b", "b");
  4. map.put("a", "c");
  5. map.put("c", "a");
  6. // 通过ArrayList构造函数把map.entrySet()转换成list
  7. List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
  8. // 通过比较器实现比较排序
  9. Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
  10. @Override
  11. public int compare(Map.Entry<String, String> mapping1, Map.Entry<String, String> mapping2) {
  12. return mapping1.getKey().compareTo(mapping2.getKey());
  13. }
  14. });
  15. for (Map.Entry<String, String> mapping : list) {
  16. System.out.println(mapping.getKey() + " :" + mapping.getValue());
  17. }

TreeMap排序

  1. //TreeMap默认按key进行升序排序,如果想改变默认的顺序,可以使用比较器:
  2. Map<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
  3. @Override
  4. public int compare(String o1, String o2) {
  5. // 降序排序
  6. return o1.compareTo(o2);
  7. }
  8. });
  9. map.put("b", "b");
  10. map.put("a", "c");
  11. map.put("c", "a");
  12. for (String key : map.keySet()) {
  13. System.out.println(key + " :" + map.get(key));
  14. }

通用排序,接VALUE

  1. Map<String, String> map = new TreeMap<String, String>();
  2. map.put("b", "b");
  3. map.put("a", "c");
  4. map.put("c", "a");
  5. // 通过ArrayList构造函数把map.entrySet()转换成list
  6. List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
  7. // 通过比较器实现比较排序
  8. Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
  9. @Override
  10. public int compare(Map.Entry<String, String> mapping1, Map.Entry<String, String> mapping2) {
  11. return mapping1.getValue().compareTo(mapping2.getValue());
  12. }
  13. });
  14. for (String key : map.keySet()) {
  15. System.out.println(key + " :" + map.get(key));
  16. }

常用API

方法 描述
clear() 从 Map 中删除所有映射
remove(Object key) 从 Map 中删除键和关联的值
put(Object key, Object value) 将指定值与指定键相关联
putAll(Map t) 将指定 Map 中的所有映射复制到此 map
entrySet() 返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素
keySet() 返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值)
values() 返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值)
get(Object key) 返回与指定键关联的值
containsKey(Object key) 如果 Map 包含指定键的映射,则返回 true
containsValue(Object value) 如果此 Map 将一个或多个键映射到指定值,则返回 true
isEmpty() 如果 Map 不包含键-值映射,则返回 true
size() 返回 Map 中的键-值映射的数目
Modifier and Type Method and Description
void clear()

从该地图中删除所有的映射(可选操作)。
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 ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 null
default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。
boolean containsKey(Object key)

如果此映射包含指定键的映射,则返回 true
boolean containsValue(Object value)

如果此地图将一个或多个键映射到指定的值,则返回 true
Set<Map.Entry<K,V>> entrySet()

返回此地图中包含的映射的Set视图。
boolean equals(Object o)

将指定的对象与此映射进行比较以获得相等性。
default void forEach(BiConsumer<? super K,? super V> action)

对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
V get(Object key)

返回到指定键所映射的值,或 null如果此映射包含该键的映射。
default V getOrDefault(Object key, V defaultValue)

返回到指定键所映射的值,或 defaultValue如果此映射包含该键的映射。
int hashCode()

返回此地图的哈希码值。
boolean isEmpty()

如果此地图不包含键值映射,则返回 true
Set<K> keySet()

返回此地图中包含的键的Set视图。
default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)

如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。
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 boolean replace(K key, V oldValue, V newValue)

仅当当前映射到指定的值时,才能替换指定键的条目。
default void replaceAll(BiFunction<? super K,? super V,? extends V> function)

将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。
int size()

返回此地图中键值映射的数量。
Collection<V> values()

返回此地图中包含的值的Collection视图。

已知实现类

  1. AbstractMap Attributes AuthProvider ConcurrentHashMap ConcurrentSkipListMap EnumMap HashMap Hashtable IdentityHashMap LinkedHashMap PrinterStateReasons Properties Provider RenderingHints SimpleBindings TabularDataSupport TreeMap UIDefaults WeakHashMap

.

java Map类的更多相关文章

  1. Java Map类常用方法

    关于Map集合中常用的方法: void clear(); 清空Map boolean containsKey(Object key); 判断Map中是否包含这样的key boolean contain ...

  2. 探究Java中Map类

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

  3. Java工具类——通过配置XML验证Map

    Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...

  4. Java Map hashCode深究

    [Java心得总结七]Java容器下——Map 在自己总结的这篇文章中有提到hashCode,但是没有细究,今天细究整理一下hashCode相关问题 1.hashCode与equals 首先我们都知道 ...

  5. java.map使用

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

  6. 漫谈 Java 实例化类

    Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢? 经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉. 怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展 ...

  7. Java Map 简介

    AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, H ...

  8. Java Map 集合类简介

      作者:Jack Shirazi 了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试 · Oracle ...

  9. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

随机推荐

  1. MySQL数据库入门常用基础命令

    MySQL数据库入门———常用基础命令      数据——公司的生命线,因此在大多数的互联网公司,都在使用开源的数据库产品,MySQL也因此关注度与使用率非常的高,所以做为运维的屌丝们,掌握它的一些基 ...

  2. vue中如何开发插件

    1.vue中提供了install方法用来开发插件 官方:Vue.js 的插件应该有一个公开方法 install.这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象. 2.我的插件目 ...

  3. python-装饰器1

    python-装饰器1 定义本质就是函数,(装饰其他函数)就是为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码2.不能修改被装饰的函数的调用方式 def logger(): print(' ...

  4. suse清除kthrotlds木马病毒

    一.服务器感染了kthrotlds挖矿病毒 [root@51yt bin]# cd /bin/ [root@51yt bin]# wget https://busybox.net/downloads/ ...

  5. SSH整合——登录模块

    1.导包——参照我的GitHub Hibernate hibernate/lib/required hibernate/lib/jpa 数据库驱动 Struts2 struts-blank.war/W ...

  6. 将临时全局表中的符合字段导入test数据库中

    --表1 开户级别表 insert into test.dbo.crm_m_cust_summary(CUST_CERT_N O,ASSETAMT_GRADE_CD)select cust_no,cu ...

  7. .align 5 .MACRO .ENDM .word

    ARM的.align 5就是2的5次方对齐,也就是4字节对齐 .macro <name> {<arg_1} {,<arg_2>} … {,<arg_N>} 定 ...

  8. java模拟验证码生成

    设计思想 第一步:随机生成字符串 第二步:用户输入字符串 第三步:将两个字符串转化为同一类型 第四步:比较是否相同 第五步:输出结果 程序流程图 程序源代码 /*2017/10/7 王翌淞 验证码模拟 ...

  9. requests中text,content,json之间的区别

    response.text : 返回一个字符串\n",content : 返回二进制\n",json() : 返回对象"

  10. 数据库基本概念及Oracle基本语句

    一.数据库分类 通常是按照数据模型的特点将传统数据库系统分成网状数据库.层次数据库和关系数据库三种. 1.网状数据库 顾名思义,网状数据库采用的是以记录类型为结点的网状数据模型,是一种导航式(Navi ...