1. 程式人生 > >關於Collection框架的學習筆記

關於Collection框架的學習筆記

Collection框架

集合框架(Collection Framework)泛指java.util包的若干個類和介面.如Collection,List,ArrayList,LinkedList,Vector(自動增長陣列),HashSet,HashMap等.

集合框架中的類主要封裝的是典型的資料結構,如動態陣列,連結串列,堆疊,集合,雜湊表等.

集合框架類似程式設計中經常用到的工具類,使得編碼這專注於業務層的實現,不需要從底層實現相關細節—“資料結構的封裝”和”典型演算法的實現”.

1. Collection框架中實現比較要實現什麼介面? Comparable/comparator

2. ArrayList和Vector的區別?

這兩個類都實現了List介面,List介面繼承了Collection介面,他們都是有序集合.即儲存在這兩個集合中的元素的位置都是由順序的,相當於一種動態的陣列,我們以後可以按位置索引號來取出某個元素,並且其中的資料是允許重複的.這是HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素.也不允許有重複的元素.本題目本與hashset沒有任何關係,但為了說清楚ArrayList和Vector的功能,我們使用對比方式,有利於說明問題.

接著才說ArrayList與Vector的區別,主要包括兩個方面:

(1)同步性

Vector是執行緒安全的,也就是說它的方法之間執行緒同步.而ArrayList是先程式不安全的,它的方法之間的執行緒數不同步的,如果只有一個執行緒會訪問到集合,那麼最好用ArrayList,因為它不考慮執行緒安全,效率會高些.如果有多個執行緒會訪問到集合,那麼就使用Vector,因為不需要我們自己去考慮和編寫執行緒安全程式碼.

備註:對於Vector和ArrayList,Hashtable和HashMap,執行緒安全是前2個,記住Vector和Hashtable是舊的,是java一誕生就提供了的,他們是執行緒安全的.而Arratlist和HashMap是java2才提供的,他們是執行緒不安全的.

(2)資料增長

ArrayList和Vector都有一個初始的容量大小,但儲存進他們裡面的元素的個數超過了容量時,就需要增加ArrayList和Vector的儲存空間,每次要增加時,不是隻增加一個儲存單元,而是增加多個儲存單元,每次增加的儲存單元的個數在記憶體空間裡同和程式效率之間要取得一定的平衡.Vector增長為原來的一倍,ArrayList增加原來的0.5倍.

3. HshMap和Hashtable的區別?

HashMap是Hashtable的輕量級實現(非執行緒安全的實現),他們都完成了Map介面,主要區別在於HashMap允許空(null)鍵值(key),由於非執行緒安全,在只有一個執行緒訪問的情況下,效率要高於Hashtable。

HashMap允許將null作為一個entry的key或者value,而Hashtable不允許.總之有三條:

一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map介面的一個實現
二.同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

4. List和Map的區別?

一個是儲存單列資料的集合,另一個是儲存鍵和值這樣的雙列資料的集合,

List中儲存的資料是有順序,並且允許重複;Map中儲存的資料是沒有順序的,其鍵是不能重複的,它的值是可以有重複的。

5、List, Set, Map是否繼承自Collection介面?

List,Set是,Map不是

6.List、Map、Set三個介面,存取元素時,各有什麼特點?

List 以特定次序來持有元素,可有重複元素。Set 無法擁有重複元素,內部排序。Map 儲存key-value值,value可多值。

1. 說出ArrayList,Vector,LinkedList的儲存效能和特性

ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢,Vector由於使用了synchronized方法(執行緒安全),通常效能上較ArrayList差,而LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。

LinkedList也是執行緒不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆疊和佇列來使用。

4、去掉一個Vector集合中重複的元素

Vector newVector =new Vector();

For (inti=0;i<vector.size();i++)

{

Object obj =vector.get(i);

if(!newVector.contains(obj);

newVector.add(obj);

}

還有一種簡單的方式,HashSet set = new HashSet(vector);

9、Collection和 Collections的區別。

  Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.

Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。

10.Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?

Set裡的元素是不能重複的,元素重複與否是使用equals()方法進行判斷的。

equals()和==方法決定引用值是否指向同一物件equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值。

11.你所知道的集合類都有哪些?主要方法?

最常用的集合類是List 和 Map。 List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、儲存和操作任何型別物件的元素列表。 List 適用於按數值索引訪問元素的情形。

Map 提供了一個更通用的元素儲存方法。 Map 集合類用於儲存元素對(稱作"鍵"和"值"),其中每個鍵對映到一個值。

ArrayList/VectoràList

àCollection

HashSet/TreeSetàSet

PropetiesàHashTable

àMap

Treemap/HashMap

對於set,大概的方法是add,remove, contains;對於map,大概的方法就是put,remove,contains等,因為,我只要在eclispe下按點操作符,很自然的這些方法就出來了。我記住的一些思想就是List類會有get(int index)這樣的方法,因為它可以按順序取元素,而set類中沒有get(int index)這樣的方法。List和set都可以迭代出所有元素,迭代時先要得到一個iterator物件,所以,set和list類都有一個iterator方法,用於返回那個iterator物件。map可以返回三個集合,一個是返回所有的key的集合,另外一個返回的是所有value的集合,再一個返回的key和value組合成的EntrySet物件的集合,map也有get方法,引數是key,返回值是key對應的value。

12、兩個物件值相同(x.equals(y)== true),但卻可有不同的hashcode,這句話對不對?

對。

如果物件要儲存在HashSet或HashMap中,它們的equals相等,那麼,它們的hashcode值就必須相等。

如果不是要儲存在HashSet或HashMap,則與hashcode沒有什麼關係了,這時候hashcode不等是可以的,例如arrayList儲存的物件就不用實現hashcode,當然,我們沒有理由不實現,通常都會去實現的。

13、TreeSet裡面放物件,如果同時放入了父類和子類的例項物件,那比較時使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常!

(應該是沒有針對問題的確切的答案,當前的add方法放入的是哪個物件,就呼叫哪個物件的compareTo方法,至於這個compareTo方法怎麼做,就看當前這個物件的類中是如何編寫這個方法的)

實驗程式碼:

public class Parent implements Comparable {

private int age = 0;

public Parent(int age){ this.age = age; }

public int compareTo(Objecto) {

System.out.println("method of parent");

Parento1 = (Parent)o;

return age>o1.age?1:age<o1.age?-1:0; }}

public class Child extends Parent {

public Child(){super(3); }

public int compareTo(Objecto) {

System.out.println("method of child");

// Childo1 = (Child)o;

return 1; }}

public class TreeSetTest {

public static void main(String[]args) {

TreeSetset = new TreeSet();

set.add(new Parent(3));

set.add(new Child());

set.add(new Parent(4));

System.out.println(set.size()); } }

原出處:http://blog.sina.com.cn/s/blog_74de42fb01010p3r.html