java面向物件高階泛型與list,set,Map
泛型
泛型,即 “引數化型別”。一提到引數,最熟悉的就是定義方法時有形參,然後呼叫此方法時傳遞實參。
引數化型別:就是將型別由原來具體的型別引數化,類似於方法中的變數引數,此時型別也可以定義成引數形式(可以稱之為型別引數),然後在使用/呼叫時傳入具體的型別(型別實參)
資料結構和演算法簡介
資料結構概念
資料的邏輯結構和儲存結構及運算
邏輯結構
資料元素和元素之間的關係(面向問題,針對具體問題,為了解決某個問題)
集合
線性(一對一)
樹(一對多)
圖(多對多)
物理結構
資料的邏輯結構在計算機的儲存形式(面向計算機)
順序儲存結構
鏈式儲存結構
索引儲存
雜湊儲存(Hash)
程式 =
演算法
概念:
演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。
演算法特點
輸入輸出
列印輸出或者返回一個或多個值
有窮性
避免死迴圈,並不是純數學意義的,而是在實際應用中合理的,可以接受的有邊界
確定性
每一步都需要有確定的含義
可行性
演算法設計的要求
正確性
可讀性
寫程式碼的目的:1,計算機執行。2,方便他人閱讀,方便自己日後維護
健壯性
對輸入資料不合法 情況做合適的處理
最優演算法
時間效率高和儲存量低(用最少的錢和時間辦最大的事)
集合介紹
集合是java對資料結構及演算法的封裝
概念
現實生活中:很多事物湊在一起
數學中的集合:具有共同屬性的事物的總體
Java中的集合類:
是一種工具類,就像是容器,儲存任意數量的具有共同屬性的物件。
java集合主要分類三種類型:
Set(集)
List(列表)
Map(對映)
集合的作用
在類的內部,對資料進行組織
簡單而快速的搜尋大量的條目
有的集合介面,提供了一系列排列有序的元素,並且可以在序列中間快速的插入或者刪除有關元素。
有的集合介面,提供了對映關係,可以通過key 去快速查詢唯一物件,而這個關鍵字可以是任意型別。
集合和陣列的區別
陣列的長度固定,集合長度可變
陣列只能通過下標訪問元素,型別固定,而有的集合可以通過任意型別查詢所對映的具體物件,集合只能存放引用資料型別,不能存放基本資料型別。
Collection
Collection介面是list,set介面的父介面,定義了可用於操作ListSet的方法增刪改查
List
List是元素有序並且可以重複的集合,被稱為序列
List可以精確的控制每個元素的插入位置,或刪除某個位置元素
ArrayList. LinkedList是list的兩個實現類
LinkedList與ArrayList對比
相同點:
方法相同,方法執行結果相同(方法體不同)
元素順序操作相同
同一個元素可以加入多次
執行緒不安全
區別:
ArrayList底層是陣列,適於查詢。
LinkedList底層是雙向連結串列,適合刪除與插入,執行緒不安全。
ArrayList中常用方法
對List的遍歷有三種
For迴圈
Foreach
Iterator
集合Set
Set父介面為Collection,很多方法是繼承過來的,所有很多方法與List相同它不允許出現重複元素
不保證集合中元素的順序
允許包含值為null的元素,但最多隻能有一個null元素
HashSet、TreeSet是Set的兩個實現類, 兩個類的方法相同,但是方法執行後結果有的不同
- HashSet和TreeSet對比
相同點
沒有下標
不可手動排序
元素順序與加入順序無關
同一個元素不可加入多次
遍歷方式相同
不同點
HashSet:元素順序不可測,與數學上元素集合概念相同
TreeSet:元素順序與元素的排序規則有關
HashSet對元素無要求,而TreeSet對元素有要求,即要求元素必須有排序規則。
元素排序規則與List中元素排序規則是相同的
HashSet:底層是演算法是Hash演算法:所以查詢速度快,但是沒有ArrayList快
TreeSet:底層演算法是樹: 查詢慢,插入快些。
- HashSet相關操作
建立
HashSet<String> set = new HashSet<String>();
長度
set.size();
新增
String s = "a";
set.add(s);
刪除
set.remove(s);
清空
set.clear();
- 遍歷Set
foreach
iterator
集合Map
Map提供了一種對映關係,其中的元素是以鍵值對(key-value)的形式儲存的,能夠實現根據key快速查詢value。
鍵(key值)不可重複,value值可以
每個鍵最多隻能對映到一個值
Map支援泛型,形式如:Map<K,V>
- HashMap與TreeMap對比
相同點:
方法相同(但方法執行後結果可能不同)
元素是鍵值對
沒有下標
不可手動排序
元素順序與加入順序無關
同一個元素不可加入多次,鍵相同則認為是同一元素,與值無關
不同點
HashMap:元素順序不可測
TreeMap:元素順序與元素的鍵的排序規則有關
HashMap對元素無要求,而TreeMap對元素的鍵有要求,即要求元素的鍵必須有排序規則
HashMap:底層是演算法是Hash演算法:所以查詢速度快,但是沒有ArrayList快
TreeMap:底層演算法是樹: 查詢慢,插入快些
- HashMap的相關操作
建立
HashMap<String, Book> map = new HashMap<String, Book>();
長度
map.size();
新增
map.put("01", new Book("think in java"));
獲取
Book book = map.get("01");
刪除
map.remove("01");
清空
map.clear();
*Map遍歷有兩種方式foreach
HashMap<Integer, String> hashmap= new HashMap<Integer, String>();
hashmap.put(1, "一");
hashmap.put(2, "二");
hashmap.put(3, "三");
hashmap.put(4, "四");
for(Map.Entry<Integer, String> me: hashmap.entrySet()) {
//me是存放hashmap中取出的內容,並用Map.Entry<Integer, String> 指定其泛型
System.out.println(me.getKey() + "-->" + me.getKey());
}
Iterator
TreeMap<Integer, String> tm = new TreeMap<>();
tm.put(1, "a");
tm.put(4, "b");
tm.put(3, "c");
Iterator itMap = tm.entrySet().iterator();
while(itMap.hasNext()){
Map.Entry en = (Map.Entry) itMap.next();
Integer key = (Integer) en.getKey();
String value = en.getValue().toString();
System.out.println(key +" "+value);
}