####I. 第一部分:常見數據結構 首先簡單說下數據結構. 什麼是數據結構?數據結構就是組織數據的方式. 常見的數據結構:棧,堆,樹,圖,數組,隊列,鏈表.php
這裏主要介紹與java集合體系相關的棧、數組和鏈表.java
######棧android
特色:壓棧彈棧,先進後出. 如:手槍彈夾裝彈過程,最早壓入的子彈在最下面;而在射擊時,最早彈入槍膛的是最上面的子彈,即最後壓入彈夾的子彈.
######隊列ios
特色:先進先出. 如:子彈射出的過程,先進入槍膛的子彈最早被射出.
######數組數組
概述:用來存儲同一種類型元素的容器。 特色:在內存中是連續的,每一個元素都有編號(從0開始的),方便獲取。但增刪就比較麻煩,須要將目標位置後的全部數據前移動或後移. 查詢快,增刪慢.
######鏈表安全
概述:把一些結點經過鏈子鏈接起來的數據結構。每一個結點由地址域和數值域組成. 特色:增刪快,查詢慢. 增刪時,只須要把所插入處的先後節點鏈條斷開,增長或移除目標節點,速度很快。反之,查詢時則須要遍歷全部節點,直到找到目標節點,速度天然要慢。
####II. 第二部分:Java中的Collection(集合)體系數據結構
#####2.1 集合體系概覽: 集合體系分爲4大塊:spa
Collection接口: Collection是最基本集合接口,它定義了一組容許重複的對象. 它有兩個子接口:List和Set. 1. List下3個實現類:ArrayList, LinkedList, Vector. List是有序的。 1.1 List接口的三個兒子的特色: 1.1.1 ArrayList:底層數據結構是數組,查詢快,增刪慢。線程不安全(不一樣步),效率高。 1.1.2 Vector:底層數據結構是數組,查詢快,增刪慢。線程安全,效率低。 1.1.3 LinkedList:底層數據結構是鏈表,增刪快,查詢慢。 線程不安全的,效率高。 1.2 如何來選擇使用哪一個仔呢? keywords: 看需求! step1: 看是否考慮安全? 安全, 則Vector. step2: 若是不考慮安全,那麼是查詢多仍是增刪多? 查詢多, 則ArrayList; 增刪多,則LinkedList. 什麼都不知道,用ArrayList。 2. Set下2個實現類:HashSet, TreeSet. Set是無序的。
Map接口: 該接口描述了從不重複的鍵到值的映射。Map接口用於維護鍵/值對. 特徵:它描述了從不重複的鍵到值的映射. 兩個重要的實現類:HashMap和TreeMap. 1.HashMap,中文叫散列表,基於哈希表實現,特色就是鍵值對的映射關係。一個key對應一個Value。 HashMap中元素的排列順序是不固定的。更加適合於對元素進行插入、刪除和定位。 2.TreeMap,基於紅黑樹實現。TreeMap中的元素保持着某種固定的順序。更加適合於對元素的順序遍歷。
Comaprable接口: Comparable能夠用於比較的實現,實現了Comparable接口的類能夠經過實現comparaTo方法從而肯定該類對象的排序方式。
Iterator接口: 用於循環訪問集合中的對象。 全部實現了Collection接口的容器類都有iterator方法,用於返回一個實Iterator接口的對象。 Iterator對象稱做迭代器,Iterator接口方法能以迭代方式逐個訪問集合中各個元素,並能夠從Collection中除去適當的元素。
#####2.2 Collection的接口概覽(List 和 Set)
######2.2.1 List接口.net
三個子類:線程
ArrayList 底層數據結構是數組,查詢快,增刪慢。 線程不安全(不一樣步),效率高。
-Vector 底層數據結構是數組,查詢快,增刪慢。 線程安全,效率低。 特有功能: 添加: void addElement(Object obj); 獲取: Object elementAt(int index); Enumeration elements(); //它返回此向量的組件的枚舉,相似於迭代器Iterator boolean hasMoreElements() //相似於hasNext() Object nextElement(); //相似於next();
-LinkedList 底層數據結構是鏈表,增刪快,查詢慢。 線程不安全的,效率高。 特有方法: 添加: void addFirst(Object obj);//頭部添加元素 void addLast(Object obj);//尾部添加元素 獲取: Object getFirst();//獲取頭部元素 Object getLast();//獲取尾部元素 刪除: Object removeFirst();//移除頭部元素 Object removeLast();//移除尾部元素
#問:之後用List體系的那個子類? 看是否考慮安全。 安全:用Vector 不安全:繼續考慮是查詢多仍是增刪多 查詢多:ArrayList 增刪多:LinkedList 什麼都不知道,用ArrayList。
#練習題: 1.一個字符串集合ArrayList中含有以下元素:hello, world, java, hello, .net, java, php, ios, java, android,world。要求編寫程序,得到一個沒有重複元素的新集合。 #思路: 一、建立兩個集合對象,A,B。 二、把字符串添加到集合A中。 三、遍歷集合A,而且判斷集合B中是否包含A集合當前遍歷到的元素。 四、若是包含,不添加,若是不包含,就將該元素添加到集合B中。 五、迭代結束後,集合B中存的就是去重後的元素。
######練習題
#請用LinkedList來模擬棧的數據結構。 剛咱們知道棧的結構爲:先進後出. 我們可使用LinkedList集合,對這個類進行包裝來實現先進先出的效果,但不能直接使用它。 具體實現時,先往集合裏添加一個新數據,add(); 取本身寫類,對LinkedList進行封裝: 一、須要提供添加元素的方法add() //內部封裝的是:addFirst() 二、須要提供獲取元素的方法get(int index) //內部封裝的是:List體系的get(int index)方法 三、須要提供獲取集合長度的方法size() //內部分裝的是:LinkedList的size()方法 之後遇到相似的題,怎麼作? 解題思路: 一、分析要模擬的數據結構的特色。 二、對可用的類進行包裝,而後提供對應的方法就能夠了。
#####2.2 Set集合 set集合的特色: 無序,惟一
######2.2.1 HashSet集合 A:底層數據結構是哈希表(是一個元素爲鏈表的數組) B:哈希表底層依賴兩個方法:hashCode()和equals()
如何保證元素惟一性? 由hashCode()和equals()保證的,先調用hashCode()在調用equals().
執行順序:
首先比較哈希值是否相同: 若相同: 繼續執行equals()方法; -返回true:元素重複了,不添加; -返回false:直接把元素添加到集合; 若不一樣: 就直接把元素添加到集合;
######2.2.2 TreeSet集合 A:底層數據結構是紅黑樹(是一個自平衡的二叉樹) B:保證元素的排序方式
排序方法: a:天然排序(元素具有比較性):讓元素所屬的類實現Comparable接口. b:比較器排序(集合具有比較性):讓集合構造方法接收Comparator的實現類對象
#####2.3 Map接口概覽 Map也是接口,但沒有繼承Collection接口。該接口描述了從不重複的鍵到值的映射。Map接口用於維護鍵/值對(key/value pairs)。 特徵:它描述了從不重複的鍵到值的映射。 兩個重要的實現類:HashMap和TreeMap 1.HashMap,中文叫散列表,基於哈希表實現,特色就是鍵值對的映射關係。一個key對應一個Value。HashMap中元素的排列順序是不固定的。更加適合於對元素進行插入、刪除和定位。 2.TreeMap,基於紅黑書實現。TreeMap中的元素保持着某種固定的順序。更加適合於對元素的順序遍歷。
####總結 ######|-List 有序,可重複 |--ArrayList 底層數據結構是數組,查詢快,增刪慢.
線程不安全,效率高.
|--Vector 底層數據結構是數組,查詢快,增刪慢.
線程安全,效率低.
|--LinkedList 底層數據結構是鏈表,查詢慢,增刪快.
線程不安全,效率高.
######|-Set 無序,惟一 |--HashSet 底層數據結構是哈希表.
保證元素惟一性: 依賴兩個方法:hashCode()和equals().
|--LinkedHashSet 底層數據結構是鏈表和哈希表
由鏈表保證元素有序
由哈希表保證元素惟一
|--TreeSet 底層數據結構是紅黑樹。
如何保證元素排序? 天然排序; 比較器排序.
如何保證元素惟一性的呢? 根據比較的返回值是不是0來決定.
4:針對Collection集合咱們到底使用誰? 惟一麼? 是:Set; 否:List.
若用Set: 排序麼? 是:TreeSet; 否:HashSet. 若是知道是Set,可是不知道是哪一個Set,就用HashSet. 要安全嗎?是:Vector; 否:ArrayList或者LinkedList.
若用List: 查詢多:ArrayList 增刪多:LinkedList 若是你知道是List,可是不知道是哪一個List,就用ArrayList.
若是你知道是Collection集合,可是不知道使用誰,就用ArrayList。
若是你知道用集合,就用ArrayList。
5:在集合中常見的數據結構(掌握) ArrayXxx:底層數據結構是數組,查詢快,增刪慢; LinkedXxx:底層數據結構是鏈表,查詢慢,增刪快; HashXxx:底層數據結構是哈希表。依賴兩個方法:hashCode()和equals(); TreeXxx:底層數據結構是二叉樹。兩種方式排序:天然排序和比較器排序;