第19章 集合框架(3)-Map接口

1.Map接口概述

Map是一种映射关系,那么什么是映射关系呢?

映射的数学解释

设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在B中有唯一确定的元素b与之对应,则称f为A到B的映射,记作f:A-B.

映射关系(对于A,B集合)

A集合中的每一个元素都可以在B集合中找到唯一的一个值与之对应

严格上来说Map并不是集合,不属于Collection接口,而是两个集合之间的映射关系,每次存储都应该存储A集合中一个元素(Key),B集合中一个元素(Value),我们还是习惯把Map也称之为集合

因为Map接口并没有继承于Collection接口,也没有继承Iterable接口,所以不能直接对Map使用for-each操作,但是如果遍历的话,可以使用Map里面的一些特殊的方法来操作。

存储过程中,key值不能重复,遵循Set集合,Value允许重复,遵循List集合

2.Map中的常用操作方法

Map是一个接口,此类型的常用方法以HashMap类为例,大部分都是通用的,如果需要特别的方法,可以查询api

3.Set和Map之间的关系

Map和Set中有很多相类似的实现类名:

如果集合前缀相同,说明底层算法是一样的,现在单独使用HashSet和hashMap来研究

通过阅读源码,发现相同算法的Set底层用的是相同算法的Map。把Set的集合对象作为Map的Key,再使用一个Object常量为value

因此,更符合我们说的在Map中,所有的key就是一个Set集合

4.Map的实现类和性能分析

Map实现类:

解释:

HashMap:采用哈希表算法,此时Map中的Key不会保证添加的先后顺序,key也不允许重复。

key判断重复的标准是:key1和key2是否equals为true,并且hashCode相等

TreeMap:采用哈希算法:采用红黑树算法,此时Map中的key会按照自然顺序或定制顺序,key也不允许重复

key判断重复的标准是:compareTo/compare的返回值是否为0

LinkedHashMap:采用链表和哈希算法,此时Map中的key会保证先后添加顺序,key不允许重复。

key判断重复的标准和HashMap中的key的标准相同

Hashtable:采用哈希表算法,是hashMap的前身(类似Vector是ArrayList的前身)

在java的集合框架之前,表示映射关系就使用Hashtable

所有的方法都是使用synchronized修饰符,线程安全的,但是性能相对HashMap较低。打死不用

Properties:Hashtable的子类,此时要求key和value都是String类型,用来加载资源文件

一般的,我们定义map,key都使用不可变的类(String等),把key作为value的唯一名称

如何选用

HashMap和TreeMap以及LinkedHashMap都是线程不安全的,但是性能很高。

解决方案Map m = Collections.synchronizedMap(Map对象);

Hashtable类实现线程安全,但是性能低

哈希算法作等值查询最快

树结构算法,作范围查询最快,应用到索引上

5.Map案例(计算字符中字符出现的次数)

import java.util.HashMap;
import java.util.Map; /**
* 计算一个字符串中,每一个字符出现的次数
*/
public class StringCount {
public static void main(String[] args) {
String str = "aqazasawsawsaws";
//把字符串转换为char数组(字符串本质就是char[])
char[] arr = str.toCharArray();
//key:存储字符名,value:存储出现次数
Map<Character, Integer> map = new HashMap<>();
//循环得到每一个字符
for (char ch:arr){
//判断当前字符是否在Map中的key存在
if (map.containsKey(ch)){
//当前Map的key包含该字符,此时取出该value,自增再存进去
Integer old = map.get(ch);
map.put(ch, old+1);
}else {
//当前Map的key不包含该字符,把该字符存到Map中,设置value为1
map.put(ch,1);
}
}
System.out.println(map);//{a=6, q=1, s=4, w=3, z=1}
}
}

6.List和Set以及Map的选用

选用哪一种容器取决于每一种容器的存储特点以及当前业务的需求

List:单一元素集合

允许元素重复/记录元素的添加顺序

Set单一元素集合

不允许元素重复/不及录元素的添加顺序

既要不重复,又要保证先后顺序,可以使用:LinkedHashSet

Map:双元素集合,如果存储数据的时候,还得给数据起一个名称时,此时考虑使用Map

List, Set, Map之间的相互转换:

List<String> list = new ArrayList<>();

把List转换为Set:

Set<String> set = new HashSet<>(list);

把Set转换为List:

List<String> list2 = new ArrayList<>(set);

Map不能直接转换为List或Set,但是Map中的方法可以间接转换

7.List和Map的综合应用

Map在以后运用的非常广泛,比如可以表示javaBean对象,可以作缓存

javaBean对象:多对,属性名=属性值

Map对象;每一个key-value就好比一对属性名=属性值

把Map对象转换为javaBean对象,把javaBean对象转换为Map对象

Set,List,Map三种集合并不都是单独使用的,偶尔也会综合使用

示例:

public class StudentTest {
public static void main(String[] args) {
//使用Set集合存储一个班级学生的名称
Set<String> name1 = new HashSet<>();
name1.add("赵一");
name1.add("李二");
name1.add("张三");
System.out.println(name1);//[李二, 张三, 赵一] Set<String> name2 = new HashSet<>();
name2.add("西门大官人");
name2.add("叶孤城");
name2.add("陆小凤"); //使用Map来存储多个班级的学生
Map<String, Set<String>> classMap = new HashMap<>();
classMap.put("初出茅庐",name1);
classMap.put("登堂入室",name2);
System.out.println(classMap);
//{登堂入室=[西门大官人, 陆小凤, 叶孤城], 初出茅庐=[李二, 张三, 赵一]} Map<String, Set<String>> classMap2 = new HashMap<>();
classMap2.put("初出茅庐",name1);
classMap2.put("登堂入室",name2); //使用List来存储所有学院的学生姓名
List<Map<String ,Set<String>>> school = new ArrayList<>();
school.add(classMap);
school.add(classMap2);
System.out.println(school);
//[{登堂入室=[西门大官人, 陆小凤, 叶孤城], 初出茅庐=[李二, 张三, 赵一]}, {登堂入室=[西门大官人, 陆小凤, 叶孤城], 初出茅庐=[李二, 张三, 赵一]}] }
}

第19章 集合框架(3)-Map接口的更多相关文章

  1. 第18章 集合框架(2)-Set接口

    第18章 集合框架(2)-Set接口 Set是Collection子接口,模拟了数学上的集的概念 Set集合存储特点 1.不允许元素重复 2.不会记录元素的先后添加顺序 Set只包含从Collecti ...

  2. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  3. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  4. 集合框架之Map接口

    Map是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. Map 接口提供三种collection视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序定 ...

  5. JAVA基础第五章-集合框架Map篇

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  6. Java使用实现面向对象编程:第七章集合框架的解读=>重中之重

    对于集合框架,是非常重要的知识,是程序员必须要知道的知识点. 但是我们为什么要引入集合框架呢? 我们之前用过数组存储数据,但是采用数组存储存在了很多的缺陷.而现在我们引用了集合框架,可以完全弥补了数组 ...

  7. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  8. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  9. Java集合框架之Set接口浅析

    Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...

随机推荐

  1. 回溯法求n的全排列

    代码如下: #include <iostream> #include <algorithm> #include <stdio.h> #include <cst ...

  2. 一元多项式的乘法与加法运算(C语言)

    输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方 ...

  3. SOA实践之基于服务总线的设计

    在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...

  4. 手机浏览器不支持 IDBObjectStore.getAll

    最近在学习IndexDB,使用了IDBObjectStore.getAll,发现手机上不支持. 后面,查阅了mdn:  的确是不支持,且可以看到这个函数现在兼容性很差. 解决方法: 1.使用 IDB ...

  5. SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。

    一个sharepoint 2013的普通的列表的自定义新建页面,我在其中新添加几行javascript代码后页面就打不开了.如图所示: 真是一言不合,友谊的页面说打不开就打不开啊.后来慢慢比对发现是因 ...

  6. [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

    [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event   事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...

  7. python之局部变量引用赋值前的结果

    通过正则表达式,实现加减 昨晚在做计算器的时候,被一个BUG搞懵比了.现在再看看,发现我好小白啊~~ #++- num = input("please input:") sa = ...

  8. PHP实现把文本中的URL转换为链接的auolink()

    转载:http://www.jb51.net/article/52916.htm 其实我在<把文本中的URL地址转换为可点击链接的JavaScript.PHP自定义函数>一文中介绍过PHP ...

  9. RMAN-06023: no backup or copy of datafile 1 found to restore

    在ORACLE 10g数据库还原过程遭遇RMAN-06023: no backup or copy of datafile x found to restore,具体情况如下所示 .......... ...

  10. Linux命令学习总结: file命令

    命令简介: 该命令用来识别文件类型,也可用来辨别一些文件的编码格式.它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的. 执行权限 :All User 指令所在 ...