Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)

文章目录

  • 一、JDK9新特性
    • 1. JShell
    • 2. 编译性的常量优化
  • 二、Map
    • 1. HashMap
    • 2. Map接口常用方法
      • 2.1 常用的方法
      • 2.2 遍历键的方法
      • 2.3 Map.Entry

一、JDK9新特性

1. JShell

JShellJava9新更新的一个小工具,是一个交互式解释器
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第1张图片

  • 可以直接写语句
  • 输入jshell进入,输入/exit退出

2. 编译性的常量优化

对于bytecharshort三种类型而言,如果右侧的值,不超过左侧的范围,编译器会自动的添加一个强制类型转换(加在.class文件里)

byte a = 7;  // 右边是int, 被隐含地强制转换为byte

但不是每次都会补的,看下面的代码

byte a = 5;
byte b = 7;

// 运算时强制提升:byte + byte --> int + int = int
byte result1 = a + b;  // 会报错!
byte result2 = 5 + 7;  // 通过
byte result3 = a + 7;  // 会报错!

报错无可厚非,关键是result2通过的原因:在右边全是常量的运算式中,.class文件里存储的直接就是结果12。当有变量时,运行时才会开始计算

二、Map

Map集合是双列集合,单列集合的索引靠的是数字,双列集合靠的是键。
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第2张图片

  • 键值对: 一个键,对应一个值,叫做键值对。由于靠 来索引,所以不允许重复。

1. HashMap

底层: 哈希表
JDK1.8前,哈希表 = 数组 + 单向链表
JDK1.9前,哈希表 = 数组 + 单向链表/红黑树
特点: HashMap是无序的集合

有一个子类LinkedHashMap是有序的

2. Map接口常用方法

Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第3张图片

2.1 常用的方法

  • put: 返回value(如果key不存在返回空,如果存在则覆盖原先值,返回被覆盖的值)
  • remove: 删除value(如果key不存在返回空,如果存在则返回被覆盖的值)
  • size: 得到Map键值对数量
  • get: 得到键所映射的值(如果key不存在返回空,如果存在则返回该值)
  • containsKey: 如果key不存在返回false,如果存在则返回true

尽量使用包装类 来接收,不然如果返回空null 会引发空指针异常
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第4张图片

2.2 遍历键的方法

  1. 使用keySet获得keySet
  2. 遍历这个Set,得到key,再得到键值对

Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第5张图片


  • 也可以把1,2步合并:
    在这里插入图片描述

2.3 Map.Entry

  • Map.Entry:map中有一个内部接口Entry
  • 作用:Map集合一创建,就会自动创建一个Entry对象,用来记录键值对 对象(键与值的映射关系)

Entry对象的方法:

  1. getKey()获得键
  2. getValue()获得值

可以利用以上两个方法进行遍历,当然也可以直接遍历

2.4 遍历键值对

  • entrySet返回由键值对组成的Set
    Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第6张图片

3. HashMap存储自定义类型键值

必须是唯一的,所以需要重写hashCode方法(不写,不会报错)
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第7张图片

4. LinkedHashMap

底层: 哈希表 + 链表

5. HashMap是HashSet的底层

Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第8张图片
通过阅读HashSet源码,我们可以发现,HashSet是一个特殊的HashMap,键就是其元素,值为一个虚拟的Object对象

6. HashTable

特点:

  1. 最早期的双列集合
  2. 不能存储null(除它以外,所有的集合都可以存储null,键和值都能为null
  3. 同步(单线程,线程安全)

这个集合已经不用了

  • HashTableVector一样,被HashMapArrayList取代了。
  • HashTable的子类Properties还在使用,并且它是唯一和IO流相结合的集合

7. 集合总结思维导图

Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第9张图片

三、练习:计算一个字符串中每个字符出现的次数

分析:

  1. 使用Scanner获取用户输入
  2. 使用HashMap来存储字符及对应的数量
  3. 遍历字符,进行判断(可以使用toArray转变成数组来遍历,或使用.charAt()使用索引来遍历)
    if(字符不存在) {字符值=1}
    else {字符值++}

Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第10张图片
在这里插入图片描述

四、JDK9对集合添加的优化

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


List接口Set接口Map接口里增加了一个静态方法of。可以一次性添加多个元素。

  1. 当集合中元素个数 不再改变 时使用
  2. 只适用于以上三个接口,不适用于其实现类
  3. of的返回值是一个不能改变的集合,不能再使用addput等方法
  4. Set接口Map接口在调用时,就不能有重复的元素,否则会调用异常

Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第11张图片

五、Debug追踪

Debug调试程序:
让代码逐行运行,查看代码执行的过程,调试程序中出现的Bug

  • 步骤:
  1. 在行号右边,用左键点击,添加断点(程序执行到断点会停止)
    (断点一般添加在方法名前,和有Bug报错处)
    Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第12张图片
  2. 右键菜单选择运行
    Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第13张图片
  3. 底部出现Debug窗口
    f8 逐行执行程序
    f7 进入到方法中
    shift f8 从方法中跳出
    f9 跳到下一个断点(无断点,程序停止)
    Ctrl f2 退出Debug模式,停止程序
    console按钮 切换到控制台
    Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第14张图片

六、斗地主(有序版)

怎样实现有序呢?可以使用双列,键用来记录顺序

1. 运行文件

运行文件把框架逻辑写入
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第15张图片

2. Card

Card文件,有生成一幅牌,和打乱牌的功能
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第16张图片
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第17张图片

3. fight文件

fight把文件分发给各个玩家,并且返回有序的牌

Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第18张图片
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第19张图片

4. BaseCard

BaseCard用来存储使用牌的对象的属性
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第20张图片
Java语言进阶 #集合 #Day15 #思维导图 #JDK9 #Map #DeBug追踪 #斗地主(有序版)_第21张图片

你可能感兴趣的:(计算机相关,java,Map,JDK9,双列集合)