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