5.5 數據結構和算法

1.數據的邏輯結構:

  1)線性結構:(只有一個開始結點和一個終端結點)java

  2)非線性結構:(一個結點有多個前驅結點和後繼結點)android

    A: 集合:(元素之間的關係較爲鬆散)                   B: 線性結構:(元素之間存在嚴格的一對一的關係)算法

    C: 樹形結構:(元素之將存在嚴格的一對多關係)         D: 網狀結構: (元素之間存在多對多關係)數組

2.數據的存儲結構:  

    A:順序結構     B:鏈接結構      C:索引結構      D:散列結構安全

  對JAVA的集合的理解是相對於數組。數組是大小固定的,而且同一個數組只能存放類型同樣的數據(基本類型/引用類型);JAVA集合能夠存儲和操做數目不固定的一組數據。數據結構

  全部的JAVA集合都位於 java.util包中,JAVA集合只能存放引用類型的的數據,不能存放基本數據類型。多線程

JAVA集合主要分爲三種類型:  Set(集)  List(列表)  Map(映射)

  • List         =  排成一長隊的小豬
  • Map       =  放在一個個,有房間號的屋子裏面的一羣小豬
  • Set         =  一羣小豬貼上號,而後趕到一個豬圈裏

Collection 接口

  Collection是最基本的集合接口,聲明瞭適用於JAVA集合(只包括Set和List,Map沒有)的通用方法。工具

Collection接口的方法:  (有一個工具類 Collections)

  •   boolean  add(Object o) :      向集合中加入一個對象的引用
  •   void  clear() :               刪除集合中全部的對象,即再也不持有這些對象的引用
  •   boolean  isEmpty() :         判斷集合是否爲空
  •   boolean  contains(Object o):   判斷集合中是否持有特定對象的引用
  •   Iterartor  iterator() :          返回一個Iterator對象,能夠用來遍歷集合中的元素
  •   boolean  remove(Object o):    從集合中刪除一個對象的引用
  •   Object[]  toArray() :          返回一個數組,該數組中包括集合中的全部元素

Iterator接口聲明瞭以下方法:

  •   hasNext():  判斷集合中元素是否遍歷完畢(便是否還有下一個元素),若是沒有,就返回true
  •   next() :     返回下一個元素
  •   remove():   從集合中刪除上一個有next()方法返回的元素。

Set 的用法:

  存放的是對象的引用,沒有重複對象性能

  Set set=new HashSet();                     
  String s1=new String("hello");   
  String s2=s1;   String s3=new String("world");  
  set.add(s1);   
  set.add(s2);  
  set.add(s3);
  System.out.println(set.size());//打印數目 爲 2。

 

  Set 的 add()方法是如何判斷對象是否已經存放在集合中? spa

   經過迭代器,遍歷比較。

  • HashSet : 爲快速查找設計的Set。存入HashSet的對象必須定義hashCode()。
  • TreeSet : 保存次序的Set, 底層爲樹結構。使用它能夠從Set中提取有序的序列。
  • LinkedHashSet : 具備HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。因而在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。

List(列表)

  List的特徵是其元素以 線性方式存儲,集合中能夠存放重複對象。  List 的 get(int index) 方法放回集合中由參數index指定的索引位置的對象,下標從「0」 開始。

最基本的兩種檢索集合中的全部對象的方法:

1: 用for循環和get()方法:                     2: 使用 迭代器(Iterator):
  for(int i=0; I < size; i++){                Iterator it = list.iterator();
      System.out.println(list.get(i));        while(it.hashNext){
  }                                                System.out.println(it.next);
                            }

 

List接口下一共實現了三個類:ArrayList(Java1.2纔有)Vector(Java1.0就有)LinkedList

  • LinkedList採用鏈表數據結構,它通常主要用在保持數據的插入順序的時候。插入和刪除速度快,訪問速度慢。
  • ArrayListVector都是用數組實現的,用於對元素進行隨機訪問,主要有這麼三個區別:
    1.  Vector是多線程安全的,而ArrayList不是,這個能夠從源碼中看出,Vector類中的方法不少有synchronized進行修飾,這樣就致使了Vector在效率上沒法與ArrayList相比;
    2.  兩個都是採用的線性連續空間存儲元素,可是當空間不足的時候,兩個類的增長方式是不一樣的:Vector增長原來空間的一倍,ArrayList增長原來空間的50%
    3. Vector能夠設置增加因子,而ArrayList不能夠,最開始看這個的時候,我沒理解什麼是增量因子,不過經過對比一下兩個源碼理解了這個,先看看兩個類的構造方法:

ArrayList有三個構造方法:

public ArrayList(int initialCapacity)        // 構造一個具備指定初始容量的空列表。  
public ArrayList()                      // 構造一個初始容量爲10的空列表。  
public ArrayList(Collection<? extends E> c) // 構造一個包含指定 collection 的元素的列表  

Vector有四個構造方法:

public Vector()                          //使用指定的初始容量和等於零的容量增量構造一個空向量。  
public Vector(int initialCapacity)            //構造一個空向量,使其內部數據數組的大小,其標準容量增量爲零。  
public Vector(Collection<? extends E> c)     //構造一個包含指定 collection 中的元素的向量  
public Vector(int initialCapacity,int capacityIncrement)   //使用指定的初始容量和容量增量構造一個空的向量 
/*
Vector比Arraylist多一個構造方法,capacityIncrement就是容量增加,即增加因子,ArrayList中是沒有的。 
擴容時,若是容量增量初始化的不是0,即便用的第四個構造方法進行的初始化,那麼擴容的容量就是原來的容量加上容量增量的值;若是沒有設置容量增量,那麼擴容後的容量就是原來容量的二倍。
*/

Map(映射)

  是一種把鍵對象和值對象映射的集合,它的每個元素都包含一對鍵對象和值對象。

  Map沒有繼承於Collection接口。從Map集合中檢索元素時,只要給出鍵,就會返回對應的值對象。

Map 的經常使用方法:

  1 添加,刪除操做: put()   remove( )   putAll(Map t)   clear()

  2 查詢操做: get(Object key): 得到與關鍵字key相關的值

  Map集合中的不容許重複,也就說,任意兩個鍵對象經過equals()方法比較的結果都是false。可是能夠將任意多個鍵獨享映射到同一個值對象上。

  • HashMap : Map基於散列表的實現。插入和查詢「鍵值對」的開銷是固定的。能夠經過構造器設置容量capacity和負載因子load factor,以調整容器的性能。
  • LinkedHashMap : 相似於HashMap,可是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,由於它使用鏈表維護內部次序。
  • TreeMap : 基於紅黑樹數據結構的實現。查看「鍵」或「鍵值對」時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特色在於,你獲得的結果是通過排序的。TreeMap是惟一的帶有subMap()方法的Map,它能夠返回一個子樹。
  • WeakHashMao : 弱鍵(weak key)Map,Map中使用的對象也被容許釋放: 這是爲解決特殊問題設計的。若是沒有map以外的引用指向某個「鍵」,則此「鍵」能夠被垃圾收集器回收。
  • IdentifyHashMap : 使用==代替equals()對「鍵」做比較的hash map。專爲解決特殊問題而設計。

# Android開發中高效的數據結構用SparseArray代替HashMap

  SparseArray是android提供的一個工具類,它能夠用來替代hashmap進行對象的存儲,其內部實現了一個矩陣壓縮算法,很適合存儲稀疏矩陣的。其內部實現了壓縮算法,能夠進行矩陣壓縮,大大減小了存儲空間,節約內存。此外它的查找算法是二分法,提升了查找的效率。

  List按對象進入的順序保存對象,不作排序或編輯操做。Set對每一個對象只接受一次,並使用本身內部的排序方法(一般,你只關心某個元素是否屬於Set,而不關心它的順序--不然應該使用List)。Map一樣對每一個元素保存一份,但這是基於"鍵"的,Map也有內置的排序,於是不關心元素添加的順序。若是添加元素的順序對你很重要,應該使用 LinkedHashSet或者LinkedHashMap.

相關文章
相關標籤/搜索