1. 程式人生 > >面試整理-Java綜合高階篇

面試整理-Java綜合高階篇

Java面試總結

1.你用過哪些集合類?

大公司最喜歡問的Java集合類面試題
40個Java集合面試問題和答案
java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多型方法。
java.util.Collection 是一個集合介面。它提供了對集合物件進行基本操作的通用介面方法。

Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap

ArrayList、HashMap、TreeMap和HashTable類提供對元素的隨機訪問。

執行緒安全

Vector
HashTable(不允許插空值)

非執行緒安全

ArrayList
LinkedList
HashMap(允許插入空值)
HashSet
TreeSet
TreeMap(基於紅黑樹的Map實現)

2.你說說 arraylist 和 linkedlist 的區別?

ArrayList和LinkedList兩者都實現了List介面,但是它們之間有些不同。
(1)ArrayList是由Array所支援的基於一個索引的資料結構,所以它提供對元素的隨機訪問
(2)與ArrayList相比,在LinkedList中插入、新增和刪除一個元素會更快
(3)LinkedList比ArrayList消耗更多的記憶體,因為LinkedList中的每個節點儲存了前後節點的引用

3.HashMap 底層是怎麼實現的?還有什麼處理雜湊衝突的方法?

處理雜湊衝突的方法:

解決HashMap一般沒有什麼特別好的方式,要不擴容重新hash要不優化衝突的連結串列結構

1.開放定地址法-線性探測法
2.開放定地址法-平方探查法
3.連結串列解決-可以用紅黑樹提高查詢效率

image.png

HashMap簡介
HashMap 是一個散列表,它儲存的內容是鍵值對(key-value)對映。
HashMap 繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable介面。
HashMap 的實現不是同步的,這意味著它不是執行緒安全的,但可以用 Collections的synchronizedMap方法使HashMap具有執行緒安全的能力。它的key、value都可以為null

。此外,HashMap中的對映不是有序的。
HashMap 的例項有兩個引數影響其效能:“初始容量” 和 “載入因子”。初始容量預設是16。預設載入因子是 0.75, 這是在時間和空間成本上尋求一種折衷。載入因子過高雖然減少了空間開銷,但同時也增加了查詢成本.
HashMap是陣列+連結串列+紅黑樹(JDK1.8增加了紅黑樹部分)實現的,當連結串列長度太長(預設超過8)時,連結串列就轉換為紅黑樹.

image.png

  1. 確定雜湊桶陣列索引位置 :這裡的Hash演算法本質上就是三步:取key的hashCode值、高位運算、取模運算。
1234567891011
方法一:static final int hash(Object key) {   //jdk1.8 & jdk1.7     int h;     // h = key.hashCode() 為第一步 取hashCode值     // h ^ (h >>> 16)  為第二步 高位參與運算     return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}方法二:static int indexFor(int h, int length) {  //jdk1.7的原始碼,jdk1.8沒有這個方法,但是實現原理一樣的     return h & (length-1);  //第三步 取模運算}
  1. 分析HashMap的put方法
    image.png

  2. 擴容機制:原來的兩倍

4.熟悉什麼演算法,還有說說他們的時間複雜度?

image.png

5.ArrayList和Vector的底層程式碼和他們的增長策略,它們是如何進行擴容的?

ArrayList 預設陣列大小是10,其中ensureCapacity擴容,trimToSize容量調整到適中,擴充套件後陣列大小為((原陣列長度1.5)與傳遞引數中較大者.
Vector的擴容,是可以指定擴容因子,同時Vector擴容策略是:1.原來容量的2倍,2.原來容量+擴容引數值。
*詳細內容可以配合閱讀原始碼

6.jvm 原理。程式執行區域劃分

問:Java執行時資料區域?
回答:包括程式計數器、JVM棧、本地方法棧、方法區、堆
問:方法區裡存放什麼?
本地方法棧:和jvm棧所發揮的作用類似,區別是jvm棧為jvm執行java方法(位元組碼)服務,而本地方法棧為jvm使用的native方法服務。
JVM棧:區域性變量表、運算元棧、動態連結、方法出口。
方法區:用於儲存已被虛擬機器載入的類資訊,常量、靜態變數、即時編譯器編譯後的程式碼等。
堆:存放物件例項。

7.minor GC 與 Full GC,分別什麼時候會觸發? 。分別採用哪種垃圾回收演算法?簡單介紹演算法

GC(或Minor GC):收集 生命週期短的區域(Young area)。
Full GC (或Major GC):收集生命週期短的區域(Young area)和生命週期比較長的區域(Old area)對整個堆進行垃圾收集。
新生代通常存活時間較短基於Copying演算法進行回收,將可用記憶體分為大小相等的兩塊,每次只使用其中一塊;當這一塊用完了,就將還活著的物件複製到另一塊上,然後把已使用過的記憶體清理掉。在HotSpot裡,考慮到大部分物件存活時間很短將記憶體分為Eden和兩塊Survivor,預設比例為8:1:1。代價是存在部分記憶體空間浪費,適合在新生代使用;
老年代新生代不同,老年代物件存活的時間比較長、比較穩定,因此採用標記(Mark)演算法來進行回收,所謂標記就是掃描出存活的物件,然後再進行回收未被標記的物件,回收後對用空出的空間要麼進行合併、要麼標記出來便於下次進行分配,總之目的就是要減少記憶體碎片帶來的效率損耗。
在執行機制上JVM提供了序列GC(Serial MSC)、並行GC(Parallel MSC)和併發GC(CMS)。

Minor GC ,Full GC 觸發條件

  • Minor GC觸發條件:當Eden區滿時,觸發Minor GC。

  • Full GC觸發條件:

  • (1)呼叫System.gc時,系統建議執行Full GC,但是不必然執行
  • (2)老年代空間不足
  • (3)方法去空間不足
  • (4)通過Minor GC後進入老年代的平均大小大於老年代的可用記憶體
  • (5)由Eden區、From Space區向To Space區複製時,物件大小大於To Space可用記憶體,則把該物件轉存到老年代,且老年代的可用記憶體小於該物件大小

8.HashMap 實現原理

在java程式語言中,最基本的結構就是兩種,一個是陣列,另外一個是模擬指標(引用),所有的資料結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際上是一個“連結串列雜湊”的資料結構,即陣列和連結串列的結合體。

9.java.util.concurrent 包下使用過哪些

1.阻塞佇列 BlockingQueue( ArrayBlockingQueueDelayQueueLinkedBlockingQueueSynchronousQueue,LinkedTransferQueue,LinkedBlockingDeque)
2.ConcurrentHashMap
3.Semaphore–訊號量
4.CountDownLatch–閉鎖
5.CyclicBarrier–柵欄
6.Exchanger–交換機
7.Executor->ThreadPoolExecutor,ScheduledThreadPoolExecutor

12345
Semaphore semaphore = new Semaphore(1);  //critical section  semaphore.acquire();  ...  semaphore.release();

8.鎖 Lock–ReentrantLock,ReadWriteLock,Condition,LockSupport

1234
Lock lock = new ReentrantLock();  lock.lock();  //critical section  lock.unlock();

10.concurrentMap 和 HashMap 區別

1.hashMap可以有null的鍵,concurrentMap不可以有
2.hashMap是執行緒不安全的,在多執行緒的時候需要Collections.synchronizedMap(hashMap),ConcurrentMap使用了重入鎖保證執行緒安全。
3.在刪除元素時候,兩者的演算法不一樣。
ConcurrentHashMapHashtable主要區別就是圍繞著鎖的粒度以及如何鎖,可以簡單理解成把一個大的HashTable分解成多個,形成了鎖分離。

11.訊號量是什麼,怎麼使用?volatile關鍵字是什麼?

訊號量-semaphore:荷蘭著名的電腦科學家Dijkstra 於1965年提出的一個同步機制。是在多執行緒環境下使用的一種設施, 它負責協調各個執行緒, 以保證它們能夠正確、合理的使用公共資源。
整形訊號量:表示共享資源狀態,且只能由特殊的原子操作改變整型量。
同步與互斥:同類程序為互斥關係(印表機問題),不同程序為同步關係(消費者生產者)。

使用volatile關鍵字是解決同步問題的一種有效手段。 java volatile關鍵字預示著這個變數始終是“儲存進入了主存”。更精確的表述就是每一次讀一個volatile變數,都會從主存讀取,而不是CPU的快取。同樣的道理,每次寫一個volatile變數,都是寫回主存,而不僅僅是CPU的快取。
Java 保證volatile關鍵字保證變數的改變對各個執行緒是可見的。

image.png

12.阻塞隊列了解嗎?怎麼使用

阻塞佇列 (BlockingQueue)是Java util.concurrent包下重要的資料結構,BlockingQueue提供了執行緒安全的佇列訪問方式:當阻塞佇列進行插入資料時,如果佇列已滿,執行緒將會阻塞等待直到佇列非滿;從阻塞佇列取資料時,如果佇列已空,執行緒將會阻塞等待直到佇列非空。併發包下很多高階同步類的實現都是基於BlockingQueue實現的。

image.png

image.png

以ArrayBlockingQueue為例,我們先來看看程式碼:

123456789101112
public void put(E e) throws InterruptedException {    if (e == null) throw new NullPointerException();    final ReentrantLock lock = this.lock;    lock.lockInterruptibly();    try {        while (count == items.length)            notFull.await();        enqueue(e);    } finally {        lock.unlock();    }}

put方法的實現可以看出,它先獲取了鎖,並且獲取的是可中斷鎖,然後判斷當前元素個數是否等於陣列的長度,如果相等,則呼叫notFull.await()進行等待,當被其他執行緒喚醒時,通過enqueue(e)方法插入元素,最後解鎖。

12345678910111213
/*** Inserts element at current put position, advances, and signals.* Call only when holding lock.*/private void enqueue(E x) {    // assert lock.getHoldCount() == 1;    // assert items[putIndex] == null;    final Object[] items = this.items;    items[putIndex] = x;    if (++putIndex == items.length) putIndex = 0;    count++;    notEmpty.signal();}

插入成功後,通過notEmpty喚醒正在等待取元素的執行緒。

13.Java中的NIO,BIO,AIO分別是什麼?

IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、非同步非阻塞的AIO

1.BIO,同步阻塞式IO,簡單理解:一個連線一個執行緒.BIO方式適用於連線數目比較小且固定的架構,這種方式對伺服器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程式直觀簡單易理解。

在JDK1.4之前,用Java編寫網路請求,都是建立一個ServerSocket,然後,客戶端建立Socket時就會詢問是否有執行緒可以處理,如果沒有,要麼等待,要麼被拒絕。即:一個連線,要求Server對應一個處理執行緒。

2.NIO,同步非阻塞IO,簡單理解:一個請求一個執行緒.NIO方式適用於連線數目多且連線比較短(輕操作)的架構,比如聊天伺服器,併發侷限於應用中,程式設計比較複雜,JDK1.4開始支援。

NIO本身是基於事件驅動思想來完成的,其主要想解決的是BIO的大併發問題: 在使用同步I/O的網路應用中,如果要同時處理多個客戶端請求,或是在客戶端要同時和多個伺服器進行通訊,就必須使用多執行緒來處理。也就是說,將每一個客戶端請求分配給一個執行緒來單獨處理。這樣做雖然可以達到我們的要求,但同時又會帶來另外一個問題。由於每建立一個執行緒,就要為這個執行緒分配一定的記憶體空間(也叫工作儲存器),而且作業系統本身也對執行緒的總數有一定的限制。如果客戶端的請求過多,服務端程式可能會因為不堪重負而拒絕客戶端的請求,甚至伺服器可能會因此而癱瘓。

3.AIO,非同步非阻塞IO,簡單理解:一個有效請求一個執行緒.AIO方式使用於連線數目多且連線比較長(重操作)的架構,比如相簿伺服器,充分呼叫OS參與併發操作,程式設計比較複雜,JDK7開始支援。

14.類載入機制是怎樣的

JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader是一個重要的Java執行時系統元件。它負責在執行時查詢和裝入類檔案的類。
類載入的五個過程:載入、驗證、準備、解析、初始化。

從類被載入到虛擬機器記憶體中開始,到卸御出記憶體為止,它的整個生命週期分為7個階段,載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸御(Unloading)。其中驗證、準備、解析三個部分統稱為連線。

15.什麼是冪等性

所謂冪等,簡單地說,就是對介面的多次呼叫所產生的結果和呼叫一次是一致的。
那麼我們為什麼需要介面具有冪等性呢?設想一下以下情形:

  • 在App中下訂單的時候,點選確認之後,沒反應,就又點選了幾次。在這種情況下,如果無法保證該介面的冪等性,那麼將會出現重複下單問題。
  • 在接收訊息的時候,訊息推送重複。如果處理訊息的介面無法保證冪等,那麼重複消費訊息產生的影響可能會非常大。

16.有哪些 JVM 調優經驗

  • 記憶體引數
引數 作用
-Xmx 堆大小的最大值。當前主流虛擬機器的堆都是可擴充套件的
-Xms 堆大小的最小值。可以設定成和 -Xmx 一樣的值
-Xmn 新生代的大小。現代虛擬機器都是“分代”的,因此堆空間由新生代和老年代組成。新生代增大,相應地老年代就減小。Sun官方推薦新生代佔整個堆的3/8
-Xss 每個執行緒的堆疊大小。該值影響一臺機器能夠建立的執行緒數上限
-XX:MaxPermSize= 永久代的最大值。永久代是 HotSpot 特有的,HotSpot 用永久代來實現方法區
-XX:PermSize= 永久代的最小值。可以設定成和 -XX:MaxPermSize 一樣的值
-XX:SurvivorRatio= Eden 和 Survivor 的比值。基於“複製”的垃圾收集器又會把新生代分為一個 Eden 和兩個 Survivor,如果該引數為8,就表示 Eden 佔新生代的80%,而兩個 Survivor 各佔10%。預設值為8
-XX:PretenureSizeThreshold= 直接晉升到老年代的物件大小。大於這個引數的物件將直接在老年代分配。預設值為0,表示不啟用
-XX:HandlePromotionFailure= 是否允許分配擔保失敗。在 JDK 6 Update 24 後該引數已經失效。
-XX:MaxTenuringThreshold= 物件晉升到老年代的年齡。物件每經過一次 Minor GC 後年齡就加1,超過這個值時就進入老年代。預設值為15
-XX:MaxDirectMemorySize= 直接記憶體的最大值。對於頻繁使用 nio 的應用,應該顯式設定該引數,預設值為0
  • GC引數
垃圾收集器 引數

相關推薦

面試整理-Java綜合高階

Java面試總結 1.你用過哪些集合類? 大公司最喜歡問的Java集合類面試題 40個Java集合面試問題和答案 java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多型方法。 java.util.Collecti

面試整理-JAVA部分-JAVA模式

1、Java部分 1.1  java基礎 1.2 JVM學習筆記 1.3 JAVA模式 1、簡單工廠模式 模式定義: 簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立

最近整理的一些常見的面試題,面試大全,黑馬程式設計師面試寶典題庫---JavaWEE高階

一、 Filter 和 Listener(評論留言獲取原件) 可參見:https://www.cnblogs.com/libingbin/p/5985647.html 二、 AJAX 1. 談談你對 ajax 的認識? Ajax 是一種建立互動式網頁應用的的網頁開發技術;

Java高階整理

面試中常常會問及Java細節相關的問題,而由於往往在平時中不會過多的涉及,所以不能得心應手。而通過閱讀課本和網上資料,會有一定的幫助,但紙上得來終覺淺,絕知此事須躬行。以部落格的形式梳理思路,通過一行行程式碼,深入理解Java細節,從而對於Java高階特性進行全面掌握。 Java三大特性 封裝

【轉】【NIO】Java面試高階Java NIO:淺析I/O模型面試題15期

在進入Java NIO程式設計之前,我們今天先來討論一些比較基礎的知識:I/O模型。本文先從同步和非同步的概念 說起,然後接著闡述了阻塞和非阻塞的區別,接著介紹了阻塞IO和非阻塞IO的區別,然後介紹了同步IO和非同步IO的區別,接下來介紹了5種IO模型,最後介紹了兩種和高

【魯班學院】面試總結:Java高階(上):集合的型別以及重新認識HashMap

1.你用過哪些集合類?     大公司最喜歡問的Java集合類面試題     4

java開發崗位面試整理

一、Java基礎 1. String類為什麼是final的 2. HashMap的原始碼,實現原理,底層結構。 3. 說說你知道的幾個Java集合類:list、set、queue、map實現類。 4. 描述一下ArrayList和LinkedList各自實現和區別 5. Java中的佇列都有哪些,有

04-撩課-Java面試寶典-第四

31.靜態變數和例項變數的區別? 靜態變數也叫類變數, 這種變數前加了static修飾符。 可以直接用類名呼叫, 也可以用物件呼叫, 而且所有物件的同一個類變數 都是共享同一塊記憶體空間。 例項變數也叫物件變數, 這種變數沒有加static修飾符。 只能通過物件呼叫, 而且所

03-撩課-Java面試寶典-第三

21.final, finally, finalize的區別 1、final修飾符(關鍵字)。 被final修飾的類, 就意味著不能再派生出新的子類, 不能作為父類而被子類繼承。 因此一個類不能既被abstract宣告, 又被final宣告。將變數或方法宣告為final, 可以保證他們在

05-撩課-Java面試寶典-第五

41.Iterator、ListIterator 和 Enumeration的區別? 迭代器是一種設計模式, 它是一個物件, 它可以遍歷並選擇序列中的物件, 而開發人員不需要了解 該序列的底層結構。 迭代器通常被稱為“輕量級”物件, 因為建立它的代價小。 Java中的Iterator功能

linux運維工程師面試常見問題整理8--預設埠(持續更新ing)

歡迎喜歡實施運維及資料的小夥伴加入群進行談論! 運維技術群:263859509 1.中介軟體類 中介軟體名稱 預設埠 tomcat 8080 wildfly

java面試(進階五)解答

題目來自於網路,答案是筆者整理的。僅供參考,歡迎指正 來源: https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485897&idx=1&sn=25f71098bd5421722db25117

java面試(進階四)解答

題目來自於網路,答案是筆者整理的。僅供參考,歡迎指正 來源: https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485779&idx=1&sn=3b06b9923df7f40f887ead8b

java面試(進階三)解答

題目來自於網路,答案是筆者整理的。僅供參考,歡迎指正 來源: https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485723&idx=1&sn=f5c3bfbfab9fe01e6d4979e4

java面試(進階二)解答

題目來自於網路,答案是筆者整理的。僅供參考,歡迎指正 題目來源: https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485604&idx=1&sn=d624680e941b7cd6e2b3ce

07-撩課-Java面試寶典-第七

61.什麼是併發修改異常? 什麼是併發修改異常: 當我們在遍歷實現了collection介面 與iterator介面的集合時(List、Set、Map), 我們可以通過遍歷索引 也可以通過迭代器進行遍歷。 在我們使用迭代器進行遍歷集合的時候, 會獲取到當前集合的迭代物件。 在裡面有封裝

06-撩課-Java面試寶典-第六

51.HashMap的實現原理 HashMap的主幹是一個Entry陣列。 Entry是HashMap的基本組成單元, 每一個Entry包含一個key-value鍵值對。 HashMap基於hashing原理, 我們通過put()和get()方法儲存和獲取物件。 當我們將鍵值對傳

「不能說的祕密」BAT資深面試整理Java架構面試題

面試是一個老生常談的話題,這裡裡有這份大佬整理有關於Java的面試題,發出來分享給大家。 這些題目是網友去百度、小米、樂視、美團、58、獵豹、360、新浪、搜狐等一線網際網路公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的機率。 網上的都是按照公司劃分的,想找具體某一

10-撩課-Java面試寶典-第十

81.Servlet的會話機制? HTTP 是一種無狀態協議, 這意味著每次客戶端檢索網頁時, 都要單獨開啟一個伺服器連線, 因此伺服器不會記錄下 先前客戶端請求的任何資訊。 它與FTP、Telnet等協議不同, FTP等協議可以記住使用者的連線資訊。 會話(Session)是指一個終

13-撩課-Java面試寶典-第十三

撩課Java+系統架構點選開始學習 96.JDBC操作資料庫的步驟 ? 1、載入資料庫驅動 2、建立並獲取資料庫連結 3、建立jdbc statement物件 4、設定sql語句 5、設定sql語句中的引數(使用preparedStatement) 6、通過statemen