一、說一下ArrayList 和 Vector 的區(qū)別
(更過面試題推薦:java面試題)
1、同步性:Vector是線程安全的,用synchronized實現(xiàn)線程安全,而ArrayList是線程不安全的,如果只有一個線程會訪問到集合,那最好使用ArrayList,因為它不考慮線程安全,效率會高些;
如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們再去考慮和編寫線程安全的代碼。
2、數(shù)據(jù)容量增長:二者都有一個初始容量大小,采用線性連續(xù)存儲空間,當存儲的元素的個數(shù)超過了容量時,就需要增加二者的存儲空間,Vector增長原來的一倍,ArrayList增加原來的0.5倍。
二、為什么ArrayList線程不安全
對ArrayList進行添加元素的操作的時候是分兩個步驟進行的,即第一步先在object[size]的位置上存放需要添加的元素;第二步將size的值增加1。
由于這個過程在多線程的環(huán)境下是不能保證具有原子性的,因此ArrayList在多線程的環(huán)境下是線程不安全的。
(相關(guān)教程推薦:java入門教程)
三、HashMap、LinkedHashMap、TreeMap三者之間的區(qū)別是什么?
1、HashMap是一個最常用的Map,它根據(jù)鍵的hashCode值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多只允許一條記錄的鍵為null,不允許多條記錄的值為null。
HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap,可能會導致數(shù)據(jù)的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
2、Hashtable與HashMap類似,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,然而,這也導致了Hashtable在寫入時會比較慢。
3、LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。在遍歷的時候會比HashMap慢。有HashMap的全部特性。
4、TreeMap能夠把它保存的記錄根據(jù)鍵排序,默認是按升序排序,也可以指定排序的比較器。當用Iteraor遍歷TreeMap時,得到的記錄是排過序的。TreeMap的鍵和值都不能為空。
四、如何去掉一個 Vector 集合中重復的元素?
通過Vector.contains()方法判斷是否包含該元素,如果沒有包含就添加到新的集合當中,適用于數(shù)據(jù)較小的情況下。
還有一種簡單的方式,遍歷Vector,放入set、SortdSet、HashSet等。
(視頻教程推薦:java視頻教程)
五、List、Map、Set 三個接口,在存取元素時各有什么特點?
1、Set里面不允許有重復的元素
存元素:
add方法有一個boolean的返回值,當集合中沒有某個元素,此時add方法可成功加入該元素時,則返回true;當集合含有與某個元素equals相等的元素時,此時add方法無法加入該元素,返回結(jié)果為false。
取元素:
沒法說取第幾個,只能以Iterator接口取得所有的元素,再逐一遍歷各個元素。
2、List表示有先后順序的集合
存元素:
多次調(diào)用add(Object)方法時,每次加入的對象按先來后到的順序排序,也可以插隊,即調(diào)用add(int index,Object)方法,就可以指定當前對象在集合中的存放位置。
取元素:
方法1:Iterator接口取得所有,逐一遍歷各個元素。
方法2:調(diào)用get(index i)來明確說明取第幾個。使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標)來訪問List中的元素,這類似于Java的數(shù)組。
3、Map是雙列的集合
存元素:
用put方法,put(obj key,obj value),每次存儲時,要存儲一對key/value,不能存儲重復的key,這個重復的規(guī)則也是按equals比較相等。
取元素:
用get(Object key)方法根據(jù)key獲得相應的value。也可以獲得所有的key的集合,還可以獲得所有的value的集合,還可以獲得key和value組合成的Map.Entry對象的集合。
List以特定次序來持有元素,可有重復元素;Set 無法擁有重復元素,內(nèi)部排序;Map 保存key-value值,value可多值。