天天看點

【黑馬程式員】---java基礎---集合

------<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="blank">Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練</a>、期待與您交流! -------

集合架構:用于存儲資料的容器。 

特點:

1、對象封裝資料,對象多了也需要存儲。集合用于存儲對象。

2、對象的個數确定可以使用數組,但是不确定怎麼辦?可以用集合。因為集合是可變長度的。  

集合和數組的差別: 

1、數組是固定長度的;集合可變長度的。 

2、數組可以存儲基本資料類型,也可以存儲引用資料類型;集合隻能存儲引用資料類型。 

3、數組存儲的元素必須是同一個資料類型;集合存儲的對象可以是不同資料類型。 

資料結構:就是容器中存儲資料的方式。  

對于集合容器,有很多種。因為每一個容器的自身特點不同,其實原理在于每個容器的内部資料結構不同。 集合容器在不斷向上抽取過程中。出現了集合體系。 

在使用一個體系時,原則:參閱頂層内容。建立底層對象。

java中集合類的關系圖

【黑馬程式員】---java基礎---集合

Collection接口: 

Collection:  |--List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。 

                       |--Set:無序(存入和取出順序有可能不一緻),不可以存儲重複元素。必須保證元素唯一性。  

                                  1、添加:add(object):添加一個元素

                                                    addAll(Collection) :添加一個集合中的所有元素 

                                  2、删除:clear():将集合中的元素全删除,清空集合

                                                    remove(obj) :删除集合中指定的對象     注意:删除成功,集合的長度會改變

                                                    removeAll(collection) :删除部分元素。部分元素和傳入Collection一緻 

                                  3、判斷: boolean contains(obj) :集合中是否包含指定元素 

                                                     boolean containsAll(Collection) :集合中是否包含指定的多個元素

                                                     boolean isEmpty():集合中是否有元素。  

                                  4、擷取: int size():集合中有幾個元素

                                  5、取交集:boolean  retainAll(Collection) :對目前集合中保留和指定集合中的相同的元素。如果兩個集合元素相同,傳回flase;如果retainAll修改了目前集合,傳回true 

                                  6、擷取集合中所有元素:Iterator  iterator():疊代器 

                                  7、将集合變成數組:  toArray() 

Iterator接口: 

疊代器:是一個接口。作用:用于取集合中的元素。

boolean hasNext()  如果仍有元素可以疊代,則傳回 true。

E next()   傳回疊代的下一個元素。 

void remove()  從疊代器指向的 collection 中移除疊代器傳回的最後一個元素(可選操作)。  

每一個集合都有自己的資料結構,都有特定的取出自己内部元素的方式。為了便于操作所有的容器,取出元素。将容器内部的取出方式按照一個統一的規則向外提供,這個規則就是Iterator

接口。 也就說,隻要通過該接口就可以取出Collection集合中的元素,至于每一個具體的容器依據自己的資料結構,如何實作的具體取出細節,這個不用關心,這樣就降低了取出元素和具體

集合的耦合性。  

Iterator it = coll.iterator();//擷取容器中的疊代器對象,至于這個對象是是什麼不重要。這對象肯定符合一個規則Iterator接口。

public static void main(String[] args) {   
    Collection coll = new ArrayList();   
    coll.add("abc0");   
    coll.add("abc1");
    coll.add("abc2"); 
    //周遊方式1   
    Iterator it = coll.iterator();   
    while(it.hasNext()){    
        System.out.println(it.next());
    } 
    //周遊方式2  此種方法更優,因為疊代器随周遊完畢而釋放。
    for(Iterator it = coll.iterator();it.hasNext(); ){    
        System.out.println(it.next());  
    }
} 
           

List接口:

List本身是Collection接口的子接口,具備了Collection的所有方法。現在學習List體系特有的共性方法,查閱方法發現List的特有方法都有索引,這是該集合最大的特點。 

List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。 

        |--ArrayList:底層的資料結構是數組,線程不同步,ArrayList替代了Vector,查詢元素的速度非常快。  

        |--LinkedList:底層的資料結構是連結清單,線程不同步,增删元素的速度非常快。 

        |--Vector:底層的資料結構就是數組,線程同步的,Vector無論查詢和增删都很慢。  

1、添加:add(index,element) :在指定的索引位插入元素。

                  addAll(index,collection) :在指定的索引位插入一堆元素。 

2、删除:  remove(index) :删除指定索引位的元素。 傳回被删的元素。  

3、擷取:  Object get(index) :通過索引擷取指定元素。 

                    int indexOf(obj) :擷取指定元素第一次出現的索引位,如果該元素不存在傳回-1;是以,通過-1,可以判斷一個元素是否存在。

                    int lastIndexOf(Object o) :反向索引指定元素的位置。  

                    List subList(start,end) :擷取子清單。 

4、修改:Object set(index,element) :對指定索引位進行元素的修改。 

5、擷取所有元素:ListIterator listIterator():list集合特有的疊代器。 

List集合支援對元素的增、删、改、查。

List集合因為角标有了自己的擷取元素的方式: 周遊。 for(int x=0; x<list.size(); x++){  sop("get:"+list.get(x)); } 

在進行list清單元素疊代的時候,如果想要在疊代過程中,想要對元素進行操作的時候,比如滿足條件添加新元素。會發生.ConcurrentModificationException并發修改異常。

導緻的原因是:

集合引用和疊代器引用在同時操作元素,通過集合擷取到對應的疊代器後,在疊代中,進行集合引用的元素添加,疊代器并不知道,是以會出現異常情況。

解決方法: 

既然是在疊代中對元素進行操作,找疊代器的方法最為合适.可是Iterator中隻有hasNext,next,remove方法.通過查閱的它的子接口,ListIterator,發現該清單疊代器接口具備了對元素的

增、删、改、查的動作。 

ListIterator是List集合特有的疊代器。 

ListIterator it = list.listIterator;//取代Iterator it = list.iterator; 

方法摘要: 

void add(E e) 将指定的元素插入清單(可選操作)。 

boolean hasNext() 以正向周遊清單時,如果清單疊代器有多個元素,則傳回 true(換句話說,如果 next 傳回一個元素而不是抛出異常,則傳回 true)。  

boolean hasPrevious() 如果以逆向周遊清單,清單疊代器有多個元素,則傳回 true。 

E next() 傳回清單中的下一個元素。 

int nextIndex() 傳回對 next 的後續調用所傳回元素的索引。  

E previous() 傳回清單中的前一個元素。 

int previousIndex() 傳回對 previous 的後續調用所傳回元素的索引。 

void remove() 從清單中移除由 next 或 previous 傳回的最後一個元素(可選操作)。  

void set(E e) 用指定元素替換 next 或 previous 傳回的最後一個元素(可選操作)。  

可變長度數組的原理: 

當元素超出數組長度,會産生一個新數組,将原數組的資料複制到新數組中,再将新的元素添加到新數組中。 

ArrayList:是按照原數組的50%延長。構造一個初始容量為 10 的空清單。 

Vector:是按照原數組的100%延長。  

注意:對于list集合,底層判斷元素是否相同,其實用的是元素自身的equals方法完成的。是以建議元素都要複寫equals方法,建立元素對象自己的比較相同的條件依據。 

LinkedList的特有方法:

addFirst(); addLast(); 在jdk1.6以後。 offerFirst(); offerLast();  

getFirst():擷取連結清單中的第一個元素。如果連結清單為空,抛出NoSuchElementException; getLast(); 

在jdk1.6以後。peekFirst();擷取連結清單中的第一個元素。如果連結清單為空,傳回null。 peekLast();  

removeFirst():擷取連結清單中的第一個元素,但是會删除連結清單中的第一個元素。如果連結清單為空,抛出NoSuchElementException removeLast();

在jdk1.6以後。pollFirst();擷取連結清單中的第一個元素,但是會删除連結清單中的第一個元素。如果連結清單為空,傳回null。 pollLast();

Set接口: 

Set接口中的方法和Collection中方法一緻的。Set接口取出方式隻有一種,疊代器。 

    |--HashSet:底層資料結構是哈希表,線程是不同步的。無序,高效;   HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。   當元素的hashCode值

                          相同時,才繼續判斷元素的equals是否為true。如果為true,那麼視為相同元素,不存。如果為false,那麼存儲。 如果hashCode值不同,那麼不判斷equals,進而提高

                          對象比較的速度。       

    |--LinkedHashSet:有序,hashset的子類。

    |--TreeSet:對Set集合中的元素的進行指定順序的排序。不同步。TreeSet底層的資料結構就是二叉樹。 

對于HashSet集合,判斷元素是否存在,或者删除元素,底層依據的是hashCode方法和equals方法。  

TreeSet:

用于對Set集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。  如果元素不具備比較性,在運作時會發生ClassCastException異常。 

是以需要元素實作Comparable接口,強制讓元素具備比較性,複寫compareTo方法。  依據compareTo方法的傳回值,确定元素在TreeSet資料結構中的位置。 

TreeSet方法保證元素唯一性的方式:就是參考比較方法的結果是否為0,如果return 0,視為兩個對象重複,不存。 

TreeSet集合排序有兩種方式,Comparable和Comparator差別: 

1、讓元素自身具備比較性,需要元素對象實作Comparable接口,覆寫compareTo方法。 

2、讓集合自身具備比較性,需要定義一個實作了Comparator接口的比較器,并覆寫compare方法,并将該類對象作為實際參數傳遞給TreeSet集合的構造函數。 

第二種方式較為靈活。 

Map接口: 

|--Hashtable:底層是哈希表資料結構,是線程同步的。不可以存儲null鍵,null值。 

|--HashMap:底層是哈希表資料結構,是線程不同步的。可以存儲null鍵,null值。替代了Hashtable. |--TreeMap:底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。  

Map集合存儲和Collection有着很大不同: 

1、Collection一次存一個元素;Map一次存一對元素。 

2、Collection是單列集合;Map是雙列集合。 

Map中的存儲的一對元素:一個是鍵,一個是值,鍵與值之間有對應(映射)關系。 特點:要保證map集合中鍵的唯一性。  

1、添加:put(key,value):當存儲的鍵相同時,新的值會替換老的值,并将老值傳回。如果鍵沒有重複,傳回null。  

                  void putAll(Map);

2、删除:void clear():清空 

                  value remove(key) :删除指定鍵。 

3、判斷:boolean isEmpty():是否為空

                  boolean containsKey(key):是否包含key  

                  boolean containsValue(value) :是否包含value 

4、取出:int size():傳回長度 

                  value get(key) :通過指定鍵擷取對應的值。如果傳回null,可以判斷該鍵不存在。當然有特殊情況,就是在hashmap集合中,是可以存儲null鍵null值的。  

                  Collection values():擷取map集合中的所有的值。 

5、想要擷取map中的所有元素: 

原理:map中是沒有疊代器的,collection具備疊代器,隻要将map集合轉成Set集合,可以使用疊代器了。之是以轉成set,是因為map集合具備着鍵的唯一性,其實set集合就來自于

map,set集合底層其實用的就是 map的方法。 

把map集合轉成set的方法:  Set keySet();//将map集合中的鍵都取出存放到set集合中

                                                   Set entrySet();//取的是鍵和值的映射關系。

方式一:keySet()方法:可以将map集合中的鍵都取出存放到set集合中。對set集合進行疊代。疊代完成,再通過get方法對擷取到的鍵進行值的擷取。   

Set keySet = map.keySet();  

Iterator it = keySet.iterator();  

while(it.hasNext()) {    

    Object key = it.next();    

    Object value = map.get(key); 

    System.out.println(key+":"+value);   

方式二:entrySet()方法:map集合中的映射關系Map.Entry都取出存放到set集合中。通過Map.Entry的getKey()和getValue()方法擷取到鍵和值。

Set entrySet = map.entrySet(); 

Iterator it = entrySet.iterator();   

while(it.hasNext()) {    

    Map.Entry  me = (Map.Entry)it.next(); 

    System.out.println(me.getKey()+"::::"+me.getValue());  

Collections:它的出現給集合操作提供了更多的功能。這個類不需要建立對象,内部提供的都是靜态方法。

方法摘要:

Collections.sort(list);//list集合進行元素的自然順序排序。 

Collections.sort(list,new ComparatorByLen());//按指定的比較器方法排序。 

Collections.max(list); //傳回list中字典順序最大的元素。 

int index = Collections.binarySearch(list,"zz");//二分查找,傳回角标。 Collections.reverseOrder();//逆向反轉排序。

Collections.shuffle(list);//随機對list中的元素進行位置的置換。 

Collection 和 Collections的差別: 

Collections是個java.util下的類,是針對集合類的一個工具類,提供一系列靜态方法,實作對集合的查找、排序、替換、線程安全化(将非同步的集合轉換成同步的)等操作。 

Collection是個java.util下的接口,它是各種集合結構的父接口,繼承于它的接口主要有Set和List,提供了關于集合的一些操作,如插入、删除、判斷一個元素是否其成員、周遊等。

Arrays:用于操作數組對象的工具類,裡面都是靜态方法。 

static List  asList():将數組轉換成list集合。 

注意:數組是固定長度,不可以使用集合對象增加或者删除等,會改變數組長度的功能方法。比如add、remove、clear。(會報不支援操作異常UnsupportedOperationException);

如果數組中存儲的引用資料類型,直接作為集合的元素可以直接用集合方法操作。 如果數組中存儲的是基本資料類型,asList會将數組實體作為集合元素存在。