-----------android培訓、java培訓、java學習型技術博客、期待與您交流!------------
集合類
一數組和集合類容器,有何不同?
數組雖然可以存儲對象,但長度固定的,集合長度是可變的,
數組可以存儲基本數據類型,集合只能存儲對象。
二集合框架的構成:
為什么會出現這么多的容器?
因為每一個容器對暑促的存儲方式不同。
這個存儲方式稱之為:數據結構。
三集合類特點:
集合只能存儲對象,集合長度是可變的,集合可以存儲不同類型的對象。
四什么是迭代器:
其實就是結合取出元素的方式
就是取出方式定義在集合內部
這樣取出方式就可以直接訪問集合內容的元素
那么取出的方式就定義成了內部類,二每一個容器的數據結構不同,所以取出的動作細節也不一樣,但是都有共性內容和判斷和取出,那么可以將共性抽取,
那么這些內部類都符合一個規則。該規則就是Iterator,如何獲取集合的取出對象呢?通過一個對外提供的方法。iterator();
Collection
|--List:: 元素是有序的元素是可以重復的,因為該集合體系有索引。
|--Arraylist:底層的數據結構使用的是數組結構,特點查詢元素很快,但是增刪很慢
|--Linkllist: 底層使用的鏈表結構數據。特點:增刪速度很快,查詢稍慢。
|---Vector :地城數組結構。線程同步。被ArrayList替代了.
|--Set: 元素是無序,元素不可以重復
|--HashSet:底層數據結構式哈希表
HashSet是如何保證元素唯一性的呢?
是通過元素的兩個方法.HashCode和equals 是否為true。
如果元素的HashCode的值相同,才會判斷equals是否為true。
如果元素的HashCode的值不同,不會調用equals。
注意,對於判斷元素是否存在,以及刪除操作(判斷唯一性)依賴的是元素的 HashCode和equals方法
|--TreeSet
List 特有方法,凡是可以用角標方法都是該體系特有的方法
增 Add(index,element); addAll(index,Collection);
刪 remove(index);
改 set(index)
查 get(index) ; subList(form,to);ListIterator ();
ListIterator
List 集合特有的迭代器。ListIterator 是Iterator的子接口
在迭代式中,不可以通過集合對象的方法操作集合的元素。因為會發生ConcurrentModificationException 異常
所以在迭代時,只能用迭代器的方法操作元素,可是Iterator方法方法是有限的
只能對元素進行判斷,取出,刪除的操作。
如果想要其他的操作如添加,修改等,就需要使用起接口,ListIterator。
該接口只能通過List的Iterator方法獲取
枚舉
枚舉就是Vector特有的取出方式,可以發現枚舉和迭代器很想。其實枚舉和迭代時一樣的。因為枚舉的名稱和以及方法的名稱都過長所以被迭代器取代了
Vector myvector=new Vector();
for(Enumeration e=myvector.elements();e.hasMoreElements();){
System.out.println(e.nextElement());
Arraylist
1 add方法的參數類型是Object,以便與接收任意類型對象。
2 集合中存儲的都是對象的引用(地址)
LinkList: 特有方法
addFirst();
addLast();
getFirst();
getLast();
獲取元素,但不刪除元素,如果集合中沒有元素,會出現NoSuckElementException
removeFirst();
removeLast();
獲取元素,但不刪除元素。如果集合中沒有元素,會出現NoSuchElementException
/*
使用LinkedList模擬一個堆棧或者隊列數據結構。
堆棧:先進后出 如同一個杯子。
隊列:先進先出 First in First out FIFO 如同一個水管。
*/
public class Tmp{
public static void main(String[] args)
{
LinkedList l=new LinkedList();
l.addFirst("java01");
l.addFirst("java02");
l.addFirst("java03");
l.addFirst("java04");
l.addFirst("java05");
//堆棧輸出
//stack(l);
//隊列輸出
queue(l);
}
//堆棧
public static void stack(LinkedList l){
while (!l.isEmpty()){
System.out.println(l.removeFirst());
}
}
//隊列
public static void queue(LinkedList l){
while(!l.isEmpty()){
System.out.println(l.removeLast());
}
}
}
在JDK1.6出現了地帶方法
offerFirst()
offerLast()
peekFirst();
peekLast();
獲取元素,但是元素被刪除,如果集合中沒有元素會返回null
poolFirst();
poolLast();
獲取元素,但是元素被刪除,如果集合中沒有元素會返回null
List結合判斷元素是否相同依據是元素的equals方法
set集合的功能和Collection一致的
for(Iterator it = a.iterator();it.hasNext();){//迭代器推薦方式
}
理解一:
不同對象的hashCode不同,但是有些類可能復寫了hashCode代碼,HashSet保證不能有相同的元素,所以每次add一個元素的時候,就會自動調用hashCode和equals方法(如果hashCode不同的則不調用)
理解二:
根據equals(Objectobj)來判斷兩個對象是否相等(並不會調用),如果相等則返回相同的HashCode值。
String 類的equals被復寫了所以只要字符串相等就會返回相同HashCode值。