1. 程式人生 > >面試題-Java基礎-集合和數組

面試題-Java基礎-集合和數組

eset ria design iter 什麽 code zab 索引 鍵值對存儲

1.Java集合類框架的基本接口有哪些?

集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它自己的方式對元素進行保存和排序。有的集合類允許重復的鍵,有些不允許。
Java集合類提供了一套設計良好的支持對一組對象進行操作的接口和類。Java集合類裏面最基本的接口有:
Collection:代表一組對象,每一個對象都是它的子元素。
Set:不包含重復元素的Collection。
List:有順序的collection,並且可以包含重復元素。
Map:可以把鍵(key)映射到值(value)的對象,鍵不能重復。

2.為什麽集合類沒有實現Cloneable和Serializable接口?

克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。

3.什麽是叠代器(Iterator)?

Iterator接口提供了很多對集合元素進行叠代的方法。每一個集合類都包含了可以返回叠代器實例的

叠代方法。叠代器可以在叠代的過程中刪除底層集合的元素,但是不可以直接調用集合的 remove(Object Obj)刪除,可以通過叠代器的remove()方法刪除。 4.Iterator和ListIterator的區別是什麽? 下面列出了他們的區別:
Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。
ListIterator實現了Iterator接口,並包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。 5.快速失敗(fail-fast)和安全失敗(fail-safe)的區別是什麽?
Iterator的安全失敗是基於對底層集合做拷貝,因此,它不受源集合上修改的影響。java.util包下面的所有的集合類都是快速失敗的,而java.util.concurrent包下面的所有的類都是安全失敗的。快速失敗的叠代器會拋出ConcurrentModificationException異常,而安全失敗的叠代器永遠不會拋出這樣的異常。 6.Java中的HashMap的工作原理是什麽? Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。 7.hashCode()和equals()方法的重要性體現在什麽地方?
Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現這兩個方法,兩個不同的鍵可能會有相同的hash值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發現重復元素。所以這兩個方法的實現對HashMap的精確性和正確性是至關重要的。

8.HashMap和Hashtable有什麽區別?

HashMap和Hashtable都實現了Map接口,因此很多特性非常相似。但是,他們有以下不同點:
HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單線程環境,而Hashtable適合於多線程環境。
HashMap提供了可供應用叠代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。
一般認為Hashtable是一個遺留的類。

9.數組(Array)和列表(ArrayList)有什麽區別?什麽時候應該使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同點:
Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
Array大小是固定的,ArrayList的大小是動態變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

10.ArrayList和LinkedList有什麽區別?

ArrayList和LinkedList都實現了List接口,他們有以下的不同點:
ArrayList是基於索引的數據接口,它的底層是數組。它可以以O(1)時間復雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和後一個元素鏈接在一起,在這種情況下,查找某個元素的時間復雜度是O(n)。
相對於ArrayList,LinkedList的插入,添加,刪除操作速度更快,因為當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。
LinkedList比ArrayList更占內存,因為LinkedList為每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
也可以參考ArrayList vs. LinkedList。

11.Comparable和Comparator接口是幹什麽的?列出它們的區別。

Java提供了只包含一個compareTo()方法的Comparable接口。這個方法可以個給兩個對象排序。具體來說,它返回負數,0,正數來表明輸入對象小於,等於,大於已經存在的對象。
Java提供了包含compare()和equals()兩個方法的Comparator接口。compare()方法用來給兩個輸入參數排序,返回負數,0,正數表明第一個參數是小於,等於,大於第二個參數。equals()方法需要一個對象作為參數,它用來決定輸入參數是否和comparator相等。只有當輸入參數也是一個comparator並且輸入參數和當前comparator的排序結果是相同的時候,這個方法才返回true。

12.什麽是Java優先級隊列(Priority Queue)?

PriorityQueue是一個基於優先級堆的無界隊列,它的元素是按照自然順序(natural order)排序的。在創建的時候,我們可以給它提供一個負責給元素排序的比較器。PriorityQueue不允許null值,因為他們沒有自然順序,或者說他們沒有任何的相關聯的比較器。最後,PriorityQueue不是線程安全的,入隊和出隊的時間復雜度是O(log(n))。

13.你了解大O符號(big-O notation)麽?你能給出不同數據結構的例子麽?

大O符號描述了當數據結構裏面的元素增加的時候,算法的規模或者是性能在最壞的場景下有多麽好。
大O符號也可用來描述其他的行為,比如:內存消耗。因為集合類實際上是數據結構,我們一般使用大O符號基於時間,內存和性能來選擇最好的實現。大O符號可以對大量數據的性能給出一個很好的說明。

14.如何權衡是使用無序的數組還是有序的數組?

有序數組最大的好處在於查找的時間復雜度是O(log n),而無序數組是O(n)。有序數組的缺點是插入操作的時間復雜度是O(n),因為值大的元素需要往後移動來給新元素騰位置。相反,無序數組的插入時間復雜度是常量O(1)。

15.Java集合類框架的最佳實踐有哪些?

根據應用的需要正確選擇要使用的集合的類型對性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我們就應該用Array而不是ArrayList。
有些集合類允許指定初始容量。因此,如果我們能估計出存儲的元素的數目,我們可以設置初始容量來避免重新計算hash值或者是擴容。
為了類型安全,可讀性和健壯性的原因總是要使用泛型。同時,使用泛型還可以避免運行時的ClassCastException。
使用JDK提供的不變類(immutable class)作為Map的鍵可以避免為我們自己的類實現hashCode()和equals()方法。
編程的時候接口優於實現。
底層的集合實際上是空的情況下,返回長度是0的集合或者是數組,不要返回null。

16.Enumeration接口和Iterator接口的區別有哪些?

Enumeration速度是Iterator的2倍,同時占用更少的內存。但是,Iterator遠遠比Enumeration安全,因為其他線程不能夠修改正在被iterator遍歷的集合裏面的對象。同時,Iterator允許調用者刪除底層集合裏面的元素,這對Enumeration來說是不可能的。

17.HashSet和TreeSet有什麽區別?

HashSet是由一個hash表來實現的,因此,它的元素是無序的。add(),remove(),contains()方法的時間復雜度是O(1)。
另一方面,TreeSet是由一個樹形的結構來實現的,它裏面的元素是有序的。因此,add(),remove(),contains()方法的時間復雜度是O(logn)。

面試題-Java基礎-集合和數組