---------- 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/