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

一、JDK9新特性

1. JShell

JShellJava9新更新的一个小工具,是一个交互式解释器
在这里插入图片描述

  • 可以直接写语句
  • 输入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集合是双列集合,单列集合的索引靠的是数字,双列集合靠的是键。
在这里插入图片描述

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

1. HashMap

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

有一个子类LinkedHashMap是有序的

2. Map接口常用方法

在这里插入图片描述

2.1 常用的方法

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

尽量使用包装类 来接收,不然如果返回空null 会引发空指针异常
在这里插入图片描述

2.2 遍历键的方法

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

在这里插入图片描述


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

2.3 Map.Entry<K, V>

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

Entry对象的方法:

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

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

2.4 遍历键值对

  • entrySet返回由键值对组成的Set
    在这里插入图片描述

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

必须是唯一的,所以需要重写hashCode方法(不写,不会报错)
在这里插入图片描述

4. LinkedHashMap

底层: 哈希表 + 链表

5. HashMap是HashSet的底层

在这里插入图片描述
通过阅读HashSet源码,我们可以发现,HashSet是一个特殊的HashMap,键就是其元素,值为一个虚拟的Object对象

6. HashTable

特点:

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

这个集合已经不用了

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

7. 集合总结思维导图

在这里插入图片描述

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

分析:

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

在这里插入图片描述
在这里插入图片描述

四、JDK9对集合添加的优化

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


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

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

在这里插入图片描述

五、Debug追踪

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

  • 步骤:
  1. 在行号右边,用左键点击,添加断点(程序执行到断点会停止)
    (断点一般添加在方法名前,和有Bug报错处)
    在这里插入图片描述
  2. 右键菜单选择运行
    在这里插入图片描述
  3. 底部出现Debug窗口
    f8 逐行执行程序
    f7 进入到方法中
    shift f8 从方法中跳出
    f9 跳到下一个断点(无断点,程序停止)
    Ctrl f2 退出Debug模式,停止程序
    console按钮 切换到控制台
    在这里插入图片描述

六、斗地主(有序版)

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

1. 运行文件

运行文件把框架逻辑写入
在这里插入图片描述

2. Card

Card文件,有生成一幅牌,和打乱牌的功能
在这里插入图片描述
在这里插入图片描述

3. fight文件

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

在这里插入图片描述
在这里插入图片描述

4. BaseCard

BaseCard用来存储使用牌的对象的属性
在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章