——Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ——
1.集合的概念
集合:是Java API提供的一些類的實例,用於動態存儲多個對象
JDK所提供的集合API位於Java.util包下。
2.集合框架圖(都在util包下)
2.1 Collection下的常用方法
1.添加: add(e) ; addAll(Collection);
2.刪除: remove(e); removeAll(collection); clear();
3.判斷: contains(e); isEmpty();
4.獲取: iterator(); size ();
5.獲取交集:al1.retainAll(al2); al1只剩下與al2相同的元素
6.集合變數組:toArray();
注意:集合中存儲的都是對象的引用(地址)
3.集合中泛型的使用
JDK1.4以前:
裝入集合中的數據都會被當作是Object對象來存放,從而失去了自己的實際類型
從集合中取出元素時,需要進行強制類型轉換。效率低,容易產生錯誤。
JDK5.0之後,可以用泛型解決這個問題
在定義一個集合的時候就指定該集合存儲對象的數據類型。
如: Collection <String > coll=new ArrayList <String > ();
從集合中取出元素時,無需轉型了。如: String str=it.next();
4.集合中泛型的優點
優點:a.簡化集合的使用。b.增強代碼的可讀性和穩定性
意義:用於保護存入集合中元素的數據類型。
5.Iterator接口(迭代器)
所有Collection接口下的類都有iterator( )方法用以返回一個實現了Iterator接口的對象。
Iterator it=coll.iterator( );
6.Iterator迭代器的工作原理
Iterator是專門迭代輸出的接口。迭代輸出是指將元素進判斷,如果有內容則將內容取出。
Iterator對象稱作迭代器,方便的對集合裏的元素進行遍歷。
Iterator接口中定義瞭如下方法:
Boolean hasNext(); //判斷遊標的右邊是否有元素
Object next (); //返回遊標右邊的元素,並將遊標移到下一個位置
void remove(); //刪除遊標左邊的元素。
7.List接口
List接口是Collection接口的子接口
注意:該接口下的元素都是有序,並可以重複的。
List集合中的元素都對應一個整數型的序號來記錄該元素在集合中的位置,通過序號來存儲集合中的元素。
List下的常用類:ArrayList ,LinkedList, Vector(不常用)。
8.List接口常用方法
List接口比Collection接口中新增的幾個實用方法:
Object get (int index) ;//返回列表中的某個元素
Object add(int index ,Object element);//在某個位置插入某個元素
Object set(int index,Object element);//替換指定位置的元素
Object remove(int index); //刪除某個位置的元素
ListIterator listIterator ();// 返回列表迭代器
9.ArrayList
ArrayList是使用數組結構實現的List集合
優點:通過索引快速獲取對象。
缺點:刪除或插入元素的速度慢,因爲採用數組結構,後面的元素要一起移動。
10.LinkedList
LinkedList是採用雙向鏈表實現的集合,允許null元素,優缺點剛好與ArrayList相反
優點:插入或刪除速度快,適合實現棧(Stack)和隊列(Queue)
缺點:獲取較慢。
11.棧(Stack)和隊列(Queue)
棧(Stack)的存儲特點:LIFO,後進先出
隊列(Queue)的存儲特點:FIFO,先進先出。
12.Vector向量
大多數操作與ArrayList相同,區別是它是線程同步的
13.Set
a.Set接口:無序,元素不能重複。所以最多有一個null元素。
b.Set集合類:HashSet:散列表存放。TreeSet:有序存放。
注意:如果添加"相同"的元素,則無法添加(add)進去。這裏的"相同"是通過equals()方法判斷,
所以必須重寫equals()和hashCode()方法,且equals判斷的因素應該與hashCode的返回值因素一致。
14.HashSet的存儲原理
根據每個對象的哈希值(hashCode()方法獲取),按照一定的算法算出它的存儲索引,把對象放在
一個叫散列表的相應位置(表元)中。
如果對應的位置沒有元素,則存放,如果有元素,則該對象與對應位置的所有對象比較(equal
()),以查看該對象是否存在:還不存在則就存放,存在了就直接使用。
取對象時:
根據它的哈希值算出它的存儲索引,在散列表上的表元(相應位置)上進行少量的比較操作就可找到
15.HashSet集合的特點及使用技巧
HashSet不保存元素的加入順序。
HashSet對存,取,刪對象都有很高的效率。
HashSet根據元素的哈希碼進行存放,取出時也根據哈希碼快速找到。
注意:對於存放到HashSet集合的對象的對應類,必須重寫equals()和hashCode()方法以實現對象相等
注意:如果添加"相同"的元素,則無法添加(add)進去。
16.TreeSet的存儲原理
TreeSet是採用紅黑樹結構對加入的元素進行排序存放的,即存放TreeSet中的元素必須是可"排序"的
注意:如果添加"相同"的元素,則無法添加(add)進去。
17.Comparable接口
所有可"排序"的類都可以通過java.lang.Comparable接口來實現。該接口中的唯一方法:
public int compareTo(Object obj) ;
返回0, 表示 this==obj
返回正數,表示 this>obj
返回負數,表示 this<obj
可"排序"的類通過Comparable接口的compareTo方法確定該類對象的排序方式。
侷限性:實現該接口的類只能按照compareTo()定義的唯一方法進行排序。
如果同一類對象想要多種排序方式,應該爲該類定義不同的比較器來實現。
TreeSet有一個構造方法允許給定構造器進行排序。
arraylist和linkedlist
ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。
對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。
這一點要看實際情況的。若只對單條數據插入或刪除,ArrayList的速度反而優於LinkedList。但若是批量隨機的插入刪除數 據,LinkedList的速度大大優於ArrayList. 因爲ArrayList每插入一條數據,要移動插入點及之後的所有數據。
總結:
注意:TreeSet的唯一性與HashSet的唯一性不同:
HashSet根據equal方法和hashCode方法確定唯一性的。
TreeSet的唯一性是根據排序元素確定,在compare方法裏某個排序元素“return 0”表示這兩對象相同,則後添加進去的對象無法add
TreeSet有兩種排序方式,一種是實現comparable接口,一種是添加已實現的比較器(compartor),
如果TreeSet兩種方式都具備,則以比較器優先。