Java集合容器面试题
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Java集合容器面试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                文章目錄
- 集合容器概述
- 什么是集合
- 集合的特點
- 集合和數組的區別
- 使用集合框架的好處
- 常用的集合類有哪些?
- List,Set,Map三者的區別?List、Set、Map 是否繼承自 Collection 接口?List、Map、Set 三個接口存取元素時,各有什么特點?
- 集合框架底層數據結構
- 哪些集合類是線程安全的?
- Java集合的快速失敗機制 “fail-fast”?
- 怎么確保一個集合不能被修改?
 
 
- Collection接口
- List接口
- 迭代器 Iterator 是什么?
- Iterator 怎么使用?有什么特點?
- 如何邊遍歷邊移除 Collection 中的元素?
- Iterator 和 ListIterator 有什么區別?
- 遍歷一個 List 有哪些不同的方式?每種方法的實現原理是什么?Java 中 List 遍歷的最佳實踐是什么?
- 說一下 ArrayList 的優缺點
- 如何實現數組和 List 之間的轉換?
- ArrayList 和 LinkedList 的區別是什么?
- ArrayList 和 Vector 的區別是什么?
- 插入數據時,ArrayList、LinkedList、Vector誰速度較快?闡述 ArrayList、Vector、LinkedList 的存儲性能和特性?
- 多線程場景下如何使用 ArrayList?
- 為什么 ArrayList 的 elementData 加上 transient 修飾?
- List 和 Set 的區別
 
- Set接口
- 說一下 HashSet 的實現原理?
- HashSet如何檢查重復?HashSet是如何保證數據不可重復的?
- HashSet與HashMap的區別
 
- Queue
- BlockingQueue是什么?
- 在 Queue 中 poll()和 remove()有什么區別?
 
- Map接口
- 說一下 HashMap 的實現原理?
- HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底層實現
- JDK1.8之前
- JDK1.8之后
- JDK1.7 VS JDK1.8 比較
 
- HashMap的put方法的具體流程?
- HashMap的擴容操作是怎么實現的?
- HashMap是怎么解決哈希沖突的?
- 什么是哈希?
- 什么是哈希沖突?
- HashMap的數據結構
- hash()函數
- JDK1.8新增紅黑樹
- 總結
 
- 能否使用任何類作為 Map 的 key?
- 為什么HashMap中String、Integer這樣的包裝類適合作為K?
- 如果使用Object作為HashMap的Key,應該怎么辦呢?
- HashMap為什么不直接使用hashCode()處理后的哈希值直接作為table的下標?
- HashMap 的長度為什么是2的冪次方
- HashMap 與 HashTable 有什么區別?
- 如何決定使用 HashMap 還是 TreeMap?
- HashMap 和 ConcurrentHashMap 的區別
- ConcurrentHashMap 和 Hashtable 的區別?
- ConcurrentHashMap 底層具體實現知道嗎?實現原理是什么?
 
 
- 輔助工具類
- Array 和 ArrayList 有何區別?
- 如何實現 Array 和 List 之間的轉換?
- comparable 和 comparator的區別?
- Collection 和 Collections 有什么區別?
- TreeMap 和 TreeSet 在排序時如何比較元素?
- Collections 工具類中的 sort()方法如何比較元素?
 
 
 
集合容器概述
什么是集合
集合的特點
集合和數組的區別
使用集合框架的好處
常用的集合類有哪些?
List,Set,Map三者的區別?List、Set、Map 是否繼承自 Collection 接口?List、Map、Set 三個接口存取元素時,各有什么特點?
集合框架底層數據結構
哪些集合類是線程安全的?
Java集合的快速失敗機制 “fail-fast”?
怎么確保一個集合不能被修改?
Collection接口
List接口
迭代器 Iterator 是什么?
Iterator 怎么使用?有什么特點?
如何邊遍歷邊移除 Collection 中的元素?
Iterator 和 ListIterator 有什么區別?
遍歷一個 List 有哪些不同的方式?每種方法的實現原理是什么?Java 中 List 遍歷的最佳實踐是什么?
說一下 ArrayList 的優缺點
如何實現數組和 List 之間的轉換?
ArrayList 和 LinkedList 的區別是什么?
ArrayList 和 Vector 的區別是什么?
插入數據時,ArrayList、LinkedList、Vector誰速度較快?闡述 ArrayList、Vector、LinkedList 的存儲性能和特性?
多線程場景下如何使用 ArrayList?
為什么 ArrayList 的 elementData 加上 transient 修飾?
List 和 Set 的區別
Set接口
說一下 HashSet 的實現原理?
HashSet如何檢查重復?HashSet是如何保證數據不可重復的?
 
HashSet與HashMap的區別
Queue
BlockingQueue是什么?
在 Queue 中 poll()和 remove()有什么區別?
Map接口
說一下 HashMap 的實現原理?
HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底層實現
JDK1.8之前
JDK1.8之后
JDK1.7 VS JDK1.8 比較
HashMap的put方法的具體流程?
 
HashMap的擴容操作是怎么實現的?
final Node<K,V>[] resize() {Node<K,V>[] oldTab = table;//oldTab指向hash桶數組int oldCap = (oldTab == null) ? 0 : oldTab.length;int oldThr = threshold;int newCap, newThr = 0;if (oldCap > 0) {//如果oldCap不為空的話,就是hash桶數組不為空if (oldCap >= MAXIMUM_CAPACITY) {//如果大于最大容量了,就賦值為整數最大的閥值threshold = Integer.MAX_VALUE;return oldTab;//返回}//如果當前hash桶數組的長度在擴容后仍然小于最大容量 并且oldCap大于默認值16else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&oldCap >= DEFAULT_INITIAL_CAPACITY)newThr = oldThr << 1; // double threshold 雙倍擴容閥值threshold}// 舊的容量為0,但threshold大于零,代表有參構造有cap傳入,threshold已經被初始化成最小2的n次冪// 直接將該值賦給新的容量else if (oldThr > 0) // initial capacity was placed in thresholdnewCap = oldThr;// 無參構造創建的map,給出默認容量和threshold 16, 16*0.75else { // zero initial threshold signifies using defaultsnewCap = DEFAULT_INITIAL_CAPACITY;newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}// 新的threshold = 新的cap * 0.75if (newThr == 0) {float ft = (float)newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?(int)ft : Integer.MAX_VALUE);}threshold = newThr;// 計算出新的數組長度后賦給當前成員變量table@SuppressWarnings({"rawtypes","unchecked"})Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];//新建hash桶數組table = newTab;//將新數組的值復制給舊的hash桶數組// 如果原先的數組沒有初始化,那么resize的初始化工作到此結束,否則進入擴容元素重排邏輯,使其均勻的分散if (oldTab != null) {// 遍歷新數組的所有桶下標for (int j = 0; j < oldCap; ++j) {Node<K,V> e;if ((e = oldTab[j]) != null) {// 舊數組的桶下標賦給臨時變量e,并且解除舊數組中的引用,否則就數組無法被GC回收oldTab[j] = null;// 如果e.next==null,代表桶中就一個元素,不存在鏈表或者紅黑樹if (e.next == null)// 用同樣的hash映射算法把該元素加入新的數組newTab[e.hash & (newCap - 1)] = e;// 如果e是TreeNode并且e.next!=null,那么處理樹中元素的重排else if (e instanceof TreeNode)((TreeNode<K,V>)e).split(this, newTab, j, oldCap);// e是鏈表的頭并且e.next!=null,那么處理鏈表中元素重排else { // preserve order// loHead,loTail 代表擴容后不用變換下標,見注1Node<K,V> loHead = null, loTail = null;// hiHead,hiTail 代表擴容后變換下標,見注1Node<K,V> hiHead = null, hiTail = null;Node<K,V> next;// 遍歷鏈表do { next = e.next;if ((e.hash & oldCap) == 0) {if (loTail == null)// 初始化head指向鏈表當前元素e,e不一定是鏈表的第一個元素,初始化后loHead// 代表下標保持不變的鏈表的頭元素loHead = e;else // loTail.next指向當前eloTail.next = e;// loTail指向當前的元素e// 初始化后,loTail和loHead指向相同的內存,所以當loTail.next指向下一個元素時,// 底層數組中的元素的next引用也相應發生變化,造成lowHead.next.next.....// 跟隨loTail同步,使得lowHead可以鏈接到所有屬于該鏈表的元素。loTail = e; }else {if (hiTail == null)// 初始化head指向鏈表當前元素e, 初始化后hiHead代表下標更改的鏈表頭元素hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);// 遍歷結束, 將tail指向null,并把鏈表頭放入新數組的相應下標,形成新的映射。if (loTail != null) {loTail.next = null;newTab[j] = loHead;}if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}return newTab; }HashMap是怎么解決哈希沖突的?
什么是哈希?
什么是哈希沖突?
HashMap的數據結構
hash()函數
JDK1.8新增紅黑樹
 
總結
能否使用任何類作為 Map 的 key?
為什么HashMap中String、Integer這樣的包裝類適合作為K?
如果使用Object作為HashMap的Key,應該怎么辦呢?
HashMap為什么不直接使用hashCode()處理后的哈希值直接作為table的下標?
HashMap 的長度為什么是2的冪次方
HashMap 與 HashTable 有什么區別?
如何決定使用 HashMap 還是 TreeMap?
HashMap 和 ConcurrentHashMap 的區別
ConcurrentHashMap 和 Hashtable 的區別?
 
 
 
ConcurrentHashMap 底層具體實現知道嗎?實現原理是什么?
 
 
 
輔助工具類
Array 和 ArrayList 有何區別?
如何實現 Array 和 List 之間的轉換?
comparable 和 comparator的區別?
Collection 和 Collections 有什么區別?
TreeMap 和 TreeSet 在排序時如何比較元素?
Collections 工具類中的 sort()方法如何比較元素?
轉載整理鏈接:https://thinkwon.blog.csdn.net/article/details/104588551
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java集合容器面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: php 连接芒果数据库,芒果数据库配置文
- 下一篇: fireworks CS6安装教程
