Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。

Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。本文仅探讨Map接口及其子接口、实现类。

目录

1. Map接口继承树
2. Map接口的基本操作
3. Map的遍历
4. HashMap类和Hashtable类
  4.1 Properties类
  4.2 LinkedHashMap类
5. SortedMap接口及其TreeMap实现类
6. IdentityHashMap类
7. EnumMap类
8. 各种Map实现类选择策略

1. Map接口继承树

2. Map接口的基本操作:

  • V put(K key, V value): 将指定的值与此映射中的指定键相关联(可选操作)。如果此映射中以前包含一个该键的映射关系,则用指定值替换旧值。
  • boolean containsKey(Object key): 如果此映射包含指定键的映射关系,则返回 true
  • boolean containsValue(Object value): 如果此映射为指定值映射一个或多个键,则返回 true
  • Set<Map.Entry<K,V>> entrySet(): 返回此映射中包含的映射关系的 set 视图。
  • V get(Object key): 返回指定key对应的value
  • V remove(Object key): 删除指定key对应的key-value对

3. Map的遍历可以使用Iterator接口或者是foreach循环来实现

参考:Java:集合,数组(Array)、集合(List/Set/Queue)、映射(Map)等的遍历,比如:ArrayList,LinkedList,HashSet,HashMap

4. HashMap类和Hashtable类

  • Hashtable是线程安全的,而HashMap不是线程安全的。
  • Hashtable不允许null作为key和value,而HashMap则可以使用null作为key和value。

不建议使用Hashtable类,它是一个很古老的类,从JDK1.0开始。如果要考虑线程安全,建议使用Collections工具类将HashMap转换为线程安全的。

4.1 Properties类

Properties类从Hashtable类继承而来。额外方法主要有:

  • void load(InputStream inStream): 从属性文件加载key-value对
  • void store(OutputStream out, String comments): 将当前的所有key-value对输出到指定属性文件
  • String getProperty(String key): 获取指定key对应的value值
  • String getProperty(String key, String defaultValue): 用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量。
  • Object setProperty(String key, String value): 调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。

Properties还可以把key-value对以XML文件的格式保存,也可以从XML文件中加载。loadFromXML(InputStream in)及storeToXML(OutputStream os, String comment)。

4.2 LinkedHashMap类

LinkedHashMap从HashMap类继承而来。以链表来维护内部顺序。很多方面跟LinkedHashSet类似。LinkedHashMap它可以记住key-value对的添加时的顺序, 同时避免使用TreeMap时性能受到的影响。

5. SortedMap接口及其TreeMap实现类

类似于SortedSet及TreeSet,TreeMap也可以自定义比较器(Comparable)实现定制排序。它的额外提供的方法也与TreeSet类似,增加了访问第一个、前一个、后一个、最后一个key-value对的方法,并提供了从TreeMap中提取子集的方法。TreeMap不允许null作为key,要不然怎么比较呢?

  • firstEntry()/firstKey()/lastEntry()/lastKey()/higerEntry()/higerKey()/....../subMap(Object fromKey, Object toKey)/...

6. IdentityHashMap类

与HashMap的不同在于,只有两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等;而对于普通HashMap而言,只要key1.equals(key2)且hashCode相同即可。同样允许null值,不能保证顺序。

7. EnumMap类

EnumMap是一个与枚举类一起使用的Map实现。它的key必须是单个枚举类的枚举值。EnumMap不允许使用null作为key,但可作为value。《Effective Java》第33条,用EnumMap代替序数索引,一个稍复杂的应用:

// Using a nested EnumMap to associate data with enum pairs - Pags 163-164
import java.util.*;public enum Phase {SOLID, LIQUID, GAS;public enum Transition {MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID),BOIL(LIQUID, GAS),   CONDENSE(GAS, LIQUID),SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);private final Phase src;private final Phase dst;Transition(Phase src, Phase dst) {this.src = src;this.dst = dst;}// Initialize the phase transition mapprivate static final Map<Phase, Map<Phase,Transition>> m =new EnumMap<Phase, Map<Phase,Transition>>(Phase.class);static {for (Phase p : Phase.values())m.put(p,new EnumMap<Phase,Transition>(Phase.class));for (Transition trans : Transition.values())m.get(trans.src).put(trans.dst, trans);}public static Transition from(Phase src, Phase dst) {return m.get(src).get(dst);}}// Simple demo program - prints a sloppy tablepublic static void main(String[] args) {for (Phase src : Phase.values())for (Phase dst : Phase.values())if (src != dst)System.out.printf("%s to %s : %s %n", src, dst,Transition.from(src, dst));}
}

8. 各种Map实现类选择策略

  1. 正常情况使用HashMap,而不是Hashtable。
  2. 如果考虑排序,那么考虑使用TreeMap。通常TreeMap比HashMap等在插入、删除操作时要慢不少,因为它需要在底层采用红黑树来管理key-value对。
  3. 如果考虑插入时的顺序,那么使用LinkedHashMap是个不错的选择。
  4. 如果想优化垃圾回收,建议使用WeakHashMap实现类(本文未提及);要求key完全匹配(同一对象),则使用IdentityHashMap;还有枚举类不多说了。
  5. 关于null值:Hashtable不允许key为null,也不允许value为null;TreeMap与EnumMap不允许key为null;HashMap及其子类LinkedHashMap,IdentityHashMap允许key为null。

转载于:https://www.cnblogs.com/nayitian/p/3267110.html

Java:集合,Map接口框架图相关推荐

  1. Java集合——Map接口学习总结

    一.HashMap实现类 1.常用方法 增加:put(K key, V value)删除:clear() remove(Object key)修改:查看:entrySet() get(Object k ...

  2. java的Map接口

    java的Set接口 文章目录 java的Map接口 Map的创建 Map的常用方法 Map的遍历 Map的练习 java的Map接口 Map接口存储的是一组键值对象,提供的是key到value的映射 ...

  3. Java集合Map,set, list 之间的转换

    Java集合Map,set, list 之间的转换 前言: 通过思维导图复习联系,看到一个HashMap排序题上机题之后有的一个感想,题目如下,看看你能时间出来么? 已知一个HashMap<In ...

  4. Java集合 —— Map集合

    Collection接口包含List接口与Set接口 --List 元素有序(存储顺序和取出顺序一致),元素可以重复 实现List接口的三个具体类有 ArrayList,vector,LinkedLi ...

  5. java集合 — — Map集合

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

  6. Java集合Collection接口中的常用方法演示

    Java集合Collection接口中的常用方法演示 添加 add(Objec tobj) 和 addAll(Collection coll) 获取有效元素的个数 int size() 清空集合 vo ...

  7. Java从零开始学二十三(集合Map接口)

    一.Map接口 Collection.Set.List接口都属于单值的操作,即:每次只能操作一个对象,而Map与它们不同的是,每次操作的是一对对象,即二元偶对象,Map中的每个元素都使用key à v ...

  8. JAVA集合Connection接口和Map接口常用的类及区别

    JAVA集合详解 文章目录 JAVA集合详解 前言 一.集合是什么? 1. 集合类 2.集合和数组的区别: 二.使用步骤 一.Connection接口(单列集合) 1.List和Set的优缺点 2.总 ...

  9. Java的Map接口,以及Collection和Collections的区别

    一.JAVA集合类(Collection接口.Map接口) java.util.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java ...

  10. Java Annotation认知(包括框架图、详细介绍、示例说明)

    摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...

最新文章

  1. 【swjtu】数据结构实验7_Huffman编码
  2. mysql 几十连接_MySQL挑战:10万连接数
  3. 容器退出时我丢失了数据
  4. UA MATH567 高维统计III 随机矩阵4 欧氏空间上的集网与覆盖
  5. Swift - static和class的使用
  6. 使用Java Stream API将List按自定义分组规则转换成Map的一个例子
  7. mysql 分区索引失效_分区表的本地索引竟然失效了——ORA-01502
  8. Android_项目文件结构目录分析
  9. cannot import name UnrewindableBodyError
  10. win10系统崩溃怎么修复_系统崩溃怎么重装系统图文教程
  11. 带你详细了解机器视觉竞赛—ILSVRC竞赛
  12. 中兴通讯助力MTN建设赞比亚南部首个超100G骨干光网络
  13. 95-847-044-源码-Netty-NettyClient创建
  14. 华为进军美国受挫:竟被美运营商巨头临时放鸽子
  15. 使用 Helm - 每天5分钟玩转 Docker 容器技术(163)
  16. 记账本小程序7天开发记录(第三天)
  17. 一起了解和成为“敏捷个人”(为参加5.29活动预热)
  18. ✿ iBm T60 水货入手了 满意 2005
  19. 八天学会Ansys命令流
  20. 开源软件、自由软件及免费软件的区别

热门文章

  1. FISCO BCOS Solidity 智能合约 返回数组
  2. matlab中制作软件,2020-02-27 MATLAB App Designer——在 App 设计工具中创建辅助函数
  3. java 缓存ech_java ehcache 分布式缓存配置实例 .
  4. 中国海洋大学c语言程序设计,中国海洋大学C语言级期末卷.pptx
  5. Leetcode 207. 课程表(值得一刷的宽搜)
  6. mysql表操作约束_MySQL操作表的约束
  7. SimpleDateFormat线程不安全及解决方式
  8. sql随机取一条数据
  9. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_23-CMS前端页面查询开发-分页查询实现...
  10. 电脑配置Java环境变量之后,在cmd中仍然无法识别