一、JDK9新特性
1. JShell
JShell
是Java9
新更新的一个小工具,是一个交互式解释器
- 可以直接写语句
- 输入
jshell
进入,输入/exit
退出
2. 编译性的常量优化
对于byte
、char
、short
三种类型而言,如果右侧的值,不超过左侧的范围,编译器会自动的添加一个强制类型转换(加在.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 遍历键的方法
- 使用
keySet
获得key
的Set
- 遍历这个Set,得到
key
,再得到键值对
- 也可以把1,2步合并:
2.3 Map.Entry<K, V>
- Map.Entry<K, V>: 在
map
中有一个内部接口Entry<K, V>
- 作用: 当
Map
集合一创建,就会自动创建一个Entry
对象,用来记录键值对 对象(键与值的映射关系)
Entry对象的方法:
getKey()
获得键getValue()
获得值
可以利用以上两个方法进行遍历,当然也可以直接遍历
2.4 遍历键值对
entrySet
返回由键值对组成的Set
3. HashMap存储自定义类型键值
键 必须是唯一的,所以需要重写hashCode
方法(不写,不会报错)
4. LinkedHashMap
底层: 哈希表 + 链表
5. HashMap是HashSet的底层
通过阅读HashSet
源码,我们可以发现,HashSet
是一个特殊的HashMap
,键就是其元素,值为一个虚拟的Object对象
6. HashTable
特点:
- 最早期的双列集合
- 不能存储
null
(除它以外,所有的集合都可以存储null
,键和值都能为null
) - 同步(单线程,线程安全)
这个集合已经不用了
HashTable
和Vector
一样,被HashMap
和ArrayList
取代了。HashTable
的子类Properties
还在使用,并且它是唯一和IO
流相结合的集合
7. 集合总结思维导图
三、练习:计算一个字符串中每个字符出现的次数
分析:
- 使用
Scanner
获取用户输入 - 使用
HashMap
来存储字符及对应的数量 - 遍历字符,进行判断(可以使用
toArray
转变成数组来遍历,或使用.charAt()
使用索引来遍历)
if(字符不存在) {字符值=1}
else {字符值++}
四、JDK9对集合添加的优化
Java 9
,添加了几种集合工厂方法,更方便创建少量元素的集合、map
实例。新的List
、Set
、Map
的静态工厂方法可以更方便地创建集合的不可变实例。
List接口
、Set接口
和Map接口
里增加了一个静态方法of
。可以一次性添加多个元素。
- 当集合中元素个数 不再改变 时使用
- 只适用于以上三个接口,不适用于其实现类
- of的返回值是一个不能改变的集合,不能再使用
add
、put
等方法 Set接口
和Map接口
在调用时,就不能有重复的元素,否则会调用异常
五、Debug追踪
Debug调试程序:
让代码逐行运行,查看代码执行的过程,调试程序中出现的Bug
- 步骤:
- 在行号右边,用左键点击,添加断点(程序执行到断点会停止)
(断点一般添加在方法名前,和有Bug报错处)
- 右键菜单选择运行
- 底部出现Debug窗口
f8
逐行执行程序
f7
进入到方法中
shift f8
从方法中跳出
f9
跳到下一个断点(无断点,程序停止)
Ctrl f2
退出Debug模式,停止程序
console按钮
切换到控制台
六、斗地主(有序版)
怎样实现有序呢?可以使用双列,键用来记录顺序
1. 运行文件
运行文件把框架逻辑写入
2. Card
Card文件,有生成一幅牌,和打乱牌的功能
3. fight文件
fight把文件分发给各个玩家,并且返回有序的牌
4. BaseCard
BaseCard用来存储使用牌的对象的属性