Java後端開發面試筆記總結(超詳細,不看後悔hh)

前言

        剛剛經歷了3-4兩個月的找Java實習的經歷,雖然結果並不算完美(只收獲幾個小廠的offer),但複習準備的經歷也算是收穫頗豐,更加深刻的理解了Java相關的源碼知識,能夠靜下心來研究平常不會去考慮的JVM,併發編程等知識,經歷過這樣的複習後能夠更加認識到理論知識的重要性。

分類

Java面試題大體有如下幾大類:

  • JDK源碼
  • 數據庫
  • JVM
  • Java併發編程
  • Spring框架
  • 計算機網絡
  • 算法
  • Linux命令(個人沒怎麼複習,所以本文不考慮)
  • Redis(可選)
  • 消息中間件,如rabbitmq(可選)

注:一些比較基礎的如java知識,面向對象,多態等概念並未列出,還有操作系統原理知識點並不常被問到,也沒列出(也是由於這些知識點多采用書本的方式複習,並未整理。。)。

JDK源碼

HashMap:(重點:HashMap的數組+鏈表+紅黑樹的含義,hash如何定位到對應的數組下標,put()和resize()的過程)

ArrayList、LinkedList:(源碼比較簡單,重點:兩者內部的數據結構,以及優缺點(增刪查改的性能))

String相關(相對較簡單,重點:String結合字符串常量池理解,StringBuilder和StringBuffer)

包裝類(以Integer爲例,常作爲筆試題來出。重點:Integer.valueOf() (內部緩存),Integer.stringSize())

Java代理

其他雜亂知識點

  • 深拷貝與淺拷貝以及實現深拷貝:https://blog.csdn.net/caoxiaohong1005/article/details/78704890
  • Class.forName()和ClassLoader.loadClass()區別:https://www.cnblogs.com/zabulon/p/5826610.html
  • Java NIO(開頭提到的兩篇文章也都值得看):https://blog.csdn.net/forezp/article/details/88414741
  • 在Java中定義一個不做事且沒有參數的構造方法的作用:Java 程序在執行子類的構造方法之前,如果沒有用 super()來調用父類特定的構造方法,則會調用父類中“沒有參數的構造方法”。因此,如果父類中只定義了有參數的構造方法,而在子類的構造方法中又沒有用 super()來調用父類中特定的構造方法,則編譯時將發生錯誤,因爲 Java 程序在父類中找不到沒有參數的構造方法可供執行。解決辦法是在父類里加上一個不做事且沒有參數的構造方法。
  • HashSet如何檢查重複:當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與該位置其他已經加入的對象的 hashcode 值作比較,如果沒有相符的 hashcode,HashSet 會假設對象沒有重複出現。但是如果發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同。如果兩者相同,HashSet 就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。這樣我們就大大減少了 equals 的次數,相應就大大提高了執行速度。

數據庫

本文主要介紹mysql相關知識點,以及mysql的InnoDB。引擎的數據庫知識主要分爲數據庫原理,sql語句,數據庫引擎細節,sql多爲知識點多,多爲實操,本文不做介紹(之前美團面試有問到)。數據庫原理知識大多數數據庫原理教程講的都大同小異,數據庫引擎介紹,我使用的是《MySQL技術內幕(InnoDB存儲引擎)第2版》,此書講的非常清晰易懂,強推!

JVM

關於JVM,我主要看的是周志明的深入理解Java虛擬機,基本認真看了這本書就能應付絕大多數jvm面試問題了。下邊貼出整理筆記

JVM筆記:深入理解Java虛擬機 筆記

Java併發編程

Java併發編程主要考點在於鎖機制,重點Lock和synchronized,另外JUC包下的類,線程池,ThreadLocal也經常會問。也有問實操(給一個場景,分析可能的併發問題,採用什麼手段來解決。這個最麻煩,不是簡單背書能解決)。Java併發編程推薦一本入門數據《實戰Java高併發程序設計(第2版)》葛一鳴著,講的通俗易懂,讀起來很輕鬆,缺點也在於不夠深入。可以讀讀下邊的博客加以補充。推薦一個學習併發編程的網站(http://ifeve.com/),有許多權威併發編程文章的譯文。

筆記:實戰Java高併發程序設計(第2版)

ThreadLocal

volatile

  • Java內存模型(Java產生同步問題的具體原因):https://www.jianshu.com/p/15106e9c4bf3
  • 關於volatile關鍵字的實現細節:內存屏障:https://www.jianshu.com/p/08a0a8c984ab
  • 併發環境下指令重排引起的問題:https://www.jianshu.com/p/90429f2a2aed
  • volatile變量使用細節:可以將對volatile變量的讀寫理解爲一個觸發刷新的操作,寫入volatile變量時,線程中的所有變量也都會觸發寫入主存。而讀取volatile變量時,也同樣會觸發線程中所有變量從主存中重新讀取。因此,應當儘量將volatile的寫入操作放在最後,而將volatile的讀取放在最前,這樣就能連帶將其他變量也進行刷新。
  • volatile變量使用前提:變量的新值寫入不能依賴於變量的舊值,因爲根據舊值來計算新值的過程可能出現競態問題,多個線程同時讀取變量的同一個最新值,之後變量的修改操作將會發生覆蓋。

Java線程池

其他雜亂知識點

Spring框架

spring框架主要問基本概念和源碼(一般問源碼的並不多),Spring相關有許多附加知識點,JPA,MyBatis,Hibernate等,由於部分並未整理不做介紹。

計算機網絡

計算機網絡主要看書,如《計算機網絡 第七版》謝希仁著。一般主要考察TCP,HTTP相關知識點。

Redis

RabbitMQ

算法

基本面試必寫的算法,具體自行leetcode刷題(dfs解決一切hh)。本節只列舉自己整理的可能口述的算法題

其他雜亂的知識點

僞共享和緩存行:https://www.jianshu.com/p/7f89650367b8

字節碼角度分析i++和++i: https://www.jianshu.com/p/7988e646a37e

Java高併發系統的限流策略:https://blog.csdn.net/abc592328292/article/details/80295837

Java Lambda表達式實現原理:https://blog.csdn.net/jiankunking/article/details/79825928

Java8 Stream API詳解:https://blog.csdn.net/justloveyou_/article/details/79562574

 

幾個推薦的他人優秀的複習整理:

美團面試題:https://github.com/Snailclimb/JavaGuide/blob/master/docs/essential-content-for-interview/PreparingForInterview/%E7%BE%8E%E5%9B%A2%E9%9D%A2%E8%AF%95%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.md#21-%E4%B8%A4%E8%80%85%E7%9A%84%E5%AF%B9%E6%AF%94

常見面試題總結:https://crossoverjie.top/JCSprout/#/

JavaGuide:https://snailclimb.gitee.io/javaguide/#/

敖丙:https://github.com/AobingJava/JavaFamily

 

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