Java面試系列05:Java基礎之集合面試問題解答(下)

12.HashSet 和 TreeSet 有什麼區別?

相同點:單例集合,數據不可重複
不同點
1:底層使用的儲存數據結構不同:

  1. Hashset底層使用的是HashMap哈希表結構儲存。
  2. 而Treeset底層用的是TreeMap樹結構儲存。

2:儲存的數據保存唯一方式不同。

  1. Hashset是通過複寫hashCode()方法和equals()方法來保證的。
  2. 而Treeset是通過Compareable接口的compareto方法來保證的。

3:hashset無序 Treeset有序
存儲原理:
HashSet: 底層數據結構是哈希表,本質就是哈希值儲存。通過判斷元素的hashcode方法和equals方法來保證元素的唯一性。當哈希值不同時就直接進行儲存。如果相同,會判斷一次equals方式是否返回爲true ,如果是true 則視爲用的同一個元素,不用再儲存。 如果是false,這個相同哈希值不同內容的元素會放在同一個桶裏(當哈希表中有一個桶結構,每一個桶都有一個哈希值)
Treeset:底層數據結構式一個二叉樹,可以對set集合中的元素進行排序,這種結構,可以提高排序性能。根據比較方法的返回值決定的,只要返回的是0,就代表元素重複。

13.HashSet 的底層實現是什麼?

參考:
https://blog.csdn.net/HD243608836/article/details/80214413
https://www.iteye.com/blog/zhangshixi-673143
對於HashSet而言,它是基於HashMap實現的,HashSet底層使用HashMap來保存所有元素,因此HashSet 的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成。

14.LinkedHashMap 的實現原理?

參考:
https://blog.csdn.net/HD243608836/article/details/80214413
“ 查看了LinkedHashMap的構造方法後,發現其因爲繼承自HashMap,所以其底層實現也是HashMap!!!(呵呵,我已經發現了……怪不得還是得主要研究HashMap啊),然後發現了LinkedHashMap調用父類構造方法初始化時,還順便設置了變量accessOrder = false,看上面得源碼可以知道,這是給了迭代器一個參數,false代表迭代時使用插入得順序(追根溯源了,真爽)”

15.爲什麼集合類沒有實現 Cloneable 和 Serializable 接口?

克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。

16.什麼是迭代器 (Iterator)?

迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱爲“輕量級”對象,因爲創建它的代價小。Java中的Iterator只能單向移動:

        		//使用迭代器 遍歷   每個集合對象都有自己的迭代器
        		Iterator<String> it = coll.iterator();
        		//  泛型指的是 迭代出 元素的數據類型
        		while(it.hasNext()){ //判斷是否有迭代元素
            			String s = it.next();//獲取迭代出的元素
            			System.out.println(s);
        		}

17.Iterator 和 ListIterator 的區別是什麼?

鏈接:https://www.nowcoder.com/questionTerminal/9dbbd35ff35e4e008fdd792c2b539940
來源:牛客網
Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。
ListIterator實現了Iterator接口,幷包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。

18.數組 (Array) 和列表 (ArrayList) 有什麼區別?什麼時候應該使用 Array 而不是 ArrayList?

鏈接:https://www.nowcoder.com/questionTerminal/203b16053654416c905721828160bf96
來源:牛客網
1、存儲內容比較: Array 數組可以包含基本類型和對象類型, ArrayList 卻只能包含對象類型。 Array 數組在存放的時候一定是同種類型的元素。ArrayList 就不一定了 。
2、空間大小比較: Array 數組的空間大小是固定的,所以需要事前確定合適的空間大小。 ArrayList 的空間是動態增長的,而且,每次添加新的元素的時候都會檢查內部數組的空間是否足夠。 3.方法上的比較: ArrayList 方法上比 Array 更多樣化,比如添加全部 addAll()、刪除全部 removeAll()、返回迭代器 iterator() 等。

19.Java 集合類框架的最佳實踐有哪些?

來源:牛客網
https://www.nowcoder.com/questionTerminal/0911f7061c5f403f835e1467340d4ab1
在這裏插入圖片描述

20.Set 裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用 == 還是 equals()?它們有何區別?

重複了,看問題8

21.Comparable 和 Comparator 接口是幹什麼的?列出它們的區別

鏈接:https://www.nowcoder.com/questionTerminal/99f7d1f4f8374e419a6d6924d35d9530
來源:牛客網

Comparable & Comparator 都是用來實現集合中元素的比較、排序的。
只是 Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義 Comparator 接口的方法或在集合內實現 Comparable 接口的方法。
Comparator位於包java.util下,而Comparable位於包 java.lang下 。
Comparable 是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作,已經實現了Comparable接口) 自定義的類要在加入list容器中後能夠排序,可以實現Comparable接口,在用Collections類的sort方法排序時,如果不指定Comparator,那麼就以自然順序排序, 這裏的自然順序就是實現Comparable接口設定的排序方式。
Comparator 是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。 可以說一個是自已完成比較,一個是外部程序實現比較的差別而已。 用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行爲。 比如:你想對整數採用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這麼做)去改變它的排序行爲,只要使用一個實現了 Comparator 接口的對象來實現控制它的排序就行了。

22.Collection 和 Collections 的區別。

鏈接:https://www.nowcoder.com/questionTerminal/f51bc6a206fa48e6af9759c5036462a6
來源:牛客網

1、Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是爲各種具體的集合提供了最大化的統一操作方式。
2、Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架。

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