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用來存儲使用牌的對象的屬性
在這裏插入圖片描述
在這裏插入圖片描述

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