1、ArrayList與Vector的差異
(更多面試題推薦:java面試題目及答案)
這兩個類別都實作了List介面(List介面繼承了Collection介面),他們都是有序集合,即儲存在這兩個集合中的元素的位置都是有順序的,相當於一種動態的陣列,我們以後可以按位置索引號取出某個元素,並且其中的資料是允許重複的,這是與HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重複的元素。
ArrayList與Vector的差異主要包含兩個面向:
(1)同步性:
Vector是執行緒安全的,也就是說就是在它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮寫線程安全的程式碼。
(2)資料成長:
ArrayList與Vector都有一個初始的容量大小,當儲存進它們裡面的元素的數量超過了容量時,就需要增加ArrayList與Vector的儲存空間,每次要增加儲存空間時,不是只增加一個儲存單元,而是增加多個儲存單元,每次增加的儲存單元的數量在記憶體空間利用與程式效率之間要取得一定的平衡。
Vector預設成長為原來兩倍,而ArrayList的成長策略在文件中沒有明確規定(從原始碼看到的是成長為原來的1.5倍)。 ArrayList與Vector都可以設定初始的空間大小,Vector還可以設定成長的空間大小,而ArrayList並沒有提供設定成長空間的方法。
總結:也就是Vector成長原來的一倍,ArrayList增加原來的0.5倍。
2、HashMap和Hashtable的區別
HashMap是Hashtable的輕量級實作(非線程安全的實作),他們都完成了Map接口,主要區別在於HashMap允許空(null )鍵值(key),由於非線程安全,在只有一個線程訪問的情況下,效率要高於Hashtable。
HashMap允許將null當作一個entry的key或value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實作。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個執行緒存取Hashtable時,不需要自己為它的方法實作同步,而HashMap就必須為之提供同步。
就HashMap與HashTable主要從三方面來說。
(1)歷史原因:Hashtable是基於陳舊的Dictionary類別的,HashMap是Java 1.2引進的Map介面的一個實作
(2)同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是線程式不安全的,不是同步的
(3)值:只有HashMap可以讓你將空值當作一個表格的條目的key或value
(學習影片推薦:java課程)
3、List和Map區別?
一個是儲存單列資料的集合,另一個是儲存鍵和值這樣的雙列資料的集合,List中儲存的資料是有順序,並且允許重複;Map中儲存的資料是沒有順序的,其鍵是不能重複的,它的值是可以有重複的。
4、List,Set, Map是否繼承自Collection介面?
List,Set是,Map不是
5、List、Map、Set三個接口,存取元素時,各有什麼特色?
(這樣的題目比較考試水平,兩方面的水平:一是要真正明白這些內容,二是要有較強的總結和表述能力。)
首先,List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個共同的父接口,叫做Collection。 Set裡面不允許有重複的元素,也就是不能有兩個相等(注意,不是僅僅是相同)的對象,也就是假設Set集合中有了一個A對象,現在我要向Set集合再存入一個B對象,但B物件與A物件equals相等,則B物件儲存不進去。
所以,Set集合的add方法有一個boolean的回傳值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則傳回true,當集合含有與某個元素equals相等的元素時,此時add方法無法加入該元素,回傳結果為false。 Set取元素時,不能細說要取第幾個,只能以Iterator介面取得所有的元素,再逐一遍歷各個元素。
List表示有先後順序的集合,注意,不是那種會按年齡、大小、按價格之類的排序。當我們多次呼叫add(Obje)方法時,每次加入的物件就像火車站買票有排隊順序一樣,按先來後到的順序排序。有時候,也可以插隊,也就是呼叫add(intindex,Obj e)方法,就可以指定目前物件在集合中的存放位置。
一個物件可以被重複儲存進List中,每呼叫一次add方法,這個物件就被插入進集合中一次,其實,並不是把這個物件本身儲存進了集合中,而是在集合中用一個索引變數指向這個對象,當這個對像被add多次時,即相當於集合中有多個索引指向了這個對象,如圖x所示。 List除了可以用Iterator介面取得所有的元素,再逐一遍歷各個元素之外,還可以呼叫get(index i)來明確說明取第幾個。
Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(obj key,obj value),每次儲存時,要儲存一對key/value,不能儲存重複的key,這個重複的規則也是按equals比較相等。取則可以根據key取得對應的value,即get(Object key)傳回值為key所對應的value。
另外,也可以得到所有的key的結合,還可以得到所有的value的結合,也可以得到key和value組合成的Map.Entry物件的集合。
List以特定次序來持有元素,可有重複元素。 Set無法擁有重複元素,內部排序。 Map保存key-value值,value可多值。
6、說出ArrayList,Vector,LinkedList的儲存效能和特性
ArrayList和Vector都是使用陣列方式儲存數據,此數組元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差。而LinkedList使用雙向鍊錶實現存儲,按序號索引資料需要進行前向或後向遍歷,索引就變慢了,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。
LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆疊和佇列來使用。
7、去掉一個Vector集合中重複的元素
Vector newVector = new Vector(); For (int i=0;i<vector.size();i++) { Object obj = vector.get(i); if(!newVector.contains(obj); newVector.add(obj); }
還有一個簡單的方式,利用了Set不允許重複元素:
HashSetset = new HashSet(vector );
8、Collection和Collections的區別。
Collection是集合類別的上級接口,繼承他的接口主要有Set和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
9、Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==還是equals()?它們有何區別?
Set裡的元素是不能重複的,元素重複與否是使用equals()方法來判斷的。
==和equal差異也是考爛了的題,這裡說一下:
==運算子專門用來比較兩個變數的值是否相等,也就是用來比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用==運算子。
equals方法是用來比較兩個獨立物件的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個物件是獨立的。
例如:兩個new語句創建了兩個對象,然後用a/b這兩個變數分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a和b中儲存的數值是不相同的,所以,表達式a==b將傳回false,而這兩個物件中的內容是相同的,所以,表達式a.equals(b)將傳回true。
(相關教學推薦:java入門教學)
10、你所知道的集合類別都有哪些?主要方法?
最常用的集合類別是 List 和 Map。 List的具體實作包括 ArrayList和 Vector,它們是可變大小的列表,比較適合建構、儲存和操作任何類型物件的元素列表。 List適用於以數值索引存取元素的情況。
Map 提供了一個更通用的元素儲存方法。 Map集合類別用於儲存元素對(稱作"鍵"和"值"),其中每個鍵映射到一個值。
它們都有增刪改查的方法。
對於set,大概的方法是add,remove, contains等
對於map,大概的方法就是put,remove,contains等
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,這個自由發揮,也不是考記方法的能力,這些程式設計過程中會有提示,結合他們三者的不同說一下用法就行。
以上是java高頻率基礎面試題-集合框架部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!