黑馬程式員:API中的集合架構

來源:互聯網
上載者:User

----------   android培訓、java培訓、期待與您交流!
----------

 學習了那麼多架構結構,今天來總結下各個架構之間的用法和區別:

首先來一張Java中結合架構的總體圖,如下:

 

Collection

1.List:元素是有序的,元素可以重複。因為該集合體系有索引。

2.Set:元素是無序,元素不可以重複

List

1.ArrayList:底層的資料結構使用的是數組結構。特點:查詢速度很快。但是增刪稍慢。線程不同步。

2.LinkedList:底層使用的鏈表資料結構。特點:增刪速度很快,查詢稍慢。線程不同步。

3.Vector:底層是數組資料結構。線程同步。被ArrayList替代了。因為效率低。

List:特有方法。凡是可以操作角標的方法都是該體系特有的方法。

 增:

add(index,element);

addAll(index,Collection);

 刪:

remove(index);

 改:

set(index,element);

查:        

get(index):

subList(from,to);

listIterator();

int indexOf(obj):擷取指定元素的位置。

ListIterator listIterator();

其中listIterator是List特有的介面,listIterator是Iterator的子介面

listIterator可以再遍曆中執行CURD操作

Iterator中只有hasNext()、next()、remove()方法 

LinkedList:特有方法:

addFirst();

addLast(); 

增加元素

getFirst();

getLast();

擷取元素,但不刪除元素。如果集合中沒有元素,會出現NoSuchElementException異常

removeFirst();

removeLast();

擷取元素,但是元素被刪除。如果集合中沒有元素,會出現NoSuchElementException異常

在JDK1.6出現了替代方法。 

offerFirst();

offerLast(); 

增加元素

peekFirst();

peekLast();

擷取元素,但不刪除元素。如果集合中沒有元素,會返回null。 

pollFirst();

pollLast();

擷取元素,但是元素被刪除。如果集合中沒有元素,會返回null。

LinkList的這些方法可以類比堆、棧的預存程序。

 Set

1.HashSet:底層資料結構是雜湊表。是線程不安全的。不同步。

2.TreeSet:可以對Set集合中的元素進行排序。

 用Set來儲存元素,其中的元素是唯一的

1.HashSet是如何儲存元素唯一的?

是通過元素的兩個方法,hashCode和equals來完成。

如果元素的HashCode值相同,才會判斷equals是否為true。

如果元素的hashcode值不同,不會調用equals。

HashCode和equals都相同的情況下,那麼這兩個元素就是同一個元素,後添加的元素就不會被存到HashSet中去。

所以,我們在使用HashSet的過程中要經常去重載HashCode和equals方法,在判斷是否為同一元素時去調用它們。

2.TreeSet是如何保證元素唯一的?

TreeSet底層資料結構是二叉樹。保證元素唯一性的依據:compareTo方法return 0.

(1)TreeSet排序的第一種方式:讓元素自身具備比較性。元素需要實現Comparable介面,覆蓋compareTo方法。也種方式也成為元素的自然順序,或者叫做預設順序。

(2)TreeSet的第二種排序方式: 當元素自身不具備比較性時,或者具備的比較性不是所需要的。這時就需要讓集合自身具備比較性。也就是在其建構函式上定義一個比較子comparator,作為參數傳遞給建構函式TreeSet(Comparator<?
super E> comparator)

比較子comparator的實現過程就是:定義一個類,實現Comparator介面,覆蓋compare方法。

所以,使用TreeSet的時候,在沒有比較子的情況下,經常要實現Comparator介面,覆蓋compare方法。

 Map

Map集合:該集合儲存索引值對。一對一對往裡存。而且要保證鍵的唯一性。

1.Hashtable:底層是雜湊表資料結構,不可以存入null鍵null值。該集合是線程同步的。jdk1.0.效率低。

2.HashMap:底層是雜湊表資料結構,允許使用 null 值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。

3.TreeMap:底層是二叉樹資料結構。線程不同步。可以用於給map集合中的鍵進行排序。

Map中特有的一些方法:

1.添加put(K key, V value)

一次只能添加一個值:當添加時Map中有相同的鍵key時,添加的value會覆蓋原有的value

2.刪除

clare():清空Map

remove(Object key):根據指定的鍵刪除,並返回一個刪除的值,不存在那個鍵的時候返回null

3.判斷

containsValue(Object value)

containsKey(Object key)

isEmpty()

4.擷取

get(Object key):根據索引值來判斷是否存在,不存在則返回null

size():Map的大小

values() :返回全部的值

entrySet()

keySet()

Map中兩種特有的取出方式:entrySet()和keySet()

1,Set<k> keySet:

將map中所有的鍵存入到Set集合。因為set具備迭代器。

所有可以迭代方式取出所有的鍵,在根據get方法。擷取每一個鍵對應的值。

Map集合的取出原理:將map集合轉成set集合。在通過迭代器取出。

2,Set<Map.Entry<k,v>> entrySet:

將map集合中的映射關係存入到了set集合中,

而這個關係的資料類型就是:Map.Entry

Entry其實就是Map中的一個static內部介面。

Map.Entry 其實Entry也是一個介面,它是Map介面中的一個內部介面。 

interface Map{public static interface Entry{public abstract Object getKey();public abstract Object getValue();}}class HashMap implements Map{class Hahs implements Map.Entry{public  Object getKey(){}public  Object getValue(){}}}

Map的擴充應用:一對多的關係

執行個體:一個學校有多個班級,一個班級有許多學生:

關鍵代碼(其中czbk是傳智播客學校,裡面有reyu和jiuye兩個班級):

HashMap<String,List<Student>> czbk = new HashMap<String,List<Student>>();List<Student> reyu = new ArrayList<Student>();List<Student> jiuye = new ArrayList<Student>();czbk.put("yureban",reyu);czbk.put("jiuyeban",jiuye);reyu.add(new Student("01","zhagnsa"));reyu.add(new Student("04","wangwu"));jiuye.add(new Student("01","zhouqi"));
Collections

 集合架構的工具類。

Collections:集合架構的工具類。裡面定義的都是靜態方法。

Collections和Collection有什麼區別?

Collection是集合架構中的一個頂層介面,它裡面定義了單列集合的共性方法。

                  
它有兩個常用的子介面,

                   List:對元素都有定義索引。有序的。可以重複元素。

                   Set:不可以重複元素。無序。

Collections是集合架構中的一個工具類。該類中的方法都是靜態

                 
提供的方法中有可以對list集合進行排序,二分尋找等方法。

                  通常常用的集合都是線程不安全的。因為要提高效率。

                  如果多線程操作這些集合時,可以通過該工具類中的同步方法,將線程不安全的集合,轉換成安全的

Arrarys

Arrays:用於運算元組的工具類。裡面都是靜態方法
1)asList():可以將數組變成List

把數組變成list集合有什麼好處?

可以使用集合的思想和方法來運算元組中的元素。

注意:將數組變成集合,不可以使用集合的增刪方法。因為數組的長度是固定。

如果你增刪。那麼會拋出UnsupportedOperationException異常

特別需要注意的地方:

1.如果數組中的元素都是對象。那麼變成集合時,數組中的元素就直接轉成集合中的元素。

2.如果數組中的元素都是基礎資料型別 (Elementary Data Type),那麼會將該數組(一個元素)作為集合中的元素存在。

錯誤寫法:

int[] num = {1,4,21,3,44};

List <Integer> list = Arrays/asList(num);

正確寫法:

Integer[] num = {1,4,21,3,44};

List <Integer> list = Arrays/asList(num);

2)集合變數組

Collection介面中的toArray方法。

1. 強轉String[] s = (String[])Collection.toArray()

2.String[] s = Collection.toArray(new String[Collection.size()])

1,指定類型的數組到底要定義多長呢?

當指定類型的數組長度小於了集合的size,那麼該方法內部會建立一個新的數組。長度為集合的size。

當指定類型的數組長度大於了集合的size,就不會新建立了數組。而是使用傳遞進來的數組。所以建立一個剛剛好的數組最優。

 2,為什麼要將集合變數組?

         為了限定對元素的操作。不需要進行增刪了

 

----------   android培訓、java培訓、期待與您交流!
----------

詳情請查看:http://edu.csdn.net/heima/

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.