天天看點

黑馬程式員--------集合

---------------------- ASP.Net+Android+IO開發S、 .Net教育訓練、期待與您交流! ----------------------集合架構結構(這個架構圖一定要搞懂,搞懂了它學習集合架構就容易了):

黑馬程式員--------集合

集合與數組:

集合數組同時容器,有何不同?

1.數組雖然可以存儲對象,但是長度是固定的,但是集合的長度是可變的;

2.數組中可以存儲基本資料類型但是類型需一樣,集合隻能存儲對象

集合優點:隻用于存儲對象,長度可變,集合可以存儲不同類型的對象

一、Collection:

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

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

Collection中的方法很多,詳細的可以查閱下API,這裡點出幾個個人認為特殊點的方法:

方法

add(object):添加一個元素,但是注意 添加的類型是Object類型的。這點很好的反應容器的好處,添加的對象可以是“不同類型”的。

addAll(Collection) :添加一個集合中的所有元素。這裡需要指出的是Collection中存放的也是位址,跟數組一樣。是以添加一個集合中所有元素的時候是把其位址給添加的到集合元素中。

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

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

toArray();将集合中的元素變成數組傳回。

元素取出的方法:使用疊代器Iterator。

二、List

List本身是Collection接口的子接口,具備了Collection的所有方法。

List中成員的結構及其底層資料結構:

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

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

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

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

ArrayList 與Vector之間的差別

ArrayList線程不同步,Vector是線程同步的,故相比來說ArrayList執行效率高。

可變長度:ArrayList.每次擴充5個元素,而Vector擴充10個。相比來說ArrayList更節省空間。

故現在Vector已經被ArrayList所取代。

特有方法:

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

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集合特有的疊代器。可以在疊代器周遊的時候對集合進行CRUD。

LinkedList:

特有方法:

addFirst();//插入不是覆寫

addLast();

getFirst();

getLast();

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

removeFirst();

removeLast();

擷取并删除元素。如果集合中沒有元素,會出現NoSuchElementException

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

offerFirst();

offerLast();

peekFirst();

peekLast();

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

pollFirst();

pollLast();

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

注意:當使用集合存儲的是Object對象時,用疊代器周遊時,當用到對象自己的方法時,可能需要強轉。要不然就定義泛型來解決。

三、set

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

|--HashSet:底層資料結構是哈希表,線程是不同步的。無序,高效;

HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。

當元素的hashCode值相同時,才繼續判斷元素的equals是否為true。

如果為true,那麼視為相同元素,不存。如果為false,那麼存儲。

如果hashCode值不同,那麼不判斷equals,進而提高對象比較的速度。

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

哈希表的原理:

1,對對象元素中的關鍵字(對象中的特有資料),進行雜湊演算法的運算,并得出一個具體的算法值,這個值 稱為哈希值。

2,哈希值就是這個元素的位置。

3,如果哈希值出現沖突,再次判斷這個關鍵字對應的對象是否相同。如果對象相同,就不存儲,因為元素重複。如果對象不同,就存儲,在原來對象的哈希值基礎 +1順延。

4,存儲哈希值的結構,我們稱為哈希表。

5,既然哈希表是根據哈希值存儲的,為了提高效率,最好保證對象的關鍵字是唯一的。

這樣可以盡量少的判斷關鍵字對應的對象是否相同,提高了哈希表的操作效率。

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

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

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

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

第二種方式較為靈活。

四、Map

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

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

|--TreeMap:底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。

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

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

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

Map中的存儲的一對元素:一個是鍵,一個是值,鍵與值之間有對應(映射)關系。

特點:要保證map集合中鍵的唯一性。

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

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

 把map集合轉成set的方法:

Set keySet();

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

Entry就是Map接口中的内部接口;

為什麼要定義在map内部呢?entry是通路鍵值關系的入口,是map的入口,通路的是map中的鍵值對。

---------------------------------------------------------

取出map集合中所有元素的方式一: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);

}

--------------------------------------------------------

取出map集合中所有元素的方式二:entrySet()方法。

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());

}

--------------------------------------------------------

使用集合的技巧:

看到Array就是數組結構,有角标,查詢速度很快。

看到link就是連結清單結構:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();

看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到該結構的中的元素必須覆寫hashCode,equals方法。

看到tree就是二叉樹,就要想到排序,就想要用到比較。

五、Collections

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

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

2.将非同步集合轉成同步集合的方法:Collections中的  XXX synchronizedXXX(XXX);

List synchronizedList(list);

Map synchronizedMap(map);

Collection 和 Collections的差別:

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

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

六、Arrays

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

asList方法:将數組轉換成list集合。

将集合變成數組後有什麼好處?限定了對集合中的元素進行增删操作,隻要擷取這些元素即可。---------------------- ASP.Net+Android+IOS開發、 .Net教育訓練、期待與您交流! ----------------------詳細請檢視: http://edu.csdn.net