學習筆記day03-day04

常見的數據結構:棧 ,隊列 ,數組 ,鏈表和紅黑樹java

棧: stack,又稱堆棧,是一種  運算受限 的線性表
   特色: 1.先進後出
            2.棧的入口,出口都是棧的頂端位置
   隊列: queue 也是一種  運算受限  的線性表
   特色: 1.先進先出
            2.隊列的入口,出口各佔一側
   數組: Array,有序的元素序列
   特色: 1.查找元素快(經過索引)
            2.增刪元素慢(須要建立新數組)
   鏈表: linked list,由節點node(鏈表中每一個元素稱爲節點)組成,節點能夠在運行時i動態生成.
           每一個節點包括兩個部分: 一個是存儲數據元素的數據域
                                              另外一個是存儲下一個節點地址的指針域.包括單向和雙向鏈表.
   特色: 1. 多個節點之間,經過地址進行連接
            2. 查找元素慢
            3. 增刪元素快
   紅黑樹: binary tree,是每一個節點不超過2的有序樹(tree)
   紅黑樹的約束:
           1. 節點能夠是紅色的或者黑色的
           2. 根節點是黑色的
           3. 葉子節點(特指空節點)是黑色的
           4. 每一個紅色節點的子節點都是黑色的
           5. 任何一個節點到其每個葉子節點的全部路徑上黑色節點數相同
   特色:  速度特別快,趨近平衡樹,查找葉子元素最少和最屢次數很少於二倍

List接口:node

特色:
      1. 它是一個存取有序的集合;
      2. 帶有索引
      3. 集合中能夠有重複的元素,經過元素的equals方法.來比較是否爲重複的元素
  經常使用方法:

[Java] 純文本查看 複製代碼
?
1
2
3
4
pubilc void add (int index, E element) : 將指定的元素,添加到該集合中的指定位置上.
public E get (int index) : 返回集合中指定位置的元素.
public E remove (int index) : 移除列表中指定位置的元素,返回的是被移除的元素.
Public E set (int index, E element) : 用指定元素替換集合中指定位置的元素,返回值的更新前的元素.算法

ArrayList集合的特色:數組

ArrayList底層的數據結構:數組
            特色:
                      查詢快
                      增刪慢
                      線程不安全,效率高
           使用場景:
                      存儲的數據查詢多,增刪少的場景

LinkedList集合的特色:安全

LinkedList底層的數據結構:鏈表
             特色:
                      查詢慢
                      增刪快
                      線程不安全, 效率高
            適用場景:
                      存儲的數據查詢少, 增刪多的場景

特有成員方法(主要操做開頭和末尾元素):
[Java] 純文本查看 複製代碼
?
1
2
3
4
5
6
7
void addFirst(E e): 將指定元素插入此列表的開頭/size/alignfont=微軟雅黑void addLast(E e): 將指定元素添加到此列表的結尾
E getFirst(): 返回此列表的第一個元素
E getLast(): 返回此列表的最後一個元素
E removeFirst(): 移除並返回此列表的第一個元素
E removeLast(): 移除並返回此列表的最後一個元素
E pop(): (其實就是removeFirst())今後列表所表示的棧中彈出一個元素
void push(E e): (其實就是addFirst())將元素添加到此列表所表示的棧中數據結構

Vector集合app

Vector底層的數據結構:數組
             Vector的特色:
                      查詢慢
                      增刪快
                      線程安全, 效率低
             Vector目前幾乎沒人使用

Set集合體系ide

HashSet集合
             Set集合體系特色:
                      1. 元素不可重複
                      2. 沒有索引
             HashSet特色:
                      1. 元素不可重複
                      2. 沒有索引
                      3. 元素存取無序 (存入和取出順序有可能不一致)
                      4. 底層採用 哈希表 結構. (查詢快)
             哈希表 = 數組 + 鏈表或紅黑樹
             經常使用方法:

[Java] 純文本查看 複製代碼
?
1
2
boolean add(E e): 添加元素, 根據元素的
hashCode()和equals()方法判斷是否重複. 重複則不添加並返回false, 不重複則添加並返回true
哈希值:工具

一個十進制數值, 通常是經過將該對象的內部地址轉換成一個整數來實現的
         public native int hashCode();
         能夠調用系統本地代碼(C++)計算出一個對象地址的哈希值hashCode()方法的做用
         方法內部的算法用於將對象計算爲一個哈希值, 便於根據哈希值比較對象是否"相等"
         哈希值主要是爲了提升對象存儲在 哈希表 中的效率
         注意:
                      1. 若是咱們不滿意Object中的哈希值計算方法, 能夠重寫hashCode()方法.
                          但在Java代碼中不能直接重寫帶有 native 的方法, 重寫時應該將native 去掉
                          @Override
                          public int hashCode() {}
                      2. hashCode() 方法有可能將"不一樣的對象"計算出"相同的哈希值", 這稱爲"哈希衝突",
                          在出現衝突後, 通常再經過 equals() 方法來繼續判斷對象是否"相等

         HashSet集合存儲數據的結構: 哈希表
         哈希表 = 數組+鏈表/紅黑樹

可變參數優化

JDK 5 出現. 指同一個類型參數個數可變的參數
                      可變參數的本質就是一個"數組"
         格式: 用在方法的參數中
                      修飾符 返回值類型 方法名(參數類型... 變量名) {
                                   // 能夠直接將 變量名 看成 數組名 使用
                      }
         注意事項:
                      1. 可變參數能夠傳遞的參數個數, 能夠是 0個, 1個, 多個
                      2. 一個方法的參數列表中, 只能有一個可變參數
                      3. 若是方法的參數有多個, 可變參數必須寫在參數列表的最後

Collections集合工具類

Collections集合工具類: addAll(), shuffle()
         java.util.Collections類: 操做集合的工具類
         靜態方法:

[Java] 純文本查看 複製代碼
?
1
2
3
4
static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素
static void shuffle(List<?> list) :打亂集合順序
static <T> void sort(List<T> list) :將集合中元素按照默認規則排序
static <T> void sort(List<T> list,Comparator<? super T> ) :將集合中元素按照指定規則排序

Collections集合工具類: sort(List list)
                      sort(List<T> list): 默認按照"升序"將元素排序. 數字, 字母, 均可以按照升序排序
                      自定義JavaBean對象默認不能排序, 由於不知道如何比較哪一個對象大, 哪一個對象小
                      自定義JavaBean對象要想排序, 須要實現 Comparable<E> 接口, 重寫 int compareTo(E e) 方法
                      大小的比較經過 compareTo() 方法的返回值肯定:

                      負數: 當前元素比被比較元素小
                      0: 當前元素與被比較元素相等
                      正數: 當前元素比被比較元素大
         規則:
                      this-參數: 升序
                      參數-this: 降序

Comparable接口和Comparator接口區別

Comparable: 讓JavaBean自身具備可比較性 (本身和其餘人比)
         Comparator: 定義一個比較器類, 用比較器對象比 (讓第三我的來幫兩我的比較)
         Comparator使用方式:
         定義類做爲比較器, 實現Comparator接口, 重寫int compare(E o1, E o2)方法, 泛型爲要比較的元素的類型
         在Collections.sort(List<T> list,Comparator<? super T>)方法中傳入自定義比較器對象
         規則:
                      o1-o2: 升序
                      o2-o1: 降序

java.util.Map接口: 雙列集合的頂層

成員方法:

[Java] 純文本查看 複製代碼
?
1
2
3
4
5
6
V put(K key, V value): 添加/修改鍵值對. 若是鍵存在, 則用新值替換已有值
V remove(Object key): 根據鍵刪除鍵值對, 返回被刪除元素的值
V get(Object key): 根據鍵獲取值. 若是鍵不存在, 則返回null
boolean containsKey(Object key): 判斷是否包含指定的鍵
Set<K> keySet(): 獲取Map集合中全部的鍵, 存儲到Set集合中
Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中全部的鍵值對對象的集合(Set集合)

JDK 9對於集合初始化的優化
            java.util.List
                    靜態方法
                    static List<E> of(E... e): 返回包含指定元素的 不可變List 集合
                    
            java.util.Set
                    靜態方法
                    static Set<E> of(E... e): 返回包含指定元素的 不可變Set 集合
                    
            java.util.Map
                    靜態方法
                    static Map<K, V> of(K k1, V v1): 返回包含指定鍵值對的 不可變Map 集合


    Map集合概述:
            java.util.Map<K, V>接口
            Map集合特色:
                    1. 是雙列集合, 一個元素包含兩個值 (鍵key, 值value)
                    2. key和value的類型能夠相同, 也能夠不一樣
                    3. key不容許重複, value能夠重複
                    4. key和value是一一對應的, 一個鍵只能對應一個值
            Map集合適合存儲一對一關係的數據
    Map經常使用子類:
            java.util.Map<K, V>接口: 雙列集合的根接口, 規定了共性的方法
                    |_ HashMap<K, V>類: 底層哈希表. key存取無序不可重複
                            |_ LinkedHashMap類: 底層哈希表+鏈表. key存取有序不可重複
                    映射: 鍵和值的對應關係 mapping
                    HashSet底層使用的就是HashMap
                    LinkedHashSet底層使用的就是LinkedHashMap
    Map中經常使用方法:
            Map<String, Phone> map = new HashMap<>();
            map.put("張三", p1);
            map.put("張三", p2);
            java.util.Map接口: 雙列集合的頂層
                    成員方法

[Java] 純文本查看 複製代碼
?
1
2
3
4
5
6
V put(K key, V value): 添加/修改鍵值對. 若是鍵存在, 則用新值替換已有值
V remove(Object key): 根據鍵刪除鍵值對, 返回被刪除元素的值
V get(Object key): 根據鍵獲取值. 若是鍵不存在, 則返回null
boolean containsKey(Object key): 判斷是否包含指定的鍵
Set<K> keySet(): 獲取Map集合中全部的鍵, 存儲到Set集合中
Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中全部的Entry對象的集合(Set集合)

Map遍歷方式一:keySet()方法實現經過鍵找值
            Set<K> keySet(): 獲取Map集合中全部的鍵, 存儲到Set集合中
            keySet()遍歷步驟:
                    1. Map對象調用 keySet() 方法, 獲取包含全部key的Set集合
                    2. 遍歷Set集合, 獲取每一個key
                    3. 經過Map對象調用 get(Object key) 方法根據key獲取到value

[Java] 純文本查看 複製代碼
?
1
2
3
4
5
6
7
8
9
Map<String, String> map = new HashMap<>();
// keySet()遍歷
Set<String> keys = map.keySet();
for (String key : keys) {

// 經過每一個鍵獲取值
   String value = map.get(key);
   // 打印當前鍵值對
   System.out.println(key + "=" + value);
   }

    Entry鍵值對對象介紹:
             java.util.Map.Entry接口:
                    經常使用成員方法:
                    K getKey(): 獲取Entry對象中的鍵
                    V getValue(): 獲取Entry對象中的值
            Entry對象就是一個節點, 節點中存儲了key和value
            拿到一個Entry對象就能夠從中獲取key和value
    HashMap中Entry實現類

[Java] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
static class Node<K,V> implements Map.Entry<K,V> {

final int hash;
      final K key;
      V value;
      Node<K,V> next;
      public final K getKey() {
            return key;
      }
      public final V getValue() {
            return value;
      }

}

java.util.Map接口
            Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中全部的鍵值對對象的集合(Set集合)
                    
Map遍歷方式二:經過entrySet()獲取對象形式遍歷:
     java.util.Map接口
           Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中全部的鍵值對對象的集合(Set集合)
     entrySet()方法遍歷Map步驟:
                    1. Map對象調用 entrySet() 獲取包含全部Entry對象的Set集合
                    2. 遍歷Set集合, 獲取每一個Entry對象
                    3. 調用Entry對象的 getKey() 和 getValue() 方法獲取鍵和值

[Java] 純文本查看 複製代碼
?
1
2
3
4
5
6
7
8
9
Map<String, String> map = new HashMap<>();

// keySet()遍歷
    Set<Map.Entry<String, String>> entries = map.entrySet();
    for (Map.Entry<String, String> entry : entries) {
    // 經過Entry對象獲取每一個鍵值對
    String value = entry.getKey();
    String value = entry.getValue();
    // 打印當前鍵值對
    System.out.println(key + "=" + value);

    JDK9對集合添加的優化:
            使用集合添加大量元素時, 反覆add(...)比較麻煩.
            JDK 9 爲集合提供了一些靜態方法, 能夠方便的對集合進行初始化
                    java.util.List
                            靜態方法:
                          static List<E> of(E... e): 返回包含指定元素的 不可變List 集合
                    java.util.Set
                            靜態方法
                           static Set<E> of(E... e): 返回包含指定元素的 不可變Set 集合
                    java.util.Map
                            靜態方法
                          static Map<K, V> of(K k1, V v1, ...): 返回包含指定鍵值對的 不可變Map 集合
           注意:
                 1. of() 方法只適用於List接口, Set接口, Map接口, 不適用於接接口的實現類
                 2. of() 方法的返回值是一個不能改變的集合, 集合不能再使用 add(), put() 方法添加元素, 會拋出異常
                 3. Set接口和Map接口在調用 of() 方法的時候, 不能有重複的元素, 不然會拋出異常
            將 不可變集合 的元素轉移到常見集合實現類中:
                   List

[AppleScript] 純文本查看 複製代碼
?
1
2
3
4
ArrayList<Integer> list = new ArrayList<>(List.of(1,2,3));[/align] Set

HashSet<Integer> set = new HashSet<>(Set.of(1,2,3));
                Map
               HashMap<Integer, String> map = new HashMap<>(Map.of(1,"a",2,"b"));
    今日目標:
            可以說出Map集合特色:
                    Map接口雙列集合的頂層
                    特色:
                    Map存儲元素是鍵值對方式(key-value)
                    Map中key不能重複(惟一), 鍵值對是一一對應的, 一個鍵對應一個值
            使用Map集合添加方法保存數據:
                    map.put(鍵, 值);
                    添加鍵值對: map中沒有這個鍵時, 返回null
                    修改鍵值對: map中已經有該鍵, 返回的是被替換的值
            使用」鍵找值」的方式遍歷Map集合:

[Java] 純文本查看 複製代碼
?
1
2
3
4
5
6
keySet()
Set keySet = map.keySet();
for (鍵的類型 key : keySet) {

// 經過鍵獲取值
      值的類型 value = map.get(key);
      }

            使用」鍵值對」的方式遍歷Map集合:

[Java] 純文本查看 複製代碼?123456Entry對象/alignSet<Entry> entrySet = map.entrySet();[/align][align=left]for (Entry entry : entrySet) {[/align][align=left]// 經過entry對象獲取鍵和值[/align][align=left]鍵的類型 key = entry.getKey();[/align][align=left]值的類型 value = entry.getValue();[/align][align=left]}

相關文章
相關標籤/搜索