Java面试题集(二)list与Map相关知识(1.2)
前言:
在平常的寫java程序中,常用除了8種常用數(shù)據(jù)類型,String對象外,還有集合類,例如ArrayList,HashMap等,這些最常用。
?
一、List接口
List接口為Collection直接接口。List所代表的是有序的Collection(容器),即用某種特定的插入順序維護元素順序。使用者可以對列表中每個元素插入的位置進行精確的控制。然后可以根據(jù)元素的整數(shù)索引訪問元素,并搜索列表中的元素。例如:get(1);實現(xiàn)List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
1-1:ArrayList?
ArrayList是一個動態(tài)數(shù)組,也是我們使用最多的集合。它允許任何符號規(guī)則的元素插入(包括null)。每一個ArrayList都有一個初始容量(10),該容量代表了數(shù)組的大小。隨著容器的元素不斷增加,容器的大小也會自動增加,在每次向容器中增加元素的同時都會進行容器檢查,當快溢出時,就會進行擴容操作。(如果我們明確所插入的元素的多少,最好指定一個初始容量值,避免過度的進行擴容操作而影響程序性能。)
常用的操作:size,isEmpty,get,set,iterator 和 listIterator,都是以固定時間運行。
ArrayList 擅長隨機訪問,因為基于動態(tài)數(shù)組的數(shù)據(jù)結構原因。(聯(lián)想物理存址的概念)
(非同步的,多線程訪問下同一個List,需要實現(xiàn)訪問同步)
1-2:LinkedList
LinkedList是一個雙向鏈表,除了有ArrayList的基本操作以外,還額外提供了get,remove,insert方法在LinkedList的首部或尾部。由于LinkedList是基于雙重鏈表的數(shù)據(jù)結構,所有操作都要按照該數(shù)據(jù)結構執(zhí)行,在列表中索引的操作將從開頭或結尾遍歷列表(從靠近指定索引的一端),可以通過較低的代價在List中進行插入和刪除操作。(聯(lián)想鏈表的物理存址方便性)
與ArrayList 一樣,(非同步的,多線程訪問下同一個List,需要實現(xiàn)訪問同步)
1-3:Vector
與ArrayList相似,但是Vector是同步的。Vector是線程安全的動態(tài)數(shù)組。它的操作與ArrayList幾乎一樣,(但是寫代碼時候很少用到,也不知道為什么。)
1-4:Stack
Stack繼承自Vector,實現(xiàn)一個后進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用?;镜膒ush和pop 方法,還有peek方法得到棧頂?shù)脑?#xff0c;empty方法測試堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧。
(但是寫代碼時候很少用到,也不知道為什么。)
?
二、Set接口
set是一種不包括重復元素的Collection。它維持自己的內(nèi)部排序,并不能隨機訪問,與List一樣,允許null的存在,但是僅有一個,由于Set接口的特殊性,傳入Set集合中的元素都必須不同,同事要注意任何可變對象,如果在對集合中元素進行操作時,導致e1.equals(e2)==true,則必定會產(chǎn)生某些問題。
Set接口的集合有:EnumSet、HashSet、TreeSet
:2-1:EnumSet
一看Enum就知道是枚舉的Set,所有元素都是枚舉類型。因為其內(nèi)部是以HashCode來實現(xiàn)的,內(nèi)部
2-2:HashSet
HashSet堪稱查詢速度最快的集合,因為其內(nèi)部是以HashCode來實現(xiàn)的,內(nèi)部元素的順序由哈希碼來決定,所以迭代順序不清楚。
2-3:TreeSet
基于TreeMap,生成一個總是處于排序狀態(tài)的set,內(nèi)部以TreeMap來實現(xiàn)。是使用元素的自然順序?qū)υ剡M行排序,或者根據(jù)創(chuàng)建Set是提供的Comparator進行排序,具體取決于使用的構造方法。
?
三、Map接口
Map與List、Set接口不同,他是由一系列鍵值對組成的集合,提供了key-value的映射,同時也沒有繼承Collection。在Map中,他保證了key與value之間的對應關系,不會存在相同的key,Map的put方法不允許key重復的。
3-1:HashMap
一看就知道是以哈希表數(shù)據(jù)結構實現(xiàn),查找對象時,通過哈希函數(shù)計算其位置,為了快速查詢。內(nèi)部定義了一個hash表數(shù)組(Entry[ ]? table),元素會通過哈希轉(zhuǎn)換函數(shù)將元素的哈希地址轉(zhuǎn)換成數(shù)組中存在的索引,如果有沖突,則使用散列鏈表的形式將所有相同的哈希地址的元素串起來,是一個單鏈表結構。
3-2:TreeMap
key是以某種排序規(guī)則排序,內(nèi)部以red-black Tree(紅黑樹)的數(shù)據(jù)結構實現(xiàn),實現(xiàn)了SortedMap接口
3-3:HashTable
也是哈希表數(shù)據(jù)結構的Map,線程安全,適用于同步操作,所以性能比HashMap要低。
?
四、Queue
隊列,它主要分為兩大類,一類是阻塞式隊列,隊列滿了以后再插入元素則會拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一種隊列則是雙端隊列,支持在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。
?
五、相互區(qū)別
Vector 和 ArrayList
(1)Vector是線程同步的,所以他也是線程安全的,而ArrayList是線程異步,不安全,一般不考慮多線程情況下,使用ArrayList效率高。
(2)如何集合中元素的數(shù)目大于目前集合數(shù)組的長度時,Vector增長率為當前數(shù)組長度的100%,而ArrayList增長率為50%,考慮到集合使用數(shù)據(jù)比較大時,使用Vector比較好。
(3)查找指定位置的數(shù)據(jù),Vector和ArrayList使用時間是相同的。而移動數(shù)據(jù)位置最快是LinkedList。
(4)ArrayList 和Vector是采用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,都允許直接序號索引元素,但是插入數(shù)據(jù)要設計到數(shù)組元素移動 等內(nèi)存操作,所以索引數(shù)據(jù)快插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要 差,LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行向前或向后遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入數(shù)度較快
ArrayList和LinkedList
1.ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結構,LinkedList基于鏈表的數(shù)據(jù)結構。
2.對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。
3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。
??? 這一點要看實際情況的。若只對單條數(shù)據(jù)插入或刪除,ArrayList的速度反而優(yōu)于LinkedList。但若是批量隨機的插入刪除數(shù) 據(jù),LinkedList的速度大大優(yōu)于ArrayList. 因為ArrayList每插入一條數(shù)據(jù),要移動插入點及之后的所有數(shù)據(jù)。
HashMap與TreeMap
????? 1、HashMap通過hashcode對其內(nèi)容進行快速查找,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。HashMap中元素的排列順序是不固定的)。
????? 2、? HashMap通過hashcode對其內(nèi)容進行快速查找,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。集合框架”提供兩種常規(guī)的Map實現(xiàn):HashMap和TreeMap (TreeMap實現(xiàn)SortedMap接口)。
????? 3、在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。使用HashMap要求添加的鍵類明確定義了hashCode()和 equals()的實現(xiàn)。 這個TreeMap沒有調(diào)優(yōu)選項,因為該樹總處于平衡狀態(tài)。
Hashtable與Hashmap
????? 1、歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現(xiàn) 。
????? 2、同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 。
????? 3、值:只有HashMap可以讓你將空值作為一個表的條目的key或value 。
轉(zhuǎn)載于:https://www.cnblogs.com/tuanz/p/8998884.html
總結
以上是生活随笔為你收集整理的Java面试题集(二)list与Map相关知识(1.2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Python语言Appium启动io
- 下一篇: OLI 课程 Java入学考试的五道题