JAVA13
Map接口
概述
l Collection每次存储一个对象 单列数据
l Map每次存储两个对象 双列数据
l Map是一个键值对
l 键不允许重复
l 每个键对应一个值
l 使用实现类HashMap 和LinkedHashMap
l 两个泛型
l 图
Map接口中常用的集合概述
HashMap
l 不重复
l 存储和取出顺序不一致
l 方法
- V put(K,V)
a) K是键的对象 V是值的对象
b) 存储的是重复的键时会覆盖
c) 存储的是重复的值可以出现
d) 返回的是值 一般会返回null
e) 只有出现重复键被覆盖的时候会返回覆盖之前的值
- V get(K)
a) 用键获得值
b) 返回的是值的类型
- V Remove(K)
a) 返回被删除之前的值
b) 用键来进行删除
c) 没有这个键会返回null
- Size()
LinkedHashMap
l 不重复
l 有顺序
遍历方式
键找值
l 不能直接遍历 需要使用Set集合
l 用getClass获得类的全名 查看是哪个Set集合
l 示例
内部类实现的 $表示内部类
l Set<K> keySet()
- 返回此映射中包含的键的视图
- 把map的所有键放到Set中
- 步骤
a) 调用map的keySet,所有的键存储到Set集合中
b) 遍历Set集合,获取出Set集合中的所有元素 即map的键
c) 调用map集合方法get 通过键获取到值
- 示例
- 增强for
Map集合的Entry键值对对象
l 把映射关系封装为对象
l 静态内部嵌套接口
l 方法
- Set<Map.Entry<k,y>> entrySet()
- 返回此映射包含的映射关系的set视图
- 返回的是一个个键值对映射关系对象 entry中是键和值
- 举例
- 步骤
- 示例
增强For遍历
l 但是iterable不是遍历的Map 而是遍历的Set 所以Map不能用增强For遍历
l Map没有父接口 不是Iterable的子接口不能用增强For遍历
l 只能间接遍历Map
HashMap
存储和遍历
l 存储自定义对象
l 键的对象是字符串可以保证唯一性
l 示例:
Keyset
entryset
l 存储自定义对象
l 键的对象是Person 存储到键的对象 重写hashCode 和equals 方法
l 示例:
Keyset
EntrySet
LinkedHashMap
特点
l 存储顺序和取出顺序一样
l 示例
HashTable
特点
l 实现了map接口
l 底层数据和HashMap一样
l 线程安全集合运行速度慢
l 从JDK1.2开始 被HashMap取代
l 不允许存储null 值和null键会报空异常 HashMap允许
l HashTable已经不常用 但他的子类properties还在用
静态导入
特点
l JDK1.5新特性
l 减少开发的代码量
l 标准的写法 导入包的时候才能使用
示例
l 在导包时,添加关键字 static
l
方法的可变参数
引入
l 定义一个方法计算3个整数和
l 有定义一个方法计算10个整数和
l 方法参数类型确定 但是方法参数的个数不一定
示例
l 语法格式
数据类型…变量名
l 调用
调用该方法是传递参数 可以任意
l
l 原理
- 本质是一个参数数组
- 打印参数是一个数组
- 空参数组长度是零
遍历
l 增强For 不用修改数组的参数
l 示例
遍历求和
空参求和是零
注意事项
l 一个方法中可变参只能有一个 否则无法辨认传递哪个可变参 即使前面和后面数据类型不一样为了安全也不行,
l 可变参放在参数列表最后面
l 可变参数列型如果是Object 则可以传递任何参数
Collections工具类
特点
l 完全在collection上进行操作
l 都是静态方法
l 折半查找 排序
方法
Sort方法
l 必须对于List集合
l 升序排列
l 因为只能对有索引的集合有效
l 示例
- 定义集合时,扩展性角度看 多态比较好
- 都是小写字母
有一个大写字母 因为大写字母Ascii的值小
BinarySerach
l 对list集合进行二分搜索
l 传递List集合 传递被查找的元素
l 返回被找元素的索引
l 示例
如果查找不存在的数16 返回的是 -(插入点-1) -6
Shuffle
l 对list集合随机排列
l 示例
l 没运行一次就随机排列
翻转
转换为线程安全集合
集合的嵌套
介绍
l 集合内容又是集合
l 分类
l 还有List存List
Map存储Map
l 示例
- 班级是一个map集合 存放学生姓名和学号
- 学校也是有一个map集合 存放班级名字 和 班级这个map
- 存
遍历
Keyset 返回的是存储了所有key的set集合
- 获得存储了学校map的所有key的Set集合
- 第一层遍历 用迭代器遍历存储了学校map的所有key的Set集合
- 利用get(key)方法获取班级map集合
- 获得存储了班级map的所有key的Set集合
- 第二层遍历 用迭代器遍历存储了班级map的所有key的Set集合
- 利用get(key)方法获取每个班级的学生信息
entrySet 返回的是存储了所有key和value映射关系对象的set集合
- 获得存储了学校map映射关系的Set集合
- 第一层遍历 用迭代器遍历存储了学校map映射关系的Set集合
- 利用getKey()和getValue()方法获取学校map集合映射关系的key 班级名 和value 班级map集合
- 获得存储了班级map映射关系的Set集合
- 第二层遍历 用迭代器遍历存储了班级map映射关系的Set集合
- 利用getKey()和getValue()方法获取班级map集合映射关系的key 姓名和value 学号
练习
模拟斗地主发牌
准备牌
l 用一个容器存储一堆字符串
l 由于需要对这对字符串进行洗牌排序 而没有专门牌符字符串排序的办法
l 所以只能用一个个可以进行排序的int 整型数字与牌符一一对应 然后进行排序
l 所以应该用Map容器进行储存这些牌
洗牌
l 洗牌可以用对List集合进行随机排序的shuffle进行洗牌
l 所以需要定义一个List储存Map容器的与牌符一一队应的int整数
l 然后对这些int整数进行随机排序 以达到对牌符进行排序的目的
摸牌
l 摸牌的人实际上有四个 分别是 玩家一 玩家二 玩家三 底牌
l 所以需要准备四个容器
l 有序需要发完进行排序 所以可以把存储了与牌符一一队应的int整数的List集合进行遍历赋值添加给每个容器不包括底牌
l 在这里四个容器用ArrayList就行 因为用工具类排序比数组排序方便
看牌
l 看牌需要用到查表法
l 就是用一个数据在容器中在查找到另一个数据
l 根据玩家和底牌的int整数 就可以找到map集合中是哪张牌
l 在遍历出来就可以达到看牌的效果了