十、Map集合

10.1、概述

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

接口Map<K, V>

类型参数:

K - 此映射所维护的键的类型

V - 映射值的类型

将键映射到值的对象,一个映射不能包含重复的键:每个键最多只能映时到一个值。

Map接口下的集合与collection接口下的集合的对比:

● Collection中的集合,元素是孤立存在的( 理解为单身) ,向集合中存储元素采用一个个元素的方式存储。

● Map中的集合,元素是成对存在的(理解为夫妻)。 每个元素由健与值两部分组成,通过键可以找对所对应的值。

● Collection中的集合称为单列集合,Map中的集合称为双列集合。

● 需要注意的是,Map中的集合不能包含重复的键,值可以重复:每个键只能对应一个值。

10.2、Map集合特点

Map集合的特点:

① Map集合足个双列集合,一 个元表包含两个值(一个key,一个value)。

② Map集合中的元素,key和value的数据类型可以相同,也可以不同。

③ Map集合中的元素,key是不允许重复的,value是可以重复的。

④ Map集合中的元素,key和value是一对应。

10.3、Map常用子类

通过查看Map接口描述,看到Map有多个子类,HashMap集合、LinkedHashMap集

合等。

HashMap<K,V> :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法

LinkedHashMap<K,V> : HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构 + 链表结构。通过链表结构可以保证元素的存取顺序一致:通过哈希表结构可以保证的键的唯一、不重复,要重写键的hashCode()方法、equals()方法

提示: Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变是<K.V>的数据类型可以相同,也可以不同。

特点:

java. util. HashMap<k, v>集合implements Map<k, v>接口

HashMap集合的特点:

① HashMap集合底层是哈希表:查询的速度特别的快,JDK1.8之前:数组+单向链表,JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8):提高查询的速度

② HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致

java.util.linkedHashMap<k, v>集合extends HashMap<K,V>集合

LinkedHashMap的特点:

① LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)。

② LinkedHashMop集合是一个有序的集合,存储元素和取出元素的顺序是一致的。

10.3、 Map接口中的常用方法

Map接口中定义了很多方法,常用的如下:

public V put(K key, V value);//把指定的键与指定的值添加到Map集合中。

返回值:V

存储键信对的时候。key不重复,返回值V是null

存储键值对的时候,key重复,会使用新的value替换map中重复的value, 返回被替换的value值

public V remove(Object key);//把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。

返回值:V

key存在, v近回被删除的值

key不存在,返回null

public V get(Object key);//根据指定的犍,在Map集合中获取对应的值。

返回值:

key存在,返回对应的value值

​ key不存在,返回null

boolean containsKey(Object key);//判断集合中是否包含指定的键。

包含返回true ,不包含返回false

public Set<K> keySet();//获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet();//获取到Map集合中所有的键值对对象的集合(Set集合)。

10.4、Map集合遍历键找值方式

键找值方式:即通过元素中的键,获取键所对应的值

分析步骤:

① 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keySet()

② 遍历键的Set集合,得到每一个键。

③ 根据键,获取键所对应的值。方法提示: get(K key)

实现步骤:

① 使用Mp集合中的方法keyset(),把Map集合所有的key取出来,存储到一个Set集合中。

② 遍历set集合,获取Map集合中的每一个key。

③ 通过Map集合中的方法get(key),通过key找到value。

举例:

10.5、Entry键值对对象

Map中存放的是两种对象:一种称为key(键),一种称为value(值)。它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对 (Entry)对象中获取对应的键与对应的值。

Entry表示了一对键和值,提供了获取对应键和对应值得方法:

public K getkey();//获取Entry对象中的键。
public V getvalue();//获取Entry对象中的值。

在Map集合中也提供了获取所有Entry对象的方法:

public Set(Map.Entry<K,V>> entryset();//获取到Map集合中所有的键值  对对象的集合(Set集合)。

10.6、Map集合遍历键值对方式

键值对方式;即通过集合中每个键值对(Entry)对象,获取键值对(Entry对象中的键与值。

操作步骤:

① 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。

方法提示: entrySet()。

② 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。

③ 通过键值对(Entry)对象,获取Entry对象中的键与值。

方法提示: getkey() getValue()

图解:


举例:

10.7、HashMap存储自定义类型键值

练习:每位学生(姓名,年龄)都有自己的家庭住址。

那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键,家庭住址作为值。

注意:学生姓名相同并且年龄相同视为同一名学生。

分析:

HashMap存储自定义类型键值

key:String类型

string类重写hashCode方法和equals方法,可以保证key唯一

value :Person类型

value可以重复(同名同年龄的人视为同一个)




10.8、LinkedHashMap

HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么要保证有序,还要速度快怎么办呢?

在HashMap下面有一个子类LInkedHashMap,它是链表和哈希表组合一一个数据存储结构。


10.9、Hashtable集合

java.util.Hashtable<K, V>集合implements Map<K,V>接口

Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢

HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快

HashMap集合:(之前的所有的集合):可以存储null值,null键

Hashtable集合:不能存储null值,null键

Hoashtable和vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap, Arraylist)取代了。

Hashtable的子类Properties依然活跃在历史舞台。

Properties集合是一个唯一和I0流相结合的集合。

10.10、 JDK9对集合添加的优化

通常,在代码中创建一个集合 (例如,List或Set ),并直接用一些元素填充它。实例化集合,几个add方法调用,使得代码重复。

Java 9 ,添加了几种集合工厂方法,更方便创建少量元素的集合、map实例。新的List、 Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。

JDK9的新特性:

List接口、set接口、Map接口:里边增加了一个静态的方法of,可以给集合一次性添加多个元素

static <E> List<E> of (E... elements)

使用前提:

当集合中存储的元素的个数已经确定了,不在改变时使用

注意:

1.of方法只适用于List接口, Set接口,Map接口,不适用于接接口的实现类

2.of方法的返回值是一个不能改变的集合 ,集合不能再使用add, put方法添加元素,会抛出异常

3.Set接口和Map接口在调用of方法的时候,不能有重复的元素.否则会抛出异常

10.11、案例

练习:计算一个字符术中每个字符出现次数

分析:

分析:

1.使用Scanner获取用户输入的字符串

2.创建Mp集合,key是字符串中的字符, value是字符的个数

3.遍历字符串,获取每一一个字符

4.使用获取到的字符,去Map集合判断key是否存在

key存在:

通过字符(key),获取value(字符个数) value++

put(key, value )把新的value存储到Map集合中

key不存在; put(key,1)

5.遍历Map集合,输出结果

代码:

java集合 — — Map集合相关推荐

  1. 1.6 Java遍历Map集合

    Java遍历Map集合的四种方式 Map 集合的遍历与 List 和 Set 集合不同.Map 有两组值,因此遍历时可以只遍历值的集合,也可以只遍历键的集合,也可以同时遍历.Map 以及实现 Map ...

  2. java 定义map集合_java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  3. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

  4. 黑马程序员----------------java基础-----------------Map集合

     ------- <a href="http://www.itheima.com" target="blank">android培训</a ...

  5. 【Groovy】map 集合 ( map 集合操作符重载 | 使用 << 操作符添加一个元素 | 代码示例 )

    文章目录 一.使用 " << " 操作符添加一个元素 二.代码示例 一.使用 " << " 操作符添加一个元素 对 map 集合 使用 ...

  6. 【Groovy】map 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )

    文章目录 一.map 集合 " + " 操作符重载 二.代码示例 一.map 集合 " + " 操作符重载 对 map 集合使用 " + " ...

  7. 【Groovy】map 集合 ( map 集合遍历 | 使用 map 集合的 each 方法遍历 map 集合 | 代码示例 )

    文章目录 一.使用 map 集合的 each 方法遍历 map 集合 二.代码示例 一.使用 map 集合的 each 方法遍历 map 集合 遍历 map 集合 , 可以调用 map 集合的 eac ...

  8. 常见的数据结构:栈 队列 数组 链表 红黑树——List集合 _ HashSet集合、可变参数 collections集合 Map集合

    2021-06-07复习java 一.常见的数据结构 栈(先进后出) 队列 数组 链表 红黑树 二.List集合_介绍&常用方法 ArrayList集合 Linkedlist集合 三.Hash ...

  9. JAVA中Map集合的使用举例

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

  10. [Java基础]Map集合的遍历

    Map集合是Java中非常常用的一个集合,通过Map集合可以实现对数据的快速检索和插入删除等操作:同样对Map集合的遍历也是十分重要的:如果你之前学过C++,那么对于Map的遍历操作可就不能像是C++ ...

最新文章

  1. ext文件系统机制原理剖析
  2. 机器学习(MACHINE LEARNING)MATLAB蚁群算法解决TSP问题
  3. 学python可以做什么知乎-Python学到什么程度可以面试工作?
  4. 信息系统项目管理知识--项目质量管理
  5. 闪电网络介绍以及试用 (上)
  6. 解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码
  7. CMD执行命令出现NOMALY: meaningless REX prefix used以及IDEA提示Cannot run git问题解决
  8. nodejs原始连接mysql
  9. poj3694 Network 求桥边个数[tarjan + LCA]
  10. java 调用nc查询引擎_用友NC系统查询引擎应用心得
  11. 系统安装-U盘安装Windows XP SP3纯净版简述
  12. 京东工业冲刺港交所:年营收141亿 GGV与红杉中国是股东
  13. Benchmarking Learned Indexes(VLDB2021)
  14. TX Text Control文字处理教程(4)标记文本域
  15. MATLAB神经网络43个案例分析
  16. java求水电费_水电煤缴费示例代码
  17. 2022年密码测评理论与关键技术前沿论坛|海泰方圆分享密码应用改造典型方案
  18. 笔记本电脑鼠标自己乱动怎么办?
  19. Proxyfire烈火代理软件与论坛
  20. 关于Kindle,我所知道的

热门文章

  1. 视频损坏修复后卡顿声音画面口型不同步处理解决方法
  2. 爬虫之request模块
  3. 你全都认识吗?菜鸟必看主板接口最全充电
  4. JavaScript 中的内置对象——0606、0607笔记整理
  5. 三分钟看懂什么是边缘计算和云计算
  6. 2023年小程序游戏发展前景分析
  7. 80后还有几人记得游褒禅山记?
  8. 新开淘宝店怎么增加店铺流量方法步骤
  9. 20行Python代码开发植物识别 app!这样还怕认不出菜的尴尬吗?
  10. 安卓Android 直播点赞爱心特效,计时器