1. 程式人生 > 其它 >牛客網面試題

牛客網面試題

目錄

一、JAVA

二、計算機網路

三、作業系統

四、專案

五、資料庫

第六部分 框架

第七部分 設計模式

第八部分 資料結構和演算法

第九部分 Linux

################################################################################################################################


第一部分 JAVA

JVM

  1. 講一下JVM的記憶體模型。

  2. Java8 中 JVM 執行時資料區

  3. 說一下 Java 方法執行的過程,說詳細一點。編譯、載入(類載入)、執行解釋

  4. Java 8 新特性

  5. 怎麼調整堆的大小?要修改哪個引數?

  6. 訊號驅動IO和多路複用IO知道嗎?

  7. String s = new String("abc"); 程式碼執行完在記憶體中存什麼東西?s這個變數放在哪裡呢?

    String str = new String("abc");
    String str = "abc";
    /*
    第一種是用new()來建立物件的,它會存放在堆中,每呼叫一次就會建立一個新的物件;
    第二種是先在棧中建立一個對String類的物件引用變數str ,然後查詢棧中有沒有存放"abc",如果沒有,則將"abc"存放進棧,並令str 指向"abc",如果已經有"abc",則直接令str 指向"abc"。
    比較類裡面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個物件時,用 ==
    */
    
  8. 發生記憶體溢位可能的原因有哪些?

    型別:常發性記憶體洩漏、偶發性記憶體洩漏、一次性記憶體洩漏、隱式記憶體洩漏
    1.記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料;
    2.集合類中有對物件的引用,使用完後未清空,使得JVM不能回收;
    3.程式碼中存在死迴圈或迴圈產生過多重複的物件實體;
    4.使用的第三方軟體中的BUG;
    5.啟動引數記憶體值設定的過小
    
  9. 什麼樣的物件不能回收?用什麼方法決策物件是否能回收?

    1. 引用計數法:引用和物件是有關聯的。如果要操作物件則必須用引用進行,物件如果沒有任何與之關聯的引用則可以回收
    2. 可達性分析:解決引用計數法的迴圈引用問題;如果在“GC roots”和一個物件之間沒有可達路徑,則稱該物件是不可達的;不可達物件變為可回收物件至少要經過兩次標記過程
    
  10. Java中的類載入過程?載入,驗證,準備,解析,初始化

  11. 雙親委派模型?有什麼機制可以打破雙親委派模型?

JAVA集合

  1. 講一下ArrayList與LinkList的區別:陣列和連結串列的區別---查詢和修改插入
  2. Hashmap 擴容機制,為什麼 hashmap 定義時一般初始化一個大小?HashMap的底層原理?HashMap是執行緒安全的嗎?Java中HashMap的擴容因子為什麼是0.75?
  3. 說一下ConcurrentHashMap?
  4. LinkedHashmap 如何實現的
  5. Java 的集合常用什麼?一般在什麼場景下用到?

JAVA執行緒和多執行緒

  1. 講一下Java中執行緒的六種狀態及其轉換

    1. **初始(NEW)**:新建立了一個執行緒物件,但還沒有呼叫start()方法。
    2. **執行(RUNNABLE)**:Java執行緒中將就緒(ready)和執行中(running)兩種狀態籠統的稱為“執行”。
       執行緒物件建立後,其他執行緒(比如main執行緒)呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲取CPU的使用權,此時處於就緒狀態(ready)。就緒狀態的執行緒在獲得CPU時間片後變為執行中狀態(running)。
    3. **阻塞(BLOCKED)**:表示執行緒阻塞於鎖。
    4. **等待(WAITING)**:進入該狀態的執行緒需要等待其他執行緒做出一些特定動作(通知或中斷)。
    5. **超時等待(TIMED_WAITING)**:該狀態不同於WAITING,它可以在指定的時間後自行返回。
    6. **終止(TERMINATED)**:表示該執行緒已經執行完畢。
    
  2. 講一下Java裡面的執行緒安全、概念、如何實現寫一個兩個執行緒死鎖的案例,或者表述一下

  3. volatile關鍵字的作用?什麼場景下會使用volatile?舉個實際的場景?volatile 的底層實現,如何防止指令重排執行緒,有哪些狀態,說一下,並且說一下這些狀態之間如何轉移。

  4. 執行緒池用過嗎?說一下四種常用執行緒池。如果讓你實現具有快取功能的執行緒池的類怎麼實現?

    - CachedThreadPool:建立一個可根據需要建立新執行緒的執行緒池
    - FixedThreadPool:建立一個可重用固定執行緒數的執行緒池,以共享的無界佇列方式來執行這些執行緒
    - ScheduledThreadPool:建立一個執行緒池,它可安排在給定延遲後執行命令或者定期地執行
    - SingleThreadExecutor:返回一個執行緒池(這個執行緒池只有一個執行緒),這個執行緒池可以線上程死後(或發生異常時)重新啟動一個執行緒來替代原來的執行緒繼續執行下去
    
  5. sleep和wait有什麼區別?run()和start()方法的區別?

    1. 對sleep()方法屬於 Thread 類中的。而 wait()方法屬於Object 類中的
    2. sleep()方法導致了程式暫停執行指定的時間,讓出 cpu 該其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。
    3. 在呼叫 sleep()方法的過程中,執行緒不會釋放物件鎖。
    4. 而當呼叫 wait()方法的時候,執行緒會放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件呼叫 notify()方法後本執行緒才進入物件鎖定池準備獲取物件鎖進入執行狀態。
    
    1. start()方法來啟動執行緒,真正實現了多執行緒執行。這時無需等待 run 方法體程式碼執行完畢,可以直接繼續執行下面的程式碼。
    2. 通過呼叫 Thread 類的 start()方法來啟動一個執行緒, 這時此執行緒是處於就緒狀態, 並沒有執行。
    3. 方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,執行緒就進入了執行狀態,開始執行 run 函式當中的程式碼。 Run 方法執行結束, 此執行緒終止。然後 CPU 再排程其它執行緒。
    
  6. Callable()和Future用過嗎?****使用Callable()建立執行緒比另外兩種方式有什麼優勢嗎?

  7. volatile int a=1,寫一個方法對a進行累加,這個方法是有多個執行緒去訪問的,這樣實現能保證執行緒安全嗎?詳細講下為什麼兩個執行緒同時訪問不能保證執行緒安全?(如果執行緒安全a應該為3,但是執行緒不安全就不會是3)

  8. 有一個檔案,有很多人在讀。併發讀,沒有影響,但是當一個人在寫入檔案時,不允許其他人寫入,如果已經在寫這個檔案時,是不允許讀,因為在修改過程中讀的不是最新的,如果有人讀的情況下,不希望有人能寫,如果要實現這個功能,程式碼應該怎麼去實現,去做多執行緒的控制?

  9. new一個執行緒放在哪裡?

  10. 執行緒之間的通訊方式?

    1.volatile和synchronized關鍵字
    2.等待/通知機制:
    //指一個執行緒A呼叫了物件O的wait()方法進入等待狀態,而另一個執行緒B呼叫了物件O的notify()或者notifyAll()方法,執行緒A收到通知後從物件O的wait()方法返回,進而執行後續操作
    //經典範例:生產者、消費者
    3.管道輸入/輸出流:
    //用於執行緒之間的資料傳輸,而傳輸的媒介為記憶體
    //種具體實現:PipedOutputStream、PipedInputStream、PipedReader和PipedWriter,前兩種面向位元組,而後兩種面向字元
    4.Thread.join()
    //理解成是執行緒合併,當在一個執行緒呼叫另一個執行緒的join方法時,當前執行緒阻塞等待被呼叫join方法的執行緒執行完畢才能繼續執行
    5.ThreadLocal:
    //ThreadLocal,即執行緒變數,是一個以ThreadLocal物件為鍵、任意物件為值的儲存結構
    //將當前執行緒和一個map繫結,在當前執行緒內可以任意存取資料,減省了方法呼叫間引數的傳遞
    //更像是一個執行緒內部的通訊
    

JAVA基礎知識

  1. 說下hashCode( )?什麼場景下會重寫hashCode()?

    HashCode()方法和equals()方法的作用其實一樣,都是比較兩個物件是否相等
        1.重寫的equals()一般比較全面比較複雜,這樣效率就比較低,而利用HashCode()進行雙向對比,則只要生成一個hash值就可以進行比較,效率較高。
        2.HashCode()不完全可靠:equals()相等的物件肯定相等,HashCode相等的物件不一定相等,不相等的物件一定不相等。
    不重寫:不重寫的HashCode比較的是地址值,對於引用資料型別不能比較。所以必須重寫。
    重寫:1.HashTable、HashMap、HashSet 2.重寫了equals就一定要重寫HashCode
    
    
  2. 在開發過程中用過到Java的反射嗎?你對Java反射的理解?在Java命名規範中一般採用駝峰命名的方式,假設想基於反射做一件事,有一個包,包裡面有很多類,找出命名不符合規範的類名、方法 名、屬性名,怎麼實現?

  3. 寫一個Java類,屬性中可能是一個類物件,怎麼解決一層一層往下掃的問題?(屬性是一個類,類中又有屬性)

  4. 序列化?反序列化?什麼情況下會使用序列化?

第二部分 計算機網路

  1. Https和Http的區別?
  2. ssl證書如果驗證失敗會有哪些原因呢?
  3. 訪問一個網址時域名解析成ip的過程?
  4. 怎麼處理跨域問題?
  5. TCP3次握手,4次揮手?為什麼要3次握手?不是4次,5次?為什麼要4次揮手?

第三部分 作業系統

  1. 什麼場景下會出現死鎖?怎麼避免死鎖?

第四部分 專案

  1. 你寫的專案中,資料庫中設計了幾張表?
  2. 表中有沒有用索引?索引是怎麼設計的?
  3. 專案中哪個模組比較複雜?技術難點?
  4. 使用Redis做快取,快取中的資料是怎麼來的?
  5. 專案優化前QPS多少,優化後QPS多少?
  6. 用什麼工具做的測試?在什麼環境下部署的,做的壓測?Jmeter是在哪裡執行的?壓測時本地的配置是怎麼的?做效能壓測在環境部署上要考慮哪些點?
  7. 當併發量比較大時,先查 redis 中的快取, redis 中沒有就去查mysql,併發量大時會不會出現穿透?
  8. 當併發量比較大時,面對快取穿透問題,對於快取空置這種解決方法,併發量大時,可能請求都直接穿透到DB中,有沒有時序問題?
  9. 大致說下加鎖的解決辦法?如果部署到多機,怎麼解決加鎖問題?分散式鎖有沒有了解過?
  10. MySQL中執行SQL查詢語句,mysql的server層的執行流程?

第五部分 資料庫

Redis

  1. redis 的基本資料型別和底層實現,Reids的String型別的底層實現?
  2. Redis有哪些應用場景?你用Redis有哪些場景?使用的是哪些資料結構?
  3. 如何保證快取與資料庫雙寫的一致性?這種方法有沒有存在什麼問題?
  4. Redis怎麼實現分散式鎖?

MySQL

  1. 樂觀鎖和悲觀鎖知道嗎?樂觀鎖和悲觀鎖的優缺點和應用場景是什麼?
  2. 資料庫是怎麼使用索引的?底層實現?
  3. Innodb 的索引資料結構,回表機制,和 mysiam 的區別
  4. 事務的 ACID 特性,事務隔離級別,解決什麼問題
  5. 對資料庫事務是怎麼理解的?資料庫事務的隔離級別?分別介紹下這幾種事務的隔離級別的使用場景或存在的問題?
  6. 髒讀和幻讀的區別?什麼情況下會出現幻讀?
  7. MySQL的隔離級別?

題目

  1. SQL:表A和表B,如果同時插入一條資料,如果要保證事務的一致性,要麼同時成功,要麼同時失敗,程式碼在JDBC中應該怎麼寫?
  2. SQL:有一張學生課程表,裡面記錄學生各門課程的分數,用一條SQL將每門課程的分數都大於80分,將這些學生都找出來?

第六部分 框架

Spring

  1. Spring中AOP是怎麼實現的?
  2. Spring中Bean的初始化過程?
  3. Spring中IOC? 平時自己寫程式碼時有什麼應用場景嗎?
  4. 說一下工廠模式及使用場景?

第七部分 設計模式

  1. 設計模式:觀察者模式?
  2. Java中常用的設計模式?

第八部分 資料結構和演算法

資料結構

  1. 樹結構的好處是什麼,平時有用到哪些,bst 和 avl 樹有什麼區別
  2. 嘗試實現下字典樹的資料結構並且嘗試建立一個字典樹。

演算法

  1. 求無向圖中的連通分量
  2. 判斷二叉樹是否是 bst
  3. 海量資料 ,查詢重複單詞
  4. 三個執行緒交替列印1、2、3,直到100。
  5. 除了B+樹查詢 演算法 ,還了解其他的查詢 演算法 嗎?

第九部分 Linux

  1. 用Linux命令統計一個檔案中某個單詞出現的次數?
  2. 用Linux命令檢視當前有哪些程序在活躍呢?
  3. 用Linux檢視檔案有哪些命令?
  4. less和more知道嗎?