Java集合框架

Java集合框架

(例如基本的數(shù)據(jù)結(jié)構(gòu))里包含了最常見的Java常見面試問題。很好地理解集合框架,可以幫助你理解和利用Java的一些高級特性。

常見的數(shù)據(jù)結(jié)構(gòu)

數(shù)組是最常用的數(shù)據(jù)結(jié)構(gòu)。數(shù)組的特點是長度固定,可以用下標(biāo)索引,并且所有的元素的類型都是一致的。數(shù)組常用的場景有把:從數(shù)據(jù)庫里讀取雇員的信息存儲為EmployeeDetail[],把一個字符串轉(zhuǎn)換并存儲到一個字節(jié)數(shù)組中便于操作和處理,等等。盡量把數(shù)組封裝在一個類里,防止數(shù)據(jù)被錯誤的操作弄亂。另外,這一點也適合其他的數(shù)據(jù)結(jié)構(gòu)。

列表和數(shù)組很相似,只不過它的大小可以改變。列表一般都是通過一個固定大小的數(shù)組來實現(xiàn)的,并且會在需要的時候自動調(diào)整大小。列表里可以包含重復(fù)的元素。常用的場景有,添加一行新的項到訂單列表里,把所有過期的商品移出商品列表,等等。一般會把列表初始化成一個合適的大小,以減少調(diào)整大小的次數(shù)。

集合和列表很相似,不過它不能放重復(fù)的元素。當(dāng)你需要存儲不同的元素時,你可以使用集合。

堆棧只允許對最后插入的元素進行操作(也就是后進先出,Last In First Out – LIFO)。如果你移除了棧頂?shù)脑兀敲茨憧梢圆僮鞯箶?shù)第二個元素,依次類推。這種后進先出的方式是通過僅有的peek(),push()和pop()這幾個方法的強制性限制達到的。這種結(jié)構(gòu)在很多場景下都非常實用,例如解析像(4+2)*3這樣的數(shù)學(xué)表達式,把源碼中的方法和異常按照他們出現(xiàn)的順序放到堆棧中,檢查你的代碼看看小括號和花括號是不是匹配的,等等。

常被面試官問到的問題

1.為什么Map接口不繼承Collection 接口?

Set是無序集合,并且不允許重復(fù)的元素

List是有序的集合,并且允許重復(fù)的元素

而Map是鍵值對

它被視為是鍵的set和值的set的組合

Map被設(shè)計為鍵值對的集合,所以不需要繼承Collection 接口

2.HashMap和Hashtable之間的區(qū)別?

同步或線程安全

Null鍵和Null值

迭代值

默認容量大小

3.comparable 和 comparator的不同之處?

comparable接口實際上是出自java.lang包

它有一個 compareTo(Object obj)方法來將objects排序

comparator接口實際上是出自 java.util 包

它有一個compare(Object obj1, Object obj2)方法來將objects排序

4.如何對Object的list排序?

對objects數(shù)組進行排序,我們可以用Arrays.sort()方法

如果要對objects的集合進行排序,需要使用Collections.sort()方法

5. fail-fast 與 fail-safe 之間的區(qū)別?

Fail fast快速地報告任何的failure。無論何時任何一個問題都會引發(fā) fail fast系統(tǒng)fails

在Java Fail fast 迭代器中,迭代objects集合有時會出現(xiàn)并發(fā)修改異常,出現(xiàn)這種情況有2個原因

如果一個線程正在迭代一個集合,而另一個線程同時試圖修改這個集合

在調(diào)用remove()方法后,如何我們還試圖去修改集合object

6. Iterator、ListIterator 和 Enumeration的區(qū)別?

Enumeration接口在Java1.2版本開始有,所以Enumeration是合法規(guī)范的接口

Enumeration使用elements()方法

Iterator對所有Java集合類都有實現(xiàn)

Iterator使用iterator方法

Iterator只能往一個方向前進

ListIterator僅僅對List類型的類實現(xiàn)了

ListIterator使用listIterator()方法

7.Java 中 Set 與 List 有什么不同?

Set是一個不允許重復(fù)元素存在的集合

Set沒有索引

Set僅僅允許一個null值

Set有類:HashSet、LinkedHashMap、TreeSet

List有索引

List允許N個null值

List可以按插入順序顯示

List有類:Vector、ArrayList、LinkedList

8. arraylist 與 vector 的區(qū)別?

Vector 在Java的第一個版本就引入了,也就是說vector是一個合法規(guī)范的類

ArrayList在Java1.2版本引入的,是Java 集合框架的組成部分

Vector是同步的

ArrayList是不同步的

9.什么類實現(xiàn)了List接口?

ArrayList

LinkedList

Vector

10.什么類實現(xiàn)了Set接口?

HashSet

LinkedHashSet

TreeSet

11.如何保證一個集合線程安全?

Vector, Hashtable, Properties 和 Stack 都是同步的類,所以它們都線程安全的,可以被使用在多線程環(huán)境中

使用Collections.synchronizedList(list)) 方法,可以保證list類是線程安全的

使用java.util.Collections.synchronizedSet()方法可以保證set類是線程安全的

12.是否可以往 TreeSet 或者 HashSet 中添加 null 元素?

可以往 hashset 中添加一個 null

TreeSet 也允許一個 null值

13.解釋下Collection的接口繼承關(guān)系?

14.Iterator符合哪個設(shè)計模式?

Iterator 設(shè)計模式

15.HashSet 實現(xiàn)了哪個數(shù)據(jù)結(jié)構(gòu)?

HashSet 內(nèi)部實現(xiàn)了hashmap

16.為什么 Collection 不能繼承 Cloneable 和 Serializable?

List和Set唯一繼承 Collection 接口

SortedMap 繼承了 Map 接口

17.hashCode() 和 equals() 方法的重要性?如何在Java中使用它們?

hashCode() 和 equals() 方法定義在”object”類中

如果equals() 方法在比較2個對象時返回true,那么hashCode()的返回值必須得一樣

18.array 和 arraylist 的區(qū)別?

Array類似object集合類型,大小固定

Arraylist是同質(zhì)和異質(zhì)元素的集合

19.什么是 Properties 類?

Properties 是Hashtable的子類。它被用于維護值的list,其中它們的鍵、值都是String類型

20.如何將一個字符串轉(zhuǎn)換為arraylist?

使用 arrayList.toArray() 方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容