当前课程知识点:Java程序设计 > 第六章 对象群体的组织 > 6.7-Map接口及其实现 > Map接口及其实现
大家好
欢迎回来继续学习Java语言程序设计
这一节我们来学习Map接口
以及它的主要实现的类
Map接口代表的是这样一类集合
它们是用来存储一个个键值对
这样的数据群体的
通常如果我们希望
能通过关键字值
快速查找到它对应的
数据内容的时候
我们就会使用Map
Map接口它的抽象方法
主要有查询方法和修改方法
实现Map的两个主要的类
有HashTable和HashMap
HashTable也是老的Java版本里头的类型
那么现在更多的会使用HashMap
Map接口的查询方法
像这个size是返回Map中的元素个数
isEmpty判断是否空
containsKey判断参数
这个Key是否包含在这个Map里面
是否是Map中的一个关键字
containsValue判断这个参数
给出的这个Value值
是否包含在Map里面
作为某一个项的一个值
像get它的参数是给出了一个key
一个关键字
那么也就是要根据这个关键字
到Map中去查找它对应的值
并且返回这个值
这个Values方法
我们看到它返回一个Collection
它返回了包含所有值的
这么一个Collection对象
也就是把值全部都取出来了
keySet方法是返回
包含其中所有关键字
所有key的这么一个集合对象
一个Set对象
entrySet就返回包含Map中
所有项的这么一个Set对象
每个项它都包含
一个键和一个值
Map接口的修改方法
像包括这种put
它会将参数给的这个键和值
这一对数据
作为一个项添加到Map里面去
添加进去的时候
这个key不能
跟原来里面的key重复
而如果重复了呢
那就是用新的值
去取代原来在这个Map中
这个key对应的值
也就是说在这个Map中
key肯定必须是唯一的
好
putAll它是将这个参数Map对象
里面的所有项都加到消息接受者
也就是当前对象里面去
remove是按照指定的参数
给的这个关键字去找到相应的项
把那个项从Map里面删除
clear就是清空
删除Map中的所有的项
实现Map的两个非常常用的类
一个是HashTable一个是HashMap
HashTable是老版本Java里面的东西
现在用HashMap会更多一些
现在我们来简单的了解一下
数据结构中关于哈希表的这种概念
什么是哈希表
哈希表它存储对象的方式
比较特殊
也就是说在哈希表中
对象的存储位置
和对象它的关键字值之间
有一种特殊的对应关系
那么我们称这种特殊的对应关系
为哈希函数
也就是说我们给定一个关键字值
用哈希函数就可以计算出
它对应的存储位置
这样的话在我们向哈希表中
插入数据的时候
或者查找数据的时候
就都比较方便
不管你数据规模多大
只要你这个哈希函数
做的比较好比较合理
那它的查找时间就不随着
你数据规模的增大而增大
什么是说哈希函数
设计得比较好比较合理
就是说你得经过
这个哈希函数的计算以后
根据这个关键字的值
算出来它的存储位置
在当前的容器中
它应该是一个均匀分布的
应该尽量减少冲突
什么是冲突
就是不要说
我有两个不同的关键字值
你拿哈希函数一算
给我定位到同一个位置了
那这不就发生冲突了吗
当然绝对不发生冲突
有的时候是不可能的
为什么
有的时候如果为了节省空间
我们的容量要比较少
数据又比较多
这时候那发生冲突就成了必然的
那数据结构里面对发生冲突以后
怎么解决也有相应的
冲突的处理的策略
在这儿我们就不仔细去讲了
接下来我就来给大家介绍在Java中
我们会涉及到的哈希表的
几个主要的概念
那了解这些概念以后
对于我们理解这个哈希表
能够在程序中很好的应用它
是会有所帮助的
首先就是容量的概念
容量表示这个哈希表中
能够容纳多少个项
哈希表的容量它不是固定的
随着对象的加入在需要的时候
容量是可以自动扩充的
在数据结构中
哈希表这种结构
它可以用来存储一个一个的数据
一个个对象比如说
当然了HashMap
就可以存储用散列方式
来存储和定位数据的
这样的Map这样的映射
那么如果说是普通的集合
它的对象位置的定位
用哈希函数来定位的话
那么这个key关键字
可以是对象的本身
也可以是对象的某一个部分
比如说某一个属性
如果你存储的是HashMap
是映射的话
那么映射里面的每一个项
都有一个关键字和一个值
那么关键字就指的是那个关键字
哈希码的概念什么
我们如果要将对象
存到哈希表的结构中
那就需要将关键字
映射到一个整型的数据
其实这个整型的数据
就对应于对象
在这个表中的存储位置
那么这个整型数据
就称为这个关键字的哈希码
通常我们会用
这个关键字作为参数
调用哈希函数计算出哈希码来
那么哈希函数就是用来
返回对象的哈希码的
在映射在Map中我们有项这个概念
如果是哈希Map
那么它的每一个项都有两个域
一个是关键字还有一个是值
key和value都可以
是任意类的Object的对象
任意的Object对象
但是它都不能为空
关键字都应该是唯一的
在哈希表中还有
一个装填因子的概念
装填因子其实
就是表示了这个表中的
将要填入的项数
也就是你要存储多少数据吧
以及表的容量
它们之间的一个比值
如果说这个装填因子越大
就说明你要存的项数越多
容量越小
那么装填因子太大了
那肯定你存的项数都超过容量了
那肯定就会发生冲突
就要用一些解决冲突的算法
比如说链地址法
二次散列法去解决冲突
如果说你装填因子比较小
项数少而容量大
这种情况下
只要你的哈希函数
设计得比较好
那么就很少发生冲突
这样的存取效率就会更高一些
那接下来我们就来了解一下
在HashMap中都有哪些有用的方法
首先我们来看
它有这样一些不同的
承载形式的构造方法
默认的构造方法
它默认的容量是16
默认的装填因子是0.75
也可以在构造方法中我们给出容量
那它默认的装填因子是0.75
或者我们在构造方法中
既给出容量也给出
指定的装填因子也是可以的
还有可以用参数M
这个Map为初始值
来构造新的哈希Map
哈希Map中还有很多
其他的有用的方法
同样因为时间关系
我们就不在这个课程里
对这些方法
进行逐一的分析和讲解了
建议大家去查阅API文档
在这一节我们
简单的了解了一下Map接口
以及实现Map接口的
HashMap,HashTable
为了能让大家能够
对HashMap,HashTable
有比较清楚的了解
我对哈希表的这个结构的概念
在这里做了非常简单的一个介绍
那么大家要了解
更多的关于哈希表的内容
建议还是要
去学一下数据结构的课
对于哈希Map的更多
有用的函数的详细解释
希望大家去参考API的文档
这一节内容就是这些
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件