Java集合類(lèi)提供了一套設(shè)計(jì)良好的支持對(duì)一組對(duì)象進(jìn)行操作的接口和類(lèi)洼畅。
1、Java集合類(lèi)里面最基本的接口棚赔?
Collection:代表一組對(duì)象帝簇,每一個(gè)對(duì)象都是是它的子元素徘郭。
Set:不包含重復(fù)元素的Collection。
List:有順序的Collection丧肴,可重復(fù)残揉。
Map:Key-Value,Key不重復(fù)芋浮。
2抱环、集合類(lèi)為什么沒(méi)有實(shí)現(xiàn)Cloneable和Serializable接口?
集合類(lèi)接口指定了一組叫做元素的對(duì)象纸巷。集合類(lèi)接口的每一種具體的實(shí)現(xiàn)類(lèi)都可以選擇以它自己的方式對(duì)元素進(jìn)行保存和排序镇草。有的集合類(lèi)允許重復(fù)的鍵,有些不允許何暇。
克隆(cloning)或者是序列化(serialization)的語(yǔ)義和含義是跟具體的實(shí)現(xiàn)相關(guān)的陶夜。因此凛驮,應(yīng)該由集合類(lèi)的具體實(shí)現(xiàn)來(lái)決定如何被克隆或者是序列化裆站。
3、什么是迭代器(Iterator)?
Iterator接口提供了很多對(duì)集合元素進(jìn)行迭代的方法黔夭。每個(gè)集合類(lèi)都包含了可能返回 迭代器的實(shí)例的迭代方法宏胯。迭代器可以在迭代的過(guò)程中刪除底層集合的元素。
4本姥、Iterator和ListIterator的區(qū)別肩袍?
Iterator可遍歷Set,List集合婚惫,ListIterator只能遍歷List氛赐。
Iterator對(duì)集合只能向前遍歷,ListIterator可向前也可向后遍歷先舷。
ListIterator實(shí)現(xiàn)了Iterator接口艰管,并包含了其他功能。例如蒋川,增加元素牲芋,替換元素,獲取前一個(gè)和后一個(gè)元素的索引等等捺球。
5缸浦、HashMap的工作原理?
鍵值對(duì)形式存儲(chǔ)氮兵。HashMap有一個(gè)Hash()函數(shù)裂逐,它使用hashCode()和equals方法來(lái)向集合/從集合添加/檢索元素。當(dāng)使用put()方法時(shí)泣栈,HashMap會(huì)計(jì)算key的hash值絮姆,然后將鍵值對(duì)存儲(chǔ)在集合中合適的索引上醉冤。若key已存在,則更新value值篙悯。HashMap重要特性:容量(capacity)蚁阳,負(fù)載因子(load factor),擴(kuò)容極限(threshold resizing)鸽照。
6螺捐、hashCode()和equals()方法的重要性體現(xiàn)在?
這兩個(gè)方法用來(lái)確定鍵值對(duì)的索引矮燎,也用來(lái)發(fā)現(xiàn)重復(fù)元素定血。
7、HashMap秘HashTable區(qū)別诞外?
均實(shí)現(xiàn)Map接口澜沟。
HashMap允許鍵值是null(僅一個(gè)),HashTable峡谊,key不能為null茫虽。
HashTable同步,適合于多線程既们,HashMap不同步濒析,適用于單線程環(huán)境。
HashMap提供了可供應(yīng)用迭代的鍵的集合啥纸。HashTable提供了對(duì)鍵的列表 (Enumeration)号杏。
HashMap與HashTable保存key的方式與HashSet保存集合元素的要求完全相同。
若需要?jiǎng)?chuàng)建線程安全的Map實(shí)現(xiàn)類(lèi)斯棒,無(wú)須使用HashTable實(shí)現(xiàn)類(lèi)盾致,可能過(guò)Collections類(lèi)。
與HashSet類(lèi)似的是:盡量不要使用可變對(duì)象為HashMap荣暮,HashTable的key庭惜。
8、Array與ArrayList的區(qū)別渠驼?
Array可包含基本類(lèi)型和對(duì)象類(lèi)型蜈块,ArrayList只能包含對(duì)象類(lèi)型。
Array大小固定迷扇,ArrayList大小動(dòng)態(tài)變化百揭。
ArrayList提供了更多方法和特性:AddAll(),removeAll()蜓席,iterator()器一。
對(duì)于基本類(lèi)型數(shù)據(jù)狡刘,集合使用自動(dòng)裝箱來(lái)減少編碼工作量缤言。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類(lèi)型的時(shí)候,這種方式相對(duì)比較慢六水。
9颅围、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來(lái)說(shuō)是不可能的
10、HashSet和TreeSet區(qū)別委粉?
HashSet由一個(gè)hash表實(shí)現(xiàn)呜师,元素?zé)o序。add()贾节,remove()汁汗,contains()。方法的時(shí)間復(fù)雜度O(1)氮双。
TreeSet由樹(shù)形結(jié)構(gòu)來(lái)實(shí)現(xiàn)碰酝,元素有序霎匈。add()戴差,remove(),Contains()方法時(shí)間復(fù)雜度O(logn)铛嘱。
11暖释、Collection和Collections類(lèi)區(qū)別?
Collection類(lèi)是集合類(lèi)的上級(jí)接口墨吓。
Collections是針對(duì)集合的一個(gè)幫助者類(lèi)球匕,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)集合的搜索、排序帖烘、線程安全化等操作亮曹。
12、Set判斷兩個(gè)對(duì)象相同使用equals()方法秘症,而不是"=="照卦。
13、HashSet集合判斷兩個(gè)元素相等乡摹?
HashSet采用hash算法來(lái)決定元素的存儲(chǔ)位置役耕。HashSet存入一個(gè)元素,HashSet會(huì)調(diào)用該對(duì)象的hashCode方法得到該對(duì)象的HashCode值聪廉,根據(jù)此值決定在HashSet中的存儲(chǔ)位置瞬痘。因此故慈,兩個(gè)判斷兩個(gè)對(duì)象相等,需要判斷equals()方法返回相等框全,以及hashCode()值相等察绷。底層采用數(shù)組存儲(chǔ)Key-Value對(duì)。
14津辩、LinkedHashSet
LinckedHashSet用鏈表來(lái)記錄集合元素的添加順序克婶,但其依然是個(gè)HashSet,不允許重復(fù)丹泉。
14情萤、使用Properties讀寫(xiě)屬性文件
將Map對(duì)象與屬性文件關(guān)聯(lián)起來(lái),即可以把Map對(duì)象中的key-value對(duì)寫(xiě)入(stroe()方法)屬性文件中摹恨,也可以把屬性文件中的“屬性名=屬性值”加載(load()方法)到Map對(duì)象中筋岛。
Properties里的key,value都是字符串類(lèi)型晒哄。
14睁宰、SortedMap接口與TreeMap
Map接口 - SortedMap接口 - TreeMap實(shí)現(xiàn)類(lèi)
TreeMap:紅黑樹(shù)數(shù)據(jù)結(jié)構(gòu)。其排序方式:自然排序寝凌,定制排序柒傻,見(jiàn)16。
14较木、WeakHashMap
與HashMap用法基本相似红符。
區(qū)別是HashMap的key強(qiáng)引用,key所引用的對(duì)象不會(huì)被垃圾回收伐债,WeakHashMap的key弱引用预侯,key所引用的對(duì)象可能被垃圾回收。
14峰锁、IdentifyHashMap
IdenfityHashMap:當(dāng)且僅當(dāng)兩個(gè)key嚴(yán)格相等(==)萎馅。
HashMap:equals()返回true,hashCode相同虹蒋。
15糜芳、Treeset
采用紅黑樹(shù)的結(jié)構(gòu)存儲(chǔ)集合元素。TreeSet會(huì)調(diào)用元素的compareTo(Object obj)方法比較兩個(gè)元素大小魄衅。向TreeSet集合中添加第一個(gè)元素時(shí)無(wú)須有compareTo方法峭竣,添加第二個(gè)元素時(shí)便會(huì)引發(fā)異常。向TreeSet集合中添加的元素必須有comopareTo方法徐绑。Java提供了一個(gè)Comparable接口邪驮,接口中定義了compareTo(Object obj)方法。TreeSet中添加的應(yīng)該是同一個(gè)類(lèi)的對(duì)象傲茄,否則引發(fā)異常毅访。對(duì)于TreeSet來(lái)說(shuō)判斷兩個(gè)對(duì)象是否相等的唯一標(biāo)準(zhǔn)是compareto方法返回是否是0沮榜。若在TreeSet中添加的對(duì)象,重寫(xiě)此對(duì)象的equals方法喻粹,需要保證equals方法與compareTo方法比較結(jié)果一致蟆融。推薦TreeSet和HashSet集合中添加不可變?cè)亍?/p>
16、自然排序守呜,定制排序型酥?
自然排序:實(shí)例對(duì)象的compareTo方法進(jìn)行比較,并按升序排列查乒。
定制排序:TreeSet中有一個(gè)方法弥喉,Comparator comparator():返回定制排序排序所使用的Comparator,如果是自然排序玛迄,則返回null由境。TreeSet treeSet = new TreeSet("傳入寫(xiě)好的Comparator實(shí)例對(duì)象")。Comparator接口中含有方法compare(T o1,T o2):用來(lái)比較兩個(gè)對(duì)象大小蓖议。TreeSet實(shí)現(xiàn)定制排序時(shí)虏杰,仍然不可以添加不同類(lèi)型的對(duì)象。
17勒虾、List判斷兩個(gè)對(duì)象的標(biāo)準(zhǔn)是什么纺阔?
equals()方法返回true。List在刪除元素時(shí)修然,List會(huì)調(diào)用該對(duì)象的equals()方法集資與集合元素進(jìn)行比較笛钝,如果該equals()方法以某個(gè)集合元素作為參數(shù)時(shí)返回true,List將會(huì)刪除該元素低零。List提供了iterator()(返回Iterator對(duì)象)婆翔,IistIterator()(返回ListIiterator對(duì)象)方法拯杠。ListIterator接口繼承了Iterator接口掏婶。
18、ArrayList與Vector
基于動(dòng)態(tài)數(shù)據(jù)潭陪,內(nèi)置可再分配的Object[]數(shù)組雄妥。
ArrayList與Vector設(shè)有參數(shù)initialCapacity設(shè)置該數(shù)組長(zhǎng)度,當(dāng)元素超出該數(shù)組長(zhǎng)度時(shí)依溯,initialCapacity自動(dòng)增加老厌。
當(dāng)添加大量元素時(shí),使用ensureCapacity(int minCapacity)一次性設(shè)置initicalCapacity黎炉,減少重新分配次數(shù)枝秤。
Object[]默認(rèn)長(zhǎng)度10。
ArrayList與Vector重新分配Object[]的兩個(gè)方法:
void ensureCapacity(int minCapacity):數(shù)組長(zhǎng)度增加minCapacity慷嗜。
void trimToSize():數(shù)組長(zhǎng)度為當(dāng)前元素個(gè)數(shù)淀弹。
Vector線程安全丹壕,ArrayList線程不安全。
Collections工具類(lèi)薇溃,可以將ArrayList變成線程安全菌赖。
19、固定長(zhǎng)度的List
數(shù)組操作類(lèi)Arrays沐序,提供了asList(Object....)方法琉用,將數(shù)組或多個(gè)對(duì)象轉(zhuǎn)換成一個(gè)List對(duì)象。
但這個(gè)List集合即不是ArrayList實(shí)現(xiàn)類(lèi)的實(shí)例策幼,也不是Vector實(shí)現(xiàn)類(lèi)的實(shí)例邑时,而且Arrays的肉類(lèi)部的ArrayList的實(shí)例。
即Arrays.ArrayList是一個(gè)固定長(zhǎng)度的List集合特姐,只能遍歷訪問(wèn)訪該集合里的元素刁愿,不能添加和刪除集合里的元素。(添加或刪除到逊,編譯不會(huì)報(bào)錯(cuò)铣口,運(yùn)行時(shí)會(huì)報(bào)錯(cuò))。
20觉壶、Queue
Queue有一個(gè)PriorityQueue實(shí)現(xiàn)類(lèi)脑题,一個(gè)Deque接口。
Deque提供了ArrayDeque和LinkedList兩個(gè)都實(shí)現(xiàn)類(lèi)铜靶。
21叔遂、PriorityQueue
保存隊(duì)列元素的順序并不是按加入隊(duì)列的順序,而是按隊(duì)列元素的大小進(jìn)行重新排序争剿。
不允許加入null元素已艰,因?yàn)樾枰獙?duì)隊(duì)列元素進(jìn)行排序。同樣排序有兩種方式蚕苇,自然排序和定制排序哩掺。見(jiàn)16
PriorityQueue與TreeSet對(duì)元素的要求一致。
22涩笤、Deque接口與ArrayDeque實(shí)現(xiàn)類(lèi)
Deque:雙端隊(duì)列嚼吞。創(chuàng)建時(shí)可指定一個(gè)numElement參數(shù)指定Object[]長(zhǎng)度,不指定默認(rèn)為16蹬碧。
ArrayDeque:Deque實(shí)現(xiàn)類(lèi)舱禽,基于數(shù)組實(shí)現(xiàn)的雙端隊(duì)列。與ArrayList實(shí)現(xiàn)機(jī)制基本相似恩沽√苤桑可當(dāng)成Stack使用。
23、LinkedList
LinckedList是List的實(shí)現(xiàn)類(lèi)里伯,并實(shí)現(xiàn)Deque接口绽昏。
因此它可被當(dāng)成雙端隊(duì)列和棧。
24俏脊、當(dāng)運(yùn)行程序需要很大的內(nèi)存空間時(shí)全谤,JVM默認(rèn)的內(nèi)存空間不足,需要設(shè)置Xmx,Xms兩個(gè)參數(shù)爷贫。-Xms:JVM的堆內(nèi)存初始大小认然,-Xmx;JVM的堆內(nèi)存最大大新选(最好不要超過(guò)物理內(nèi)存)卷员。
25、Map
key不允許重復(fù)腾务,即Map任意兩個(gè)key通過(guò)equals()方法比較返回總是false毕骡。
Map中的所有key組成了一個(gè)Set集合。
Map提供一個(gè)Entry內(nèi)部類(lèi)來(lái)封裝key-value對(duì)岩瘦。而計(jì)算Entry存儲(chǔ)時(shí)則只考慮Entry封裝的key未巫。