這些java集合Collection和Map相關的面試題你掌握了嗎?
1.簡述集合體系?(區別單列集合)
答:
集合分為單列集合和雙列集合。單列集合的頂層是Collection。雙列集合的頂層介面是Map。
我們先來說下單列集合:單列集合Collection有2個孩子,是List集合和Set集合。
List集合的特點:有序(存取一致),可重複。
Vector:JDK1.0出現的,底層的數據結構是數組,所以查詢快,增刪慢。它是線程安全的,所以效率低。
ArrayList:JDK1.2出現的,底層數據結構是數據,所以查詢塊,增刪慢。它是線程不安全的,所以效率高。
LinkedList:底層數據結構是鏈表。查詢慢,增刪快。線程不安全,效率高。
Set集合的特點:無序,唯一
Advertisements
HashSet:底層的數據結構是哈希表,線程不安全,效率高
LinkedHashSet:是Set集合中唯一一個有序的集合。底層的數據結構是鏈表,線程不安全,效率高。
TreeSet:底層的數據結構是二叉樹,是線程不安全的,效率高。
雙列集合:
雙列集合Map有3個孩子,是Hashtable、HashMap和TreeMap集合。
Hashtable:JDK1.0出現的,底層數據結構是Hash表,是線程安全的,效率低。不可以存儲null鍵和null值
HashMap:JDK1.2出現的,底層數據結構是Hash表,是線程不安全的,效率高。可以存儲null鍵和null值。
TreeMap:底層數據結構是二叉樹,是線程不安全的,效率高
Advertisements
補充:Set集合是如何保證元素的唯一性的?
答:
HashSet:保證元素唯一性,依賴的是HashCode方法和equals方法
TreeSet:保證元素唯一性,依賴的是自然排序和比較器排序。
自然排序:實現comparable介面,重寫裡面的CompareTo(Object obj)方法。
比較器排序:實現Comparator介面,並重寫裡面的Compare(Object o1, Object o2)方法。
【負左,正右,零不加。|前-后是升序,后-前是降序】
2.什麼時候使用什麼集合?
答:
具體看需求。
首先看是用單列還是雙列,
如果是單列的話[Collection集合],然後看是否要求元素唯一,如果唯一[Set集合],看是否要求排序,排序的話,就是TreeSet,否則就是HashSet,如果不明確就是HashSet。
如果是單列集合,不要求元素唯一,就是[list集合],看是否要求安全,是就用Vector,不要求安全,就看是查詢多還是增刪多,如果增刪多,就用LinkedList,如果查詢多,就用ArrayList,如果需求不明確,就用ArrayList。
如果是雙列集合,看是否要求排序,如果是就是TreeMap,如果不是就HashMap。如果需求不明確,就是HashMap
3.Collection(單列)和(Map)雙列的區別?
答:
Collection是單列結合的根介面,裡面定義了整個單列集合體系的共性內容。
它的子體系Set體系具有唯一性,數據結構針對元素有效。
Map 是雙列結合的根介面,裡面定義了整個雙列結合體系的共性內容。
它的鍵具有唯一性,數據結構針對鍵有效
4.遍歷集合(分單列集合和雙列集合)的方式有哪些?
答:
單列集合:
共性的有3種:
1、集合轉數組,toArray()
2、普通迭代器
3、增強for
List體系特有的:ListIterator列表迭代器、get()+size()方法
雙列集合:
鍵集keyset()+get()
鍵對集entrySet()+getKey()+getValue()
5.用迭代器和增強for遍歷集合,能否用集合的方法,操作集合?
答:
不能,會出現併發修改異常,ConcurrentModificationException。
併發修改異常,產生的原因:是使用普通迭代器或者增強for,在遍歷結合的時候,向集合中添加元素
解決的方案:使用列表迭代器ListIterator,注意在添加元素時,調用 add方法的是列表迭代器,不是集合本身。
6.泛型是什麼?有什麼好處?
答:泛型是泛指某種特定的數據類型,是JDK1.5出現的新特性。
好處:
(1)提高了安全性。(不會出現類型轉換異常)
(2)將運行時期會可能出現的異常轉移到編譯期
(3)優化程序設計。(定義為泛型后,我們的程序可以放多種數據類型的一種)
(4)避免了強制類型轉換的麻煩。
7、向上限定和向下限定?
? super E: 固定下邊界,向上限定,E及E的父類。
? extends E:固定的上邊界,向下限定,E及E的子類。
8.字典排序,自然排序和比較器排序是什麼?
答:字典排序按照字典上的順序升序排序。 A-Z
自然排序是實現Comparable介面,重寫compareTo()方法,根據返回值進行排序。負左,正右 ,0不變
比較器排序是實現Comparator介面,重寫compare()方法,根據返回值進行排序。
前-后是升序,后-前是降序。
9.Map有哪些取出元素的方式?原理是什麼?
答:鍵集。通過keySet()和get(Key)方法結合實現。
鍵對集。通過entrySet()和 getKey(),getValue()方法結合實現。
10.Collections 和 collection的區別?
答:
Collections是用來操作單列集合的工具類,裡邊定義了一些常用的操作單列集合的方法,比如說:sort(),binarySearch(),shuffle()
collection是單列集合的頂層介面,裡邊定義了整個單列集合體系的共性內容。
11.棧和隊列,鏈表和數組
棧結構:先進後出
隊列結構:先進先出
鏈表和數組的區別:
鏈表結構:每個元素指向下一個元素.特點是:增刪快,查找慢。
數組:一塊連續的存儲區域,每個元素都有編號,編號是從0開始的。特點是查詢快,增刪慢。