文章目录

  • Map介绍
  • 核心Map
    • 内部哈希:哈希映射技术
      • 常用方法
    • 遍历Map

Map介绍

java.util中的集合类包含Java中某些最常用的类,其中最常用的集合类就是List和Map.
并且在集合框架中,Map是和Collection并列的存在,而List只是Collection的一个实现子类。Map和Collection虽然并列,但有很多的不同,Map是双列集合,而Collection只是单列集合
在Map中,储存的是键值对。即Key(键)和Value(数值)。键和值存在映射关系。

关于Map中的键和值:Map中的键可以理解为List中下标的存在,只不过List中的下标是整数,而Map中的键(Key)是任意类型的对象。List中的下标不能相同,否则无法对应到数据上,但储存的值可以相同。Map也是类似,键不可以相同,但储存的值(value)可以相同。
并且 Map中储存必须是成对储存,即一个键和一个值构成一个元素,且该元素存的是对象,确切的说是引用对象的地址。基本数据类型在存入的时候都会转化成相对应的包装类,而引用类型储存的是地址。

核心Map

Map的集合框架如下:

从图我们可以得知:
Map被AbstractMap实现,而HashMap和TreeMap是AbstractMap的子类。
一般情况下我们常用的就是HashMap和TreeMap、Hashtable这几个。

HashMap

最常用的Map,采用哈希表实现,所以无序

TreeMap

底层是二叉树数据结构。可以对map集合中的键进行排序,在排序时,会用到Comparable和Comparator,通过return 0,来判断键的唯一性。

LinkedHashMap

这里是引用

Java自带了各种Map类。这些Map类可归为三种类型:
通用Map

用于在应用程序中管理映射,通常在java.util程序包中实现

Hashmap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap、CoucurrentHashMap
专用Map

通常我们不必亲自创建此类Map、而是通过某些类对其进行访问

java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults
自行实现Map
一个用于帮助我们实现自己的Map类的抽象类 AbstractMap
AbstractMap已经实现了两个子类HashMap、TreeMap。
而Hashtable直接实现了Map.

类型区别

HashMap: 最常用的Map,它根据键的HashCode值储存数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多允许一条记录的键为Null(多余会覆盖),允许多条记录的值为Null.(即键不能重复,值可以重复).非同步。
TreeMap:HashMap的key值是无序的,而实现了SortedMap接口的具体实现类TreeMap会对key值进行排序。TreeMap的底层是红黑树。
TreeMap底层
能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null.非同步的。
Hashtable: 与HashMap类似,不同的是:key和value的值不允许为null,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。
LinkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。

内部哈希:哈希映射技术

几乎所有的通用Map都使用哈希映射。这是一种将元素映射到数组的非常简单的 机制。
下面一起了解哈希映射的工作原理,以便充分利用Map.
哈希映射结构由一个储存元素的内部数组组成。由于内部采用数组储存,因此必然存在一个用于确定任意键访问数组的索引机制。实际上,该机制需要提供一个小于数组大小的整数索引值。该机制称作哈希函数。在Java基于哈希的Map中,哈希函数将对象转换为一个适合内部数组的整数。

常用方法

添加元素:put()方法
//Collection添加元素用的是add()方法
putAll()向map集合中添加指定集合的所有元素
删除元素:remove()方法 删除关联对象,指定Key对象
清空集合:clear()方法
获取元素:
get(key) 方法
返回指定键对应的对象,可以用于判断键是否存在,如果键不存在,返回null判断:
boolean isEmpty()  空返回true 否则false
boolean containsKey(key)  判断map集合中是否包含指定的key
boolean containsValue(value) 判断map集合中是否包含指定的value长度:
size() entrySet() 将map返回到Set集合中,以key=value的形式int hashCode() 返回map集合的哈希码值keySet() 返回map中所有的键到set集合中Collection<V> values() 返回map中所有的value到一个Collection集合
Collection<Integer> col=map.values();

代码示例:

public static void main(String[] args) {Map<String,String> map=new HashMap<>();map.put("1","唐僧");map.put("八戒","臼齿");map.put("沙僧","行李");System.out.println(map.put("孙悟空","金箍棒"));System.out.println(map.put("孙悟空","定海神针"));//System.out.println(map.toString());//Set<K> KeySet(返回一个Set集合) 包含map集合中全部的key值Set<String> keys=map.keySet();for(String s: keys){System.out.print(s+" ");}for(String s: map.keySet()){System.out.println(s);}//Collection<V> values() 返回一个Collection集合,包含map集合中全部的value值。Collection<String> values=map.values();for(String s:values){System.out.println(s);}//Set<Map.Entry<K,V>> entrySet()返回一个Set集合,包含map集合中全部的映射关系Set<Map.Entry<String,String>> entrySet=map.entrySet();for(Map.Entry<String,String> s:entrySet){String key=s.getKey();String value=s.getValue();System.out.println(key+"="+value);}}

Map中没有直接取出元素的方法,而是将Map中的元素先转成Set集合,然后通过迭代获取元素。

遍历Map

第一种方式:根据键找值,使用keySet()
将Map转成Set集合,Set集合中的每一个元素就是Map集合中的所有的键,再通过get方法获取键对应的值。

public static void main(String[] args) {Map<String,String> map=new HashMap<>();map.put("孙悟空","金箍棒");map.put("唐僧","袈裟");map.put("八戒","九齿");map.put("沙僧","行李");//如何遍历一个Map集合?//用set<K,V> keySet() 获取map中所有的键的set集合,然后通过键获得值//使用增强for(其实就是foreach循环)Set<String> key=map.keySet();for(String s:key){System.out.println(map.get(s));}//使用迭代器Set<String> keys=map.keySet();Iterator<String> it=keys.iterator();while(it.hasNext()){System.out.println("键:"+it.next());System.out.println("值:"+map.get(it.next()));}}

第二种方式:根据键值对对象找键和值

public static void main(String[] args) {Map<String,String> map=new HashMap<>();map.put("孙悟空","金箍棒");map.put("唐僧","袈裟");map.put("八戒","九齿");map.put("沙僧","行李");//先获得键值对对象(entry),然后获得该对象的键和值//entry:键值对对象//entrySet:键值对的 Set集合//foreach循环Set<Map.Entry<String,String>> entrySet=map.entrySet();for(Map.Entry<String,String> s:entrySet){System.out.println("键:"+s.getKey());System.out.println("值:"+s.getValue());}//迭代器实现Set<Map.Entry<String,String>> eSet=map.entrySet();Iterator<Map.Entry<String,String>> it=eSet.iterator();while(it.hasNext()){Map.Entry<String,String> entry=it.next();System.out.println(entry.getKey());System.out.println(entry.getValue());}}

Java~Map集合详解相关推荐

  1. Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)

    关注微信公众号:CodingTechWork,一起学习进步. Map Map集合介绍   Map(也称为字典.关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何 ...

  2. java map集合详解_JAVA干货:Map 集合详解

    java.util.Map集合 Map集合的特点: 1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value) 2.Map集合中的元素,key和value的数据类型可以相同,也可以 ...

  3. Kotlin 基础——Map集合详解

    Kotlin基础--Map集合详解 一.声明和创建Map集合 二.使用Map的方法 三.遍历Map四种方式 四.可变的Map Kotlin的Map集合用于保存key-value对,其也被分为可变的和不 ...

  4. 集合 (二) ----- Map集合详解

    相关文章: <集合 (一) ----- 集合的基本概念与Collection集合详解> <集合 (二) ----- Map集合详解> 文章目录 Map集合详解 一.Map集合基 ...

  5. java 中map_Java Map集合详解

    Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象.其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素 ...

  6. java的Map集合 详解Map集合

    一.Map集合的特点: Map集合的特点: 1.Map是一个双列集合,一个元素包含两个值(一个key,一个value) 2.Map集合中的元素,key和value的数据类型可以相同,也可以不同 3.M ...

  7. Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    关注微信公众号:CodingTechWork,一起学习进步. Set集合介绍 Set集合的概念   Set集合类似于一个容器,程序把很多对象保存到Set集合中,Set集合对添加顺序不记录,当有重复的对 ...

  8. java常用集合详解

    文章目录 一.常用集合大纲 1.常用集合框架及介绍 2.集合和数组的区别 二.Collection 集合(接口) 三.List集合(接口) 1.存储遍历方式 2.ArrayList(实现类) 3.Li ...

  9. Java Map 接口详解

    软件包:java.util 接口:Map 描述:将键映射到值的对象 一,Map与Collection Collection接口:定义了单列集合规范,集合中的元素是独立存在的,每次存储一个(单个)元素 ...

最新文章

  1. 【算法】论平衡二叉树(AVL)的正确种植方法
  2. Android --- Android Studio 内无法直接运行 main 方法
  3. redis linux安装配置,linux下安装配置单点redis
  4. Hulu CEO预计网站本年营收将达5亿美元
  5. Python程序每日一练习
  6. 计算机操作系统英文版课后答案,计算机操作系统(第3版)课后习题答案(完整版)...
  7. react apollo_Apollo GraphQL:如何使用React和Node Js构建全栈应用
  8. 带你读Paper丨分析ViT尚存问题和相对应的解决方案
  9. java对字符串快查找_字符串快速查找 - Trie算法
  10. 认知心理学告诉你什么才是高效学习
  11. j2ee中文编码问题的解决方法(ISO8859_1、GBK、UTF-8)
  12. 博图安装msi失败_博途,V13,安装出现如此问题如何解决
  13. 老外用VB6写的Windows驱动备份软件
  14. Maven有哪些优点和缺点
  15. 计算机毕业设计Java-ssm办公自动化管理系统源码+系统+数据库+lw文档
  16. echart旭日图_echarts之用饼图制作带labelline的旭日图(一)
  17. 第四章(1.2)机器学习——在web攻击检测中的应用实践
  18. 普及!cmnet、cmiot还傻傻分不清楚?APN设置看看这一篇就够了!!
  19. STK9中根据TLE数据插入卫星对象
  20. 【项目管理】prince2框架知识体系

热门文章

  1. 【有限元分析】卷扬机卷筒心轴静力学分析
  2. 抖音壁纸表情包小程序流量主收益怎么样?
  3. Android studio 隐藏小刘海(标题栏)
  4. 最值得推荐的任务悬赏平台
  5. uniapp篇-解决showToast字数超过7个显示问题
  6. 第三方框架-PDFViewer的使用
  7. Gem5 Fullsystem,Spec2017
  8. OSG 渲染剖析 之 Geometry 的 VBO生成
  9. 为什么拉屎是臭的 拉的屎很臭是什么原因
  10. 如何为元组中的每个元素命名,提高程序可读性