一、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用來存儲使用牌的對象的屬性