1. 程式人生 > >Array、ArrayList、LinkList之間的區別--面試題

Array、ArrayList、LinkList之間的區別--面試題

Array、ArrayList、LinkList之間的區別:Array、ArrayList、LinkList均屬於泛型的範疇,都用來存放元素,主要區別是Array是一個固定大小的容器,底層採用的是線性連續空間來存放元素,ArrayList同樣也是一個容器,但是其大小不固定,底層採用的也是線性連續空間來存放元素,當線性連續空間不足以存放元素時,又重新申請一片更大的空間(大約是原空間的2倍),將原有的內容移過去,因此從這裡可以看出,Array要比ArrayList的效率高,因為不需要重新申請空間,LinkList也是一個容器,但底層採用的是連結串列,因此不存在擴容問題,除非整個記憶體空間都不足了,由於採用的是連結串列,因此查詢效率也比較低,但刪除效率比較高。

HashTable和HashMap區別

①繼承不同。

public class Hashtable extends Dictionary implements Map

public class HashMap extends AbstractMap implements Map

Hashtable 中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。在多執行緒併發的環境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。

Hashtable中,key和value都不允許出現null值

在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。

當get()方法返回null值時,即可以表示 HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

④兩個遍歷方式的內部實現上不同。

Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。

雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值

Hashtable和HashMap它們兩個內部實現方式的陣列的初始大小和擴容的方式。HashTable中hash陣列預設大小是11,增加的方式是 old*2+1。HashMap中hash陣列的預設大小是16,而且一定是2的指數

ArrayList、Vector區別

①兩個類都實現了List介面(List介面繼承了Collection介面),他們都是有序集合,都可以按位置索引號取出某個元素,並且其中的資料是允許重複的,這是HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重複的元素。

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

③資料增長:ArrayList與Vector都有一個初始的容量大小,當儲存進它們裡面的元素的個數超過了容量時,就需要增加ArrayList與Vector的儲存空間,Vector預設增長為原來兩倍,而ArrayList的增長策略在文件中沒有明確規定(從原始碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設定初始的空間大小,Vector還可以設定增長的空間大小,而ArrayList沒有提供設定增長空間的方法。

ArrayList、LinkedList區別

① ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。

② 對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。

③對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料


http://blog.csdn.net/wuchuanpingstone/article/details/6678653

http://www.cnblogs.com/SaraMoring/p/5878772.html