JAVA13

Map接口

概述

l  Collection每次存储一个对象 单列数据

l  Map每次存储两个对象  双列数据

l  Map是一个键值对

l  键不允许重复

l  每个键对应一个值

l  使用实现类HashMap 和LinkedHashMap

l  两个泛型

l  图

 

Map接口中常用的集合概述

HashMap

l  不重复

l  存储和取出顺序不一致

l  方法

  1. V put(K,V)

a)         K是键的对象  V是值的对象

b)         存储的是重复的键时会覆盖

c)         存储的是重复的值可以出现

d)         返回的是值  一般会返回null

e)         只有出现重复键被覆盖的时候会返回覆盖之前的值

  1. V get(K)

a)         用键获得值

b)         返回的是值的类型

  1. V Remove(K)

a)         返回被删除之前的值

b)         用键来进行删除

c)         没有这个键会返回null

  1. Size()

 

 

 

LinkedHashMap

l  不重复

l  有顺序

遍历方式

键找值

l  不能直接遍历 需要使用Set集合

l  用getClass获得类的全名 查看是哪个Set集合

l  示例

 

内部类实现的  $表示内部类

l  Set<K> keySet()

  1. 返回此映射中包含的键的视图
  2. 把map的所有键放到Set中
  3. 步骤

a)         调用map的keySet,所有的键存储到Set集合中

b)         遍历Set集合,获取出Set集合中的所有元素 即map的键

c)         调用map集合方法get 通过键获取到值

  1. 示例

 

 

 

 

  1. 增强for

 

Map集合的Entry键值对对象

l  把映射关系封装为对象

l  静态内部嵌套接口

l  方法

  1. Set<Map.Entry<k,y>>  entrySet()
  2. 返回此映射包含的映射关系的set视图
  3. 返回的是一个个键值对映射关系对象  entry中是键和值
  4. 举例

 

  1. 步骤

 

  1. 示例

 

增强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  定义一个方法计算3个整数和

l  有定义一个方法计算10个整数和

l  方法参数类型确定 但是方法参数的个数不一定

示例

l  语法格式

数据类型…变量名

l  调用

调用该方法是传递参数 可以任意

l   

 

l  原理

  1. 本质是一个参数数组
  2. 打印参数是一个数组

 

  1. 空参数组长度是零

 

遍历

l  增强For 不用修改数组的参数

l  示例

遍历求和

 

空参求和是零

 

注意事项

l  一个方法中可变参只能有一个 否则无法辨认传递哪个可变参 即使前面和后面数据类型不一样为了安全也不行,

l  可变参放在参数列表最后面

l  可变参数列型如果是Object 则可以传递任何参数

Collections工具类

特点

l  完全在collection上进行操作

l  都是静态方法

l  折半查找  排序

方法

Sort方法

l  必须对于List集合

l  升序排列

l  因为只能对有索引的集合有效

l  示例

  1. 定义集合时,扩展性角度看 多态比较好
  2. 都是小写字母

 

有一个大写字母 因为大写字母Ascii的值小

 

BinarySerach

l  对list集合进行二分搜索

l  传递List集合 传递被查找的元素

l  返回被找元素的索引

l  示例

 

如果查找不存在的数16 返回的是 -(插入点-1) -6

 

Shuffle

l  对list集合随机排列

l  示例

 

 

l  没运行一次就随机排列

翻转

 

转换为线程安全集合

 

集合的嵌套

介绍

l  集合内容又是集合

l  分类

 

l  还有List存List

Map存储Map

l  示例

  1. 班级是一个map集合 存放学生姓名和学号
  2. 学校也是有一个map集合 存放班级名字 和 班级这个map

 

遍历

Keyset  返回的是存储了所有key的set集合

  1. 获得存储了学校map的所有key的Set集合
  2. 第一层遍历 用迭代器遍历存储了学校map的所有key的Set集合 
  3. 利用get(key)方法获取班级map集合

 

  1. 获得存储了班级map的所有key的Set集合
  2. 第二层遍历 用迭代器遍历存储了班级map的所有key的Set集合 
  3. 利用get(key)方法获取每个班级的学生信息

 

 

entrySet 返回的是存储了所有key和value映射关系对象的set集合

  1. 获得存储了学校map映射关系的Set集合
  2. 第一层遍历 用迭代器遍历存储了学校map映射关系的Set集合 
  3. 利用getKey()和getValue()方法获取学校map集合映射关系的key 班级名 和value 班级map集合

 

  1. 获得存储了班级map映射关系的Set集合
  2. 第二层遍历 用迭代器遍历存储了班级map映射关系的Set集合 
  3. 利用getKey()和getValue()方法获取班级map集合映射关系的key 姓名和value 学号
  4.  

 

练习

模拟斗地主发牌

准备牌

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  在遍历出来就可以达到看牌的效果了