18. java 容器都有哪些渗勘?
常用容器的圖錄:
19. Collection 和 Collections 有什么區(qū)別?
- java.util.Collection 是一個(gè)集合接口(集合類的一個(gè)頂級(jí)接口)库菲。它提供了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法颂翼。Collection接口在Java 類庫(kù)中有很多具體的實(shí)現(xiàn)韩玩。Collection接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式枪蘑,其直接繼承接口有List與Set损谦。
- Collections則是集合類的一個(gè)工具類/幫助類,其中提供了一系列靜態(tài)方法岳颇,用于對(duì)集合中元素進(jìn)行排序照捡、搜索以及線程安全等各種操作。
20. List赦役、Set麻敌、Map 之間的區(qū)別是什么?
21. HashMap 和 Hashtable 有什么區(qū)別?
- hashMap去掉了HashTable 的contains方法乙漓,但是加上了containsValue()和containsKey()方法级历。
- hashTable同步的,而HashMap是非同步的叭披,效率上比hashTable要高寥殖。
- hashMap允許空鍵值,而hashTable不允許涩蜘。
22. 如何決定使用 HashMap 還是 TreeMap嚼贡?
對(duì)于在Map中插入、刪除和定位元素這類操作同诫,HashMap是最好的選擇粤策。然而,假如你需要對(duì)一個(gè)有序的key集合進(jìn)行遍歷误窖,TreeMap是更好的選擇叮盘。基于你的collection的大小霹俺,也許向HashMap中添加元素會(huì)更快柔吼,將map換為TreeMap進(jìn)行有序key的遍歷。
23. 說(shuō)一下 HashMap 的實(shí)現(xiàn)原理丙唧?
- HashMap概述: HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)愈魏。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵想际。此類不保證映射的順序培漏,特別是它不保證該順序恒久不變。
- HashMap的數(shù)據(jù)結(jié)構(gòu): 在java編程語(yǔ)言中沼琉,最基本的結(jié)構(gòu)就是兩種北苟,一個(gè)是數(shù)組,另外一個(gè)是模擬指針(引用)打瘪,所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個(gè)基本結(jié)構(gòu)來(lái)構(gòu)造的友鼻,HashMap也不例外。HashMap實(shí)際上是一個(gè)“鏈表散列”的數(shù)據(jù)結(jié)構(gòu)闺骚,即數(shù)組和鏈表的結(jié)合體彩扔。
當(dāng)我們往Hashmap中put元素時(shí),首先根據(jù)key的hashcode重新計(jì)算hash值,根絕hash值得到這個(gè)元素在數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這個(gè)位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中該位置沒(méi)有元素,就直接將該元素放到數(shù)組的該位置上。
需要注意Jdk 1.8中對(duì)HashMap的實(shí)現(xiàn)做了優(yōu)化,當(dāng)鏈表中的節(jié)點(diǎn)數(shù)據(jù)超過(guò)八個(gè)之后,該鏈表會(huì)轉(zhuǎn)為紅黑樹(shù)來(lái)提高查詢效率,從原來(lái)的O(n)到O(logn)
24. 說(shuō)一下 HashSet 的實(shí)現(xiàn)原理僻爽?
- HashSet底層由HashMap實(shí)現(xiàn)
- HashSet的值存放于HashMap的key上
- HashMap的value統(tǒng)一為PRESENT
25. ArrayList 和 LinkedList 的區(qū)別是什么虫碉?
最明顯的區(qū)別是 ArrrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨機(jī)訪問(wèn)胸梆,而 LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表敦捧,不支持隨機(jī)訪問(wèn)须板。使用下標(biāo)訪問(wèn)一個(gè)元素,ArrayList 的時(shí)間復(fù)雜度是 O(1)兢卵,而 LinkedList 是 O(n)习瑰。
26. 如何實(shí)現(xiàn)數(shù)組和 List 之間的轉(zhuǎn)換?
- List轉(zhuǎn)換成為數(shù)組:調(diào)用ArrayList的toArray方法秽荤。
- 數(shù)組轉(zhuǎn)換成為L(zhǎng)ist:調(diào)用Arrays的asList方法甜奄。
27. ArrayList 和 Vector 的區(qū)別是什么?
- Vector是同步的窃款,而ArrayList不是课兄。然而,如果你尋求在迭代的時(shí)候?qū)α斜磉M(jìn)行改變晨继,你應(yīng)該使用CopyOnWriteArrayList烟阐。
- ArrayList比Vector快,它因?yàn)橛型锦馍裕粫?huì)過(guò)載曲饱。
- ArrayList更加通用,因?yàn)槲覀兛梢允褂肅ollections工具類輕易地獲取同步列表和只讀列表珠月。
28. Array 和 ArrayList 有何區(qū)別扩淀?
- Array可以容納基本類型和對(duì)象,而ArrayList只能容納對(duì)象啤挎。
- Array是指定大小后不可變的驻谆,而ArrayList大小是可變的。
- Array沒(méi)有提供ArrayList那么多功能庆聘,比如addAll胜臊、removeAll和iterator等。
29. 在 Queue 中 poll()和 remove()有什么區(qū)別伙判?
poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素象对,但是 poll() 在獲取元素失敗的時(shí)候會(huì)返回空,但是 remove() 失敗的時(shí)候會(huì)拋出異常宴抚。
30. 哪些集合類是線程安全的勒魔?
- vector:就比arraylist多了個(gè)同步化機(jī)制(線程安全),因?yàn)樾瘦^低菇曲,現(xiàn)在已經(jīng)不太建議使用冠绢。在web應(yīng)用中,特別是前臺(tái)頁(yè)面常潮,往往效率(頁(yè)面響應(yīng)速度)是優(yōu)先考慮的弟胀。
- statck:堆棧類,先進(jìn)后出。
- hashtable:就比hashmap多了個(gè)線程安全孵户。
- enumeration:枚舉萧朝,相當(dāng)于迭代器。
31. 迭代器 Iterator 是什么延届?
迭代器是一種設(shè)計(jì)模式剪勿,它是一個(gè)對(duì)象贸诚,它可以遍歷并選擇序列中的對(duì)象方庭,而開(kāi)發(fā)人員不需要了解該序列的底層結(jié)構(gòu)。迭代器通常被稱為“輕量級(jí)”對(duì)象酱固,因?yàn)閯?chuàng)建它的代價(jià)小械念。
32. Iterator 怎么使用?有什么特點(diǎn)运悲?
Java中的Iterator功能比較簡(jiǎn)單龄减,并且只能單向移動(dòng):
- 使用方法iterator()要求容器返回一個(gè)Iterator。第一次調(diào)用Iterator的next()方法時(shí)班眯,它返回序列的第一個(gè)元素希停。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
- 使用next()獲得序列中的下一個(gè)元素署隘。
- 使用hasNext()檢查序列中是否還有元素宠能。
- 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡(jiǎn)單的實(shí)現(xiàn)磁餐,為L(zhǎng)ist設(shè)計(jì)的ListIterator具有更多的功能违崇,它可以從兩個(gè)方向遍歷List,也可以從List中插入和刪除元素诊霹。
33. Iterator 和 ListIterator 有什么區(qū)別羞延?
- Iterator可用來(lái)遍歷Set和List集合,但是ListIterator只能用來(lái)遍歷List脾还。
- Iterator對(duì)集合只能是前向遍歷伴箩,ListIterator既可以前向也可以后向。
- ListIterator實(shí)現(xiàn)了Iterator接口鄙漏,并包含其他的功能嗤谚,比如:增加元素,替換元素泥张,獲取前一個(gè)和后一個(gè)元素的索引,等等媚创。