知識點(diǎn):
java中分為數(shù)組和集合兩大類欣尼,這兩個容器都是可以存儲數(shù)據(jù)的方法
數(shù)組和集合的區(qū)別:(1)數(shù)組長度不可變化而且無法保存具有映射關(guān)系的數(shù)據(jù)秩冈;集合類用于保存數(shù)量不確定的數(shù)據(jù)盏浙,以及保存具有映射關(guān)系的數(shù)據(jù)昼浦。(2)數(shù)組元素既可以是基本類型的值吞加,也可以是對象问麸;集合只能保存對象疗杉。
Java集合類主要由兩個接口Collection和Map阵谚。
Collection接口派生出來的常用集合有:
(主要)ArrayList、LinkedList
(次要)HashSet烟具、TreeSet梢什、Vector(過去式)
Map接口派生出來的常用集合有:
(主要)HashMap
(次要)TreeMap
簡要說明List、Set净赴、Map的區(qū)別
List集合:有序绳矩、可重復(fù)集合,集合中每個元素都有其對應(yīng)的順序索引玖翅。實(shí)現(xiàn)List接口的集合主要有:ArrayList翼馆、LinkedList、Vector金度。
Set集合:有序应媚,不可重復(fù)集合,重復(fù)元素會覆蓋掉猜极。實(shí)現(xiàn)Set接口的集合主要有:HashSet中姜、TreeSet。
Map集合:以鍵值對的方式存儲跟伏,元素?zé)o存入順序丢胚,元素不可重復(fù),重復(fù)元素會覆蓋掉受扳,key携龟、value都可以為null實(shí)現(xiàn)Map接口的集合主要有:HashMap、HashTable勘高、TreeMap峡蟋。
集合常見的面試題:
1. ArrayList和LinkedList有什么區(qū)別?
ArrayList 有序华望,可重復(fù)的集合表示蕊蝗,底層實(shí)現(xiàn)是一個數(shù)組 ? ?查找快增刪慢
LinkedList 有序,可重復(fù)的集合表示赖舟,底層實(shí)現(xiàn)是一個鏈表蓬戚,查找慢增刪快
ArrayList是數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList是鏈表的數(shù)據(jù)結(jié)構(gòu)宾抓。
隨機(jī)訪問的時候碌更,ArrayList的效率比較高裕偿,因?yàn)長inkedList要移動指針,而ArrayList是基于索引(index)的數(shù)據(jù)結(jié)構(gòu)痛单,可以直接映射到嘿棘。
插入、刪除數(shù)據(jù)時旭绒,LinkedList的效率比較高鸟妙,因?yàn)锳rrayList要移動數(shù)據(jù)。
LinkedList比ArrayList開銷更大挥吵,因?yàn)長inkedList的節(jié)點(diǎn)除了存儲數(shù)據(jù)重父,還需要存儲引用。
2. ArrayList和Vector有什么區(qū)別忽匈?
ArrayList 非線程安全的
Vector 是線程安全的
3. HashMap和HashTable有什么區(qū)別房午?
線程安全性不同:HashMap非線程安全,HashTable線程安全
繼承的父類不同:Hashtable繼承自Dictionary類丹允,而HashMap繼承自AbstractMap類郭厌。但二者都實(shí)現(xiàn)了Map接口
key和value是否允許null值:Hashtable中,key和value都不允許出現(xiàn)null值
兩個遍歷方式的內(nèi)部實(shí)現(xiàn)上不同
4. ArrayList,Vector,LinkedList的存儲性能和特性
ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù)雕蔽,此數(shù)組元素數(shù)大于實(shí)際存儲的數(shù)據(jù)以便增加和插入元素折柠,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作批狐,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢扇售,Vector由于使用了synchronized方法線程安全,性能上比ArrayList差嚣艇。
而LinkedList使用雙向鏈表實(shí)現(xiàn)存儲承冰,按序號索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,所以索引數(shù)據(jù)較慢食零,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可巷懈,所以插入速度較快。
5. HashMap的存儲結(jié)構(gòu)以及工作原理和什么時候擴(kuò)容
jdk1.7:Hashmap實(shí)際上是一個數(shù)組和鏈表的散列表 ?jdk1.8:當(dāng)鏈表中的元素超過了 8 個以后慌洪,會將鏈表轉(zhuǎn)換為紅黑樹
以鍵值對(key-value)的形式存儲元素的。HashMap需要一個hash函數(shù)凑保,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素冈爹。當(dāng)調(diào)用put()方法的時候,HashMap會計算key的hash值欧引,然后把鍵值對存儲在集合中合適的索引上频伤。如果key已經(jīng)存在了,value會被更新成新值芝此。HashMap的一些重要的特性是它的容量(capacity)憋肖,負(fù)載因子(loadfactor)和擴(kuò)容極限(thresholdresizing)
當(dāng)hashmap中的元素個數(shù)超過數(shù)組大小loadFactor(加載因子)時因痛,就會進(jìn)行數(shù)組擴(kuò)容,loadFactor的默認(rèn)值為0.75
6.Comparable和Comparator接口是干什么的岸更?列出它們的區(qū)別
Java提供了只包含一個compareTo()方法的Comparable接口鸵膏。這個方法可以個給兩個對象排序。具體來說怎炊,它返回負(fù)數(shù)谭企,0,正數(shù)來表明輸入對象小于评肆,等于债查,大于已經(jīng)存在的對象。Java提供了包含compare()和equals()兩個方法的Comparator接口瓜挽。compare()方法用來給兩個輸入?yún)?shù)排序盹廷,返回負(fù)數(shù),0久橙,正數(shù)表明第一個參數(shù)是小于俄占,等于,大于第二個參數(shù)剥汤。equals()方法需要一個對象作為參數(shù)颠放,它用來決定輸入?yún)?shù)是否和comparator相等。只有當(dāng)輸入?yún)?shù)也是一個comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時候吭敢,這個方法才返回true碰凶。