安卓中高級開發(fā)面試之數(shù)據(jù)核心——數(shù)組集合高頻面試題及解析

為什么這兩個放在一起說懂拾,而沒有分開寫呢捅儒?

誠然液样,集合或者數(shù)組二者隨便其一,都不是一篇博客能寫完的巧还。但是在面試中鞭莽,面試官一般不會出很多這方面的面試題,所以我們把數(shù)組和集合放在一起寫一篇博客麸祷。本文只羅列幾個高頻題澎怒,不羅列難題和全面集合或數(shù)組的知識點。如果想知道更多集合或者數(shù)組的知識點阶牍,可以私我向我索取喷面。

話不多說,集合底層其實也是數(shù)組走孽。

1.Java集合框架是什么惧辈?說出一些集合框架的優(yōu)點?

每種編程語言中都有集合磕瓷,最初的Java版本包含幾種集合類:Vector盒齿、Stack、HashTable和Array困食。隨著集合的廣泛使用边翁,Java1.2提出了囊括所有集合接口、實現(xiàn)和算法的集合框架陷舅。在保證線程安全的情況下使用泛型和并發(fā)集合類倒彰,Java已經(jīng)經(jīng)歷了很久。它還包括在Java并發(fā)包中莱睁,阻塞接口以及它們的實現(xiàn)待讳。集合框架的部分優(yōu)點如下:

(1)使用核心集合類降低開發(fā)成本芒澜,而非實現(xiàn)我們自己的集合類。

(2)隨著使用經(jīng)過嚴格測試的集合框架類创淡,代碼質(zhì)量會得到提高痴晦。

(3)通過使用JDK附帶的集合類,可以降低代碼維護成本琳彩。

(4)復用性和可操作性誊酌。

2.集合框架中的泛型有什么優(yōu)點?

Java1.5引入了泛型露乏,所有的集合接口和實現(xiàn)都大量地使用它碧浊。泛型允許我們?yōu)榧咸峁┮粋€可以容納的對象類型,因此瘟仿,如果你添加其它類型的任何元素箱锐,它會在編譯時報錯。這避免了在運行時出現(xiàn)ClassCastException劳较,因為你將會在編譯時得到報錯信息驹止。泛型也使得代碼整潔,我們不需要使用顯式轉(zhuǎn)換和instanceOf操作符观蜗。它也給運行時帶來好處臊恋,因為不會產(chǎn)生類型檢查的字節(jié)碼指令。

3.Iterator是什么墓捻?

Iterator接口提供遍歷任何Collection的接口抖仅。我們可以從一個Collection中使用迭代器方法來獲取迭代器實例。迭代器取代了Java集合框架中的Enumeration毙替。迭代器允許調(diào)用者在迭代過程中移除元素岸售。

4.Iterater和ListIterator之間有什么區(qū)別?

(1)我們可以使用Iterator來遍歷Set和List集合厂画,而ListIterator只能遍歷List。

(2)Iterator只可以向前遍歷拷邢,而LIstIterator可以雙向遍歷袱院。

(3)ListIterator從Iterator接口繼承,然后添加了一些額外的功能瞭稼,比如添加一個元素忽洛、替換一個元素、獲取前面或后面元素的索引位置环肘。

5.在Java中欲虚,HashMap是如何工作的?

HashMap在Map.Entry靜態(tài)內(nèi)部類實現(xiàn)中存儲key-value對悔雹。HashMap使用哈希算法复哆,在put和get方法中欣喧,它使用hashCode()和equals()方法。當我們通過傳遞key-value對調(diào)用put方法的時候梯找,HashMap使用Key

hashCode()和哈希算法來找出存儲key-value對的索引唆阿。Entry存儲在LinkedList中,所以如果存在entry锈锤,它使用equals()方法來檢查傳遞的key是否已經(jīng)存在驯鳖,如果存在,它會覆蓋value久免,如果不存在浅辙,它會創(chuàng)建一個新的entry然后保存。當我們通過傳遞key調(diào)用get方法時阎姥,它再次使用hashCode()來找到數(shù)組中的索引记舆,然后使用equals()方法找出正確的Entry,然后返回它的值丁寄。下面的圖片解釋了詳細內(nèi)容氨淌。

其它關(guān)于HashMap比較重要的問題是容量、負荷系數(shù)和閥值調(diào)整伊磺。HashMap默認的初始容量是32盛正,負荷系數(shù)是0.75。閥值是為負荷系數(shù)乘以容量屑埋,無論何時我們嘗試添加一個entry豪筝,如果map的大小比閥值大的時候,HashMap會對map的內(nèi)容進行重新哈希摘能,且使用更大的容量续崖。容量總是2的冪,所以如果你知道你需要存儲大量的key-value對团搞,比如緩存從數(shù)據(jù)庫里面拉取的數(shù)據(jù)严望,使用正確的容量和負荷系數(shù)對HashMap進行初始化是個不錯的做法

6.hashCode()和equals()方法有何重要性?(這一個問題我在前文中有專門寫一篇博客講述)

HashMap使用Key對象的hashCode()和equals()方法去決定key-value對的索引逻恐。當我們試著從HashMap中獲取值的時候像吻,這些方法也會被用到。如果這些方法沒有被正確地實現(xiàn)复隆,在這種情況下拨匆,兩個不同Key也許會產(chǎn)生相同的hashCode()和equals()輸出,HashMap將會認為它們是相同的挽拂,然后覆蓋它們惭每,而非把它們存儲到不同的地方。同樣的亏栈,所有不允許存儲重復數(shù)據(jù)的集合類都使用hashCode()和equals()去查找重復台腥,所以正確實現(xiàn)它們非常重要宏赘。equals()和hashCode()的實現(xiàn)應該遵循以下規(guī)則:

(1)如果o1.equals(o2),那么o1.hashCode()== o2.hashCode()總是為true的览爵。

(2)如果o1.hashCode() == o2.hashCode()置鼻,并不意味著o1.equals(o2)會為true。

7.HashMap和HashTable有何不同蜓竹?

(1)HashMap允許key和value為null箕母,而HashTable不允許。

(2)HashTable是同步的俱济,而HashMap不是嘶是。所以HashMap適合單線程環(huán)境,HashTable適合多線程環(huán)境蛛碌。

(3)在Java1.4中引入了LinkedHashMap聂喇,HashMap的一個子類,假如你想要遍歷順序蔚携,你很容易從HashMap轉(zhuǎn)向LinkedHashMap希太,但是HashTable不是這樣的,它的順序是不可預知的酝蜒。

(4)HashMap提供對key的Set進行遍歷誊辉,因此它是fail-fast的,但HashTable提供對key的Enumeration進行遍歷亡脑,它不支持fail-fast堕澄。

(5)HashTable被認為是個遺留的類,如果你尋求在迭代的時候修改Map霉咨,你應該使用CocurrentHashMap蛙紫。

8.ArrayList和Vector有何異同點?

ArrayList和Vector在很多時候都很類似途戒。

(1)兩者都是基于索引的坑傅,內(nèi)部由一個數(shù)組支持。

(2)兩者維護插入的順序喷斋,我們可以根據(jù)插入順序來獲取元素裁蚁。

(3)ArrayList和Vector的迭代器實現(xiàn)都是fail-fast的。

(4)ArrayList和Vector兩者允許null值继准,也可以使用索引值對元素進行隨機訪問。

以下是ArrayList和Vector的不同點矮男。

(1)Vector是同步的移必,而ArrayList不是。然而毡鉴,如果你尋求在迭代的時候?qū)α斜磉M行改變崔泵,你應該使用CopyOnWriteArrayList秒赤。

(2)ArrayList比Vector快,它因為有同步憎瘸,不會過載入篮。

(3)ArrayList更加通用,因為我們可以使用Collections工具類輕易地獲取同步列表和只讀列表幌甘。

9.Array和ArrayList有何區(qū)別潮售?什么時候更適合用Array?

Array可以容納基本類型和對象锅风,而ArrayList只能容納對象酥诽。

Array是指定大小的,而ArrayList大小是固定的皱埠。

Array沒有提供ArrayList那么多功能肮帐,比如addAll、removeAll和iterator等边器。盡管ArrayList明顯是更好的選擇训枢,但也有些時候Array比較好用。

(1)如果列表的大小已經(jīng)指定忘巧,大部分情況下是存儲和遍歷它們恒界。

(2)對于遍歷基本數(shù)據(jù)類型,盡管Collections使用自動裝箱來減輕編碼任務袋坑,在指定大小的基本類型的列表上工作也會變得很慢仗处。

(3)如果你要使用多維數(shù)組,使用[][]比List<List<>>更容易

10.當一個集合被作為參數(shù)傳遞給一個函數(shù)時枣宫,如何才可以確保函數(shù)不能修改它婆誓?

在作為參數(shù)傳遞之前,我們可以使用Collections.unmodifiableCollection(Collection c)方法創(chuàng)建一個只讀集合也颤,這將確保改變集合的任何操作都會拋出UnsupportedOperationException洋幻。

11.說一下鏈表跟數(shù)組的區(qū)別

鏈表:用一組任意儲存單元存放線性表的數(shù)據(jù)元素,并且通過指針鏈相接結(jié)點的序列稱為鏈表翅娶。是一種常見的數(shù)據(jù)組織形式文留,它采用了動態(tài)分配內(nèi)存的形式實現(xiàn)。需要時可以用new分配內(nèi)存空間竭沫,不需要時用delete將已分配的空間釋放燥翅,不會造成內(nèi)存空間的浪費。不靠數(shù)組實現(xiàn)蜕提,沒有下標森书。數(shù)組必須事先定義固定的長度,不能適應數(shù)據(jù)動態(tài)增減的情況。當數(shù)據(jù)增加時凛膏,可能超出原先定義的元素個數(shù)杨名;當數(shù)據(jù)減少時,造成數(shù)據(jù)浪費猖毫。在使用的時候還要數(shù)組初始化台谍,注意數(shù)組的下標越界。

12.ArrayList集合加入1萬條數(shù)據(jù)吁断,應該怎么提高效率

因為ArrayList的底層是數(shù)組實現(xiàn),并且數(shù)組的默認值是10,如果插入10000條要不斷的擴容,耗費時間,所以我們調(diào)用ArrayList的指定容量的構(gòu)造器方法ArrayList(int size) 就可以實現(xiàn)不擴容,就提高了性能

最后給大家出一個高頻面試題:隊列和棧是什么趁蕊,列出它們的區(qū)別?各位自己去查吧胯府,這個問題我就不做解答了介衔。

給大家一個提示:棧和隊列兩者都被用來預存儲數(shù)據(jù)。java.util.Queue是一個接口骂因,它的實現(xiàn)類在Java并發(fā)包中炎咖。隊列允許先進先出(FIFO)檢索元素,但并非總是這樣寒波。Deque接口允許從兩端檢索元素乘盼。

棧與隊列很相似,但它允許對元素進行后進先出(LIFO)進行檢索俄烁。

Stack是一個擴展自Vector的類绸栅,而Queue是一個接口。

隊列的兩個基本操作:一個是插入一個數(shù)據(jù)項页屠,即把一個數(shù)據(jù)項放入隊尾另一個是移除一個數(shù)據(jù)項粹胯,即移除隊頭的數(shù)據(jù)項.


最后給大家來一個開心一笑


給你一個寫注釋的機會,寫完就走吧
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辰企,一起剝皮案震驚了整個濱河市风纠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牢贸,老刑警劉巖竹观,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潜索,居然都是意外死亡臭增,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門竹习,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誊抛,“玉大人,你說我怎么就攤上這事整陌∩置” “怎么了昔园?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長并炮。 經(jīng)常有香客問我,道長甥郑,這世上最難降的妖魔是什么逃魄? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮澜搅,結(jié)果婚禮上伍俘,老公的妹妹穿的比我還像新娘。我一直安慰自己勉躺,他們只是感情好癌瘾,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饵溅,像睡著了一般妨退。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜕企,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天咬荷,我揣著相機與錄音,去河邊找鬼轻掩。 笑死幸乒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的唇牧。 我是一名探鬼主播罕扎,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丐重!你這毒婦竟也來了腔召?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弥臼,失蹤者是張志新(化名)和其女友劉穎宴咧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體径缅,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡掺栅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纳猪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氧卧。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氏堤,靈堂內(nèi)的尸體忽然破棺而出沙绝,到底是詐尸還是另有隱情搏明,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布闪檬,位于F島的核電站星著,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粗悯。R本人自食惡果不足惜虚循,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望样傍。 院中可真熱鬧横缔,春花似錦、人聲如沸衫哥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撤逢。三九已至膛锭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛质,已是汗流浹背泉沾。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妇押,地道東北人跷究。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像敲霍,于是被迫代替她去往敵國和親俊马。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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

  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,942評論 0 13
  • ArrayList實現(xiàn)原理要點概括 參考文獻:http://zhangshixi.iteye.com/blog/6...
    晨光光閱讀 1,068評論 0 1
  • 開發(fā)項目的時候肩杈,項目進行分工柴我,當同事要啟用自己寫的活動時(活動啟動時需要傳入?yún)?shù),以初始化活動)扩然,為減少麻煩艘儒,提升...
    大話程序閱讀 266評論 0 0
  • 我們有的人阿,總是習慣給別人留一個幾乎于完美的形象,但是世上哪有那么完美的人呢。光鮮外表下的樸素的本質(zhì)米丘,那才是你...
    沒錯我叫正能量阿閱讀 378評論 0 0
  • 淡然于心蠢涝,從容于表捏题,優(yōu)雅自在地生活。追求就會有失望;活著就會有煩惱。不要把什么都看得那么真访惜、那么重嘹履。人生最怕什么都...
    漂浮的流云閱讀 352評論 0 2