一、說ArrayList 和Vector 的差異
(更過面試題推薦:java面試題)
1、同步性:Vector是線程安全的,用synchronized實現線程安全,而ArrayList是線程不安全的,如果只有一個線程會訪問到集合,那最好使用ArrayList,因為它不考慮線程安全,效率會高些;
如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們再去考慮和編寫線程安全的程式碼。
2、資料容量成長:二者都有一個初始容量大小,採用線性連續儲存空間,當儲存的元素的數量超過了容量時,就需要增加二者的儲存空間,Vector成長原來的一倍,ArrayList增加原來的0.5倍。
二、為什麼ArrayList線程不安全
對ArrayList進行添加元素的操作的時候是分兩個步驟進行的,即第一步先在object[size]的位置上存放需要新增的元素;第二步將size的值增加1。
由於這個過程在多執行緒的環境下是不能保證具有原子性的,因此ArrayList在多執行緒的環境下是執行緒不安全的。
(相關教學推薦:java入門教學)
三、HashMap、LinkedHashMap、TreeMap三者之間的差異是什麼?
1、HashMap是一個最常用的Map,它根據鍵的hashCode值儲存數據,根據鍵可以直接取得它的值,具有很快的存取速度。 HashMap最多只允許一筆記錄的鍵為null,不允許多筆記錄的值為null。
HashMap不支援執行緒的同步,也就是任一時刻可以有多個執行緒同時寫入HashMap,可能會導致資料的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法讓HashMap具有同步的能力。
2、Hashtable與HashMap類似,不同的是:它不允許記錄的鍵或值為空;它支援執行緒的同步,即任一時刻只有一個執行緒能寫Hashtable,然而,這也導致了Hashtable在寫入時會比較慢。
3、LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。在遍歷的時候會比HashMap慢。有HashMap的全部特性。
4、TreeMap能夠把它儲存的記錄依照鍵排序,預設是按升序排序,也可以指定排序的比較器。當用Iteraor遍歷TreeMap時,所得到的記錄是排過序的。 TreeMap的鍵和值都不能為空。
四、如何去掉一個 Vector 集合中重複的元素?
透過Vector.contains()方法判斷是否包含該元素,若沒有包含就加入新的集合當中,適用於資料較小的情況。
還有一種簡單的方式,遍歷Vector,放入set、SortdSet、HashSet等。
(影片教學推薦:java影片教學)
五、List、Map、Set 三個接口,在存取元素時各有什麼特點?
1、Set裡面不允許有重複的元素
儲存元素:
add方法有一個boolean的回傳值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則傳回true;當集合含有與某個元素equals相等的元素時,此時add方法無法加入該元素,傳回結果為false。
取元素:
沒法說取第幾個,只能以Iterator介面取得所有的元素,再逐一遍歷各個元素。
2、List表示有先後順序的集合
存元素:
多次呼叫add(Object)方法時,每次加入的物件會依照先來後到的順序排序,也可以插隊,也就是呼叫add(int index,Object)方法,就可以指定目前物件在集合中的存放位置。
取元素:
方法1:Iterator介面取得所有,逐一遍歷各個元素。
方法2:呼叫get(index i)來明確說明取第幾個。使用此介面能夠精確的控制每個元素插入的位置。使用者能夠使用索引(元素在List中的位置,類似於陣列下標)來存取List中的元素,這類似於Java的陣列。
3、Map是雙列的集合
存元素:
用put方法,put(obj key,obj value),每次儲存時,要儲存一對key/value,不能儲存重複的key,這個重複的規則也是按equals比較相等。
取元素:
用get(Object key)方法根據key取得對應的value。也可以得到所有的key的集合,也可以得到所有的value的集合,也可以得到key和value組合成的Map.Entry物件的集合。
List以特定次序來持有元素,可有重複元素;Set 無法擁有重複元素,內部排序;Map 保存key-value值,value可多值。
以上是java經典面試題集錦(七)的詳細內容。更多資訊請關注PHP中文網其他相關文章!