更新時(shí)間:2019-09-09 17:51:13 來源:動(dòng)力節(jié)點(diǎn) 瀏覽9537次
今天動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編為大家分享“2019 java集合面試題及答案”,下面就隨小編一起看看2019 java集合面試題有哪些?
1、Java集合類框架的基本接口有哪些?
集合類接口指定了一組叫做元素的對(duì)象。集合類接口的每一種具體的實(shí)現(xiàn)類都可以選擇以它自己的方式對(duì)元素進(jìn)行保存和排序。有的集合類允許重復(fù)的鍵,有些不允許。
Java集合類提供了一套設(shè)計(jì)良好的支持對(duì)一組對(duì)象進(jìn)行操作的接口和類。Java集合類里面最基本的接口有:
Collection:代表一組對(duì)象,每一個(gè)對(duì)象都是它的子元素。
Set:不包含重復(fù)元素的Collection。
List:有順序的collection,并且可以包含重復(fù)元素。
Map:可以把鍵(key)映射到值(value)的對(duì)象,鍵不能重復(fù)。
2、為什么集合類沒有實(shí)現(xiàn)Cloneable和Serializable接口?
克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實(shí)現(xiàn)相關(guān)的。因此,應(yīng)該由集合類的具體實(shí)現(xiàn)來決定如何被克隆或者是序列化。
3、什么是迭代器(Iterator)?
Iterator接口提供了很多對(duì)集合元素進(jìn)行迭代的方法。每一個(gè)集合類都包含了可以返回迭代器實(shí)例的
迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素,但是不可以直接調(diào)用集合的
remove(Object Obj)刪除,可以通過迭代器的remove()方法刪除。
4、Iterator和ListIterator的區(qū)別是什么?
下面列出了他們的區(qū)別:
Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
Iterator對(duì)集合只能是前向遍歷,ListIterator既可以前向也可以后向。
ListIterator實(shí)現(xiàn)了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個(gè)和后一個(gè)元素的索引,等等。
5、快速失敗(fail-fast)和安全失敗(fail-safe)的區(qū)別是什么?
Iterator的安全失敗是基于對(duì)底層集合做拷貝,因此,它不受源集合上修改的影響。java.util包下面的所有的集合類都是快速失敗的,而java.util.concurrent包下面的所有的類都是安全失敗的。快速失敗的迭代器會(huì)拋出ConcurrentModificationException異常,而安全失敗的迭代器永遠(yuǎn)不會(huì)拋出這樣的異常。
6、Java中的HashMap的工作原理是什么?
Java中的HashMap是以鍵值對(duì)(key-value)的形式存儲(chǔ)元素的。HashMap需要一個(gè)hash函數(shù),它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當(dāng)調(diào)用put()方法的時(shí)候,HashMap會(huì)計(jì)算key的hash值,然后把鍵值對(duì)存儲(chǔ)在集合中合適的索引上。如果key已經(jīng)存在了,value會(huì)被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負(fù)載因子(load factor)和擴(kuò)容極限(threshold resizing)。
7、hashCode()和equals()方法的重要性體現(xiàn)在什么地方?
Java中的HashMap使用hashCode()和equals()方法來確定鍵值對(duì)的索引,當(dāng)根據(jù)鍵獲取值的時(shí)候也會(huì)用到這兩個(gè)方法。如果沒有正確的實(shí)現(xiàn)這兩個(gè)方法,兩個(gè)不同的鍵可能會(huì)有相同的hash值,因此,可能會(huì)被集合認(rèn)為是相等的。而且,這兩個(gè)方法也用來發(fā)現(xiàn)重復(fù)元素。所以這兩個(gè)方法的實(shí)現(xiàn)對(duì)HashMap的精確性和正確性是至關(guān)重要的。
8、HashMap和Hashtable有什么區(qū)別?
HashMap和Hashtable都實(shí)現(xiàn)了Map接口,因此很多特性非常相似。但是,他們有以下不同點(diǎn):
HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環(huán)境,而Hashtable適合于多線程環(huán)境。
HashMap提供了可供應(yīng)用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對(duì)鍵的列舉(Enumeration)。
一般認(rèn)為Hashtable是一個(gè)遺留的類。
9、數(shù)組(Array)和列表(ArrayList)有什么區(qū)別?什么時(shí)候應(yīng)該使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同點(diǎn):
Array可以包含基本類型和對(duì)象類型,ArrayList只能包含對(duì)象類型。
Array大小是固定的,ArrayList的大小是動(dòng)態(tài)變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對(duì)于基本類型數(shù)據(jù),集合使用自動(dòng)裝箱來減少編碼工作量。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類型的時(shí)候,這種方式相對(duì)比較慢。
10、ArrayList和LinkedList有什么區(qū)別?
ArrayList和LinkedList都實(shí)現(xiàn)了List接口,他們有以下的不同點(diǎn):
ArrayList是基于索引的數(shù)據(jù)接口,它的底層是數(shù)組。它可以以O(shè)(1)時(shí)間復(fù)雜度對(duì)元素進(jìn)行隨機(jī)訪問。與此對(duì)應(yīng),LinkedList是以元素列表的形式存儲(chǔ)它的數(shù)據(jù),每一個(gè)元素都和它的前一個(gè)和后一個(gè)元素鏈接在一起,在這種情況下,查找某個(gè)元素的時(shí)間復(fù)雜度是O(n)。
相對(duì)于ArrayList,LinkedList的插入,添加,刪除操作速度更快,因?yàn)楫?dāng)元素被添加到集合任意位置的時(shí)候,不需要像數(shù)組那樣重新計(jì)算大小或者是更新索引。
LinkedList比ArrayList更占內(nèi)存,因?yàn)長inkedList為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素。
也可以參考ArrayList vs. LinkedList。
11、Comparable和Comparator接口是干什么的?列出它們的區(qū)別。
Java提供了只包含一個(gè)compareTo()方法的Comparable接口。這個(gè)方法可以個(gè)給兩個(gè)對(duì)象排序。具體來說,它返回負(fù)數(shù),0,正數(shù)來表明輸入對(duì)象小于,等于,大于已經(jīng)存在的對(duì)象。
Java提供了包含compare()和equals()兩個(gè)方法的Comparator接口。compare()方法用來給兩個(gè)輸入?yún)?shù)排序,返回負(fù)數(shù),0,正數(shù)表明第一個(gè)參數(shù)是小于,等于,大于第二個(gè)參數(shù)。equals()方法需要一個(gè)對(duì)象作為參數(shù),它用來決定輸入?yún)?shù)是否和comparator相等。只有當(dāng)輸入?yún)?shù)也是一個(gè)comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時(shí)候,這個(gè)方法才返回true。
12、什么是Java優(yōu)先級(jí)隊(duì)列(Priority Queue)?
PriorityQueue是一個(gè)基于優(yōu)先級(jí)堆的無界隊(duì)列,它的元素是按照自然順序(natural order)排序的。在創(chuàng)建的時(shí)候,我們可以給它提供一個(gè)負(fù)責(zé)給元素排序的比較器。PriorityQueue不允許null值,因?yàn)樗麄儧]有自然順序,或者說他們沒有任何的相關(guān)聯(lián)的比較器。最后,PriorityQueue不是線程安全的,入隊(duì)和出隊(duì)的時(shí)間復(fù)雜度是O(log(n))。
13、你了解大O符號(hào)(big-O notation)么?你能給出不同數(shù)據(jù)結(jié)構(gòu)的例子么?
大O符號(hào)描述了當(dāng)數(shù)據(jù)結(jié)構(gòu)里面的元素增加的時(shí)候,算法的規(guī)模或者是性能在最壞的場(chǎng)景下有多么好。
大O符號(hào)也可用來描述其他的行為,比如:內(nèi)存消耗。因?yàn)榧项悓?shí)際上是數(shù)據(jù)結(jié)構(gòu),我們一般使用大O符號(hào)基于時(shí)間,內(nèi)存和性能來選擇最好的實(shí)現(xiàn)。大O符號(hào)可以對(duì)大量數(shù)據(jù)的性能給出一個(gè)很好的說明。
14、如何權(quán)衡是使用無序的數(shù)組還是有序的數(shù)組?
有序數(shù)組最大的好處在于查找的時(shí)間復(fù)雜度是O(log n),而無序數(shù)組是O(n)。有序數(shù)組的缺點(diǎn)是插入操作的時(shí)間復(fù)雜度是O(n),因?yàn)橹荡蟮脑匦枰笠苿?dòng)來給新元素騰位置。相反,無序數(shù)組的插入時(shí)間復(fù)雜度是常量O(1)。
15、Java集合類框架的最佳實(shí)踐有哪些?
根據(jù)應(yīng)用的需要正確選擇要使用的集合的類型對(duì)性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我們就應(yīng)該用Array而不是ArrayList。
有些集合類允許指定初始容量。因此,如果我們能估計(jì)出存儲(chǔ)的元素的數(shù)目,我們可以設(shè)置初始容量來避免重新計(jì)算hash值或者是擴(kuò)容。
為了類型安全,可讀性和健壯性的原因總是要使用泛型。同時(shí),使用泛型還可以避免運(yùn)行時(shí)的ClassCastException。
使用JDK提供的不變類(immutable class)作為Map的鍵可以避免為我們自己的類實(shí)現(xiàn)hashCode()和equals()方法。
編程的時(shí)候接口優(yōu)于實(shí)現(xiàn)。
底層的集合實(shí)際上是空的情況下,返回長度是0的集合或者是數(shù)組,不要返回null。
16、Enumeration接口和Iterator接口的區(qū)別有哪些?
Enumeration速度是Iterator的2倍,同時(shí)占用更少的內(nèi)存。但是,Iterator遠(yuǎn)遠(yuǎn)比Enumeration安全,因?yàn)槠渌€程不能夠修改正在被iterator遍歷的集合里面的對(duì)象。同時(shí),Iterator允許調(diào)用者刪除底層集合里面的元素,這對(duì)Enumeration來說是不可能的。
17、HashSet和TreeSet有什么區(qū)別?
HashSet是由一個(gè)hash表來實(shí)現(xiàn)的,因此,它的元素是無序的。add(),remove(),contains()方法的時(shí)間復(fù)雜度是O(1)。
另一方面,TreeSet是由一個(gè)樹形的結(jié)構(gòu)來實(shí)現(xiàn)的,它里面的元素是有序的。因此,add(),remove(),contains()方法的時(shí)間復(fù)雜度是O(logn)。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編介紹的“2019 java集合面試題及答案”的內(nèi)容,希望對(duì)大家有幫助,更多java面試題請(qǐng)繼續(xù)關(guān)注動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會(huì)有精彩內(nèi)容分享與你。
相關(guān)java面試題推薦
2019年最全最新java面試題及答案:http://www.dabaquan.cn/tutorial_baseinterviewquestions/
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743