java面試---集合

  1. java 容器都有哪些?
    List、set、map

  2. Collection 和 Collections 有什麼區別?
    Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。
    Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架。

  3. List、Set、Map 之間的區別是什麼?
    List:1.可以允許重複的對象。 2.可以插入多個null元素。3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。
    Set:1.不允許重複對象2. 無序容器,你無法保證每個元素的存儲順序,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。 3. 只允許一個 null 元素
    Map: 1.Map不是collection的子接口或者實現類。Map是一個接口。
    2.Map 的 每個 Entry 都持有兩個對象,也就是一個鍵一個值,Map 可能會持有相同的值對象但鍵對象必須是唯一的。
    3.TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序。
    4.Map 裏你可以擁有隨意個 null 值但最多只能有一個 null 鍵。

  4. HashMap 和 Hashtable 有什麼區別?
    HashMap允許鍵和值是null,而Hashtable則不允許鍵或者值是null。

    Hashtable是同步的,而HashMap不是,所以HashMap更適用於單線程環境(線程不安全),Hashtable則適用於多線程環境(線程安全)。

  5. 如何決定使用 HashMap 還是 TreeMap?
    HashMap:適合查詢。基於散列表實現。
    TreeMap:增加、快速創建。基於紅黑樹實現。

  6. 說一下 HashMap 的實現原理?
    HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的下一個節點中。 HashMap在每個鏈表節點中儲存鍵值對對象。

  7. 說一下 HashSet 的實現原理?
    對於HashSet而言,它是基於HashMap實現的,HashSet底層使用HashMap來保存所有元素,更確切的說,HashSet中的元素,只是存放在了底層HashMap的key上, 而value使用一個static final的Object對象標識。因此HashSet 的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成

  8. ArrayList 和 LinkedList 的區別是什麼?
    1.ArrayList是實現了基於動態數組的數據結構,LinkedList是基於鏈表結構。
    2.對於隨機訪問的get和set方法,ArrayList要優於LinkedList,因爲LinkedList要移動指針。
    3.對於新增和刪除操作add和remove,LinkedList比較佔優勢,因爲ArrayList要移動數據。

  9. 如何實現數組和 List 之間的轉換?
    List轉數組: arrayList.toArray()方法

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

  10. ArrayList 和 Vector 的區別是什麼?
    Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由於線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。
    當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利於節約內存空間。

  11. Array 和 ArrayList 有何區別?
    Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
    Array大小是固定的,ArrayList的大小是動態變化的。

  12. 在 Queue 中 poll()和 remove()有什麼區別?
    remove方法和poll方法都是刪除隊列的頭元素,remove方法在隊列爲空的情況下將拋異常,而poll方法將返回null

  13. 哪些集合類是線程安全的?
    vector、hashtable

  14. 迭代器 Iterator 是什麼?
    Iterator接口提供了很多對集合元素進行迭代的方法。每一個集合類都包括了可以返回迭代器實例的迭代方法。迭代器可以在迭代過程中刪除底層集合的元素,但是不可以直接調用集合的remove(Object obj)刪除,可以通過迭代器的remove()方法刪除

  15. Iterator 怎麼使用?有什麼特點?
    Iterator遍歷集合元素的過程中不允許線程對集合元素進行修改,否則會拋出ConcurrentModificationEception的異常。
    Iterator遍歷集合元素的過程中可以通過remove方法來移除集合中的元素。
    Iterator必須依附某個Collection對象而存在,Iterator本身不具有裝載數據對象的功能。
    Iterator.remove方法刪除的是上一次Iterator.next()方法返回的對象。
    ext()方法通過遊標指向的形式返回Iterator下一個元素。

  16. Iterator 和 ListIterator 有什麼區別?
    1 ListIterator有add()方法,可以向List中添加對象,而Iterator不能

    2 ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方 法,可以實現逆向(順序向前)遍歷。Iterator就不可以。

    3 ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。

    4 都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。

  17. 怎麼確保一個集合不能被修改?
    添加final修飾符或者
    Collections.unmodifiableList(List)
    Collections.unmodifiableMap(Map)
    Collections.unmodifiableSet(Set)

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