常見Java面試題-容器

18.java 容器都有哪些?

List:存放有序,列表存儲,元素可重複

Set:無序,元素不可重複

Map:無序,元素可重複

JAVA的容器包括如下:
List,Map,Set ,Collection ,List ,LinkedList ,ArrayList ,Vector ,Stack ,Set
Map ,Hashtable ,HashMap ,WeakHashMap
數據容器主要分爲了兩類:
Collection: 存放獨立元素的序列。
Map:存放key-value型的元素對。(這對於需要利用key查找value的程序十分的重要!)
從類體系圖中可以看出,Collection定義了Collection類型數據的最基本、最共性的功能接口,而List對該接口進行了拓展。
其中各個類的適用場景有很大的差別,在使用時,應該根據需要靈活的進行選擇。此處介紹最爲常用的四個容器:
LinkedList :其數據結構採用的是鏈表,此種結構的優勢是刪除和添加的效率很高,但隨機訪問元素時效率較ArrayList類低。
ArrayList:其數據結構採用的是數組,此種結構的優勢是訪問和查詢十分方便,但添加和刪除的時候效率很低。
HashSet: Set類不允許其中存在重複的元素(集),無法添加一個重複的元素(Set中已經存在)。HashSet利用Hash函數進行了查詢效率上的優化,其contain()方法經常被使用,以用於判斷相關元素是否已經被添加過。
HashMap: 提供了key-value的鍵值對數據存儲機制,可以十分方便的通過鍵值查找相應的元素,而且通過Hash散列機制,查找十分的方便。

19.Collection 和 Collections 有什麼區別?

Collection 是集合的接口,map,set,list,vector繼承自它

Collections 是集合的工具類,定義了許多操作集合的靜態方法。是幫助類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,例如sort()方法

20.List、Set、Map 之間的區別是什麼?

  • List:有序集合,元素可重複
  • Set:不重複集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet無序
  • Map:鍵值對集合,存儲鍵、值和之間的映射;Key無序,唯一;value 不要求有序,允許重複

21.HashMap 和 Hashtable 有什麼區別?

HashMap :非同步,速度快,key/value允許爲null

Hashtable:同步  ,  速度慢,key/value不允許爲null

22.如何決定使用 HashMap 還是 TreeMap?

TreeMap<K,V>的Key值是要求實現java.lang.Comparable,所以迭代的時候TreeMap默認是按照Key值升序排列的;TreeMap的實現也是基於紅黑樹結構。

而HashMap<K,V>的Key值實現散列hashCode(),分佈是散列的均勻的,不支持排序,數據結構主要是桶(數組),鏈表或紅黑樹。

所以,查詢的時候使用HashMap,增加、快速創建的時候使用TreeMap。

23.說一下 HashMap 的實現原理?

存儲時,如果出現hash值相同的key,此時有兩種情況。(1)如果key相同,則覆蓋原始值;(2)如果key不同(出現衝突),則將當前的key-value放入鏈表中

獲取時,直接找到hash值對應的下標,在進一步判斷key是否相同,從而找到對應值。

理解了以上過程就不難明白HashMap是如何解決hash衝突的問題,核心就是使用了數組的存儲方式,然後將衝突的key的對象放入鏈表中,一旦發現衝突就在鏈表中做進一步的對比。

24.說一下 HashSet 的實現原理?

HashSet實際上是一個HashMap實例,都是一個存放鏈表的數組。它不保證存儲元素的迭代順序;此類允許使用null元素。HashSet中不允許有重複元素,這是因爲HashSet是基於HashMap實現的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是統一的一個固定對象private static final Object PRESENT = new Object();

HashSet中add方法調用的是底層HashMap中的put()方法,而如果是在HashMap中調用put,首先會判斷key是否存在,如果key存在則修改value值,如果key不存在這插入這個key-value。而在set中,因爲value值沒有用,也就不存在修改value值的說法,因此往HashSet中添加元素,首先判斷元素(也就是key)是否存在,如果不存在這插入,如果存在着不插入,這樣HashSet中就不存在重複值。

 所以判斷key是否存在就要重寫元素的類的equals()和hashCode()方法,當向Set中添加對象時,首先調用此對象所在類的hashCode()方法,計算次對象的哈希值,此哈希值決定了此對象在Set中存放的位置;若此位置沒有被存儲對象則直接存儲,若已有對象則通過對象所在類的equals()比較兩個對象是否相同,相同則不能被添加。

25.ArrayList 和 LinkedList 的區別是什麼?

共性:ArrayList與LinkedList都是List接口的實現類,因此都實現了List的所有未實現的方法,只是實現的方式有所不同。

區別:List接口的實現方式不同

ArrayList實現了List接口,以數組的方式來實現的,因此對於快速的隨機取得對象的需求,使用ArrayList實現執行效率上會比較好。

LinkedList是採用鏈表的方式來實現List接口的,因此在進行insert和remove動作時效率要比ArrayList高。適合用來實現Stack(堆棧)與Queue(隊列)。

26.如何實現數組和 List 之間的轉換?

List轉數組:toArray(arraylist.size()方法

數組轉List:Arrays的asList(a)方法

27.ArrayList 和 Vector 的區別是什麼?

ArrayList 和Vector底層是採用數組方式存儲數據

  • Vector:
    線程同步
    當Vector中的元素超過它的初始大小時,Vector會將它的容量翻倍,
  • ArrayList:
    線程不同步,但性能很好
    當ArrayList中的元素超過它的初始大小時,ArrayList只增加50%的大小

28.Array 和 ArrayList 有何區別?

Array和ArrayList的異同點
一、Array和ArrayList的區別
#1. Array類型的變量在聲明的同時必須進行實例化(至少得初始化數組的大小),而ArrayList可以只是先聲明。
如:
int[] array = new array[3];
或 int[] array = {1,2,3};
或 ArrayList myList = new ArrayList();
這些都是合法的,而直接使用 int[] array;是不行的。

#2. Array只能存儲同構的對象,而ArrayList可以存儲異構的對象。
同構的對象是指類型相同的對象,若聲明爲int[]的數組就只能存放整形數據,string[]只能存放字符型數據,但聲明爲object[]的數組除外。
而ArrayList可以存放任何不同類型的數據(因爲它裏面存放的都是被裝箱了的Object型對象,實際上ArrayList內部就是使用"object[] _items;"這樣一個私有字段來封裝對象的)

#3 在CLR託管對中的存放方式
Array是始終是連續存放的,而ArrayList的存放不一定連續。

#4 初始化大小
Array對象的初始化必須只定指定大小,且創建後的數組大小是固定的,而ArrayList的大小可以動態指定,其大小可以在初始化時指定,也可以不指定,也就是說該對象的空間可以任意增加。

#5 Array不能夠隨意添加和刪除其中的項,而ArrayList可以在任意位置插入和刪除項。

二、Array和ArrayList的相似點

#1 都具有索引(index),即可以通過index來直接獲取和修改任意項。
#2 他們所創建的對象都放在託管堆中。
#3 都能夠對自身進行枚舉(因爲都實現了IEnumerable接口)。

29.在 Queue 中 poll()和 remove()有什麼區別?

poll()和remove()都將移除並且返回隊頭,但是在poll()在隊列爲空時返回null,而remove()會拋出NoSuchElementException異常

30.哪些集合類是線程安全的?

Vector:就比Arraylist多了個同步化機制(線程安全)。

Hashtable:就比Hashmap多了個線程安全。

ConcurrentHashMap:是一種高效但是線程安全的集合。

Stack:棧,也是線程安全的,繼承於Vector。

31.迭代器 Iterator 是什麼?

首先說一下迭代器模式,它是 Java 中常用的設計模式之一。用於順序訪問集合對象的元素,無需知道集合對象的底層實現。

Iterator 是可以遍歷集合的對象,爲各種容器提供了公共的操作接口,隔離對容器的遍歷操作和底層實現,從而解耦。

缺點是增加新的集合類需要對應增加新的迭代器類,迭代器類與集合類成對增加。

32.Iterator 怎麼使用?有什麼特點?

  • java.lang.Iterable 接口被 java.util.Collection 接口繼承,java.util.Collection 接口的 iterator() 方法返回一個 Iterator 對象
  • next() 方法獲得集合中的下一個元素
  • hasNext() 檢查集合中是否還有元素
  • remove() 方法將迭代器新返回的元素刪除
  • forEachRemaining(Consumer<? super E> action) 方法,遍歷所有元素

33.Iterator 和 ListIterator 有什麼區別?

1.使用範圍不同,Iterator可以應用於所有的集合,Set、List和Map和這些集合的子類型。而ListIterator只能用於List及其子類型。
2.ListIterator有add方法,可以向List中添加對象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator不可以。
4.ListIterator可以定位當前索引的位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。
5.都可實現刪除操作,但是ListIterator可以實現對象的修改,set()方法可以實現。Iterator僅能遍歷,不能修改。

34.怎麼確保一個集合不能被修改?

可以使用 Collections. unmodifiableCollection(Collection c) 方法來創建一個只讀集合,這樣改變集合的任何操作都會拋出 Java. lang. UnsupportedOperationException 異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章