前言
剛剛經歷了3-4兩個月的找Java實習的經歷,雖然結果並不算完美(只收獲幾個小廠的offer),但複習準備的經歷也算是收穫頗豐,更加深刻的理解了Java相關的源碼知識,能夠靜下心來研究平常不會去考慮的JVM,併發編程等知識,經歷過這樣的複習後能夠更加認識到理論知識的重要性。
分類
Java面試題大體有如下幾大類:
- JDK源碼
- 數據庫
- JVM
- Java併發編程
- Spring框架
- 計算機網絡
- 算法
- Linux命令(個人沒怎麼複習,所以本文不考慮)
- Redis(可選)
- 消息中間件,如rabbitmq(可選)
注:一些比較基礎的如java知識,面向對象,多態等概念並未列出,還有操作系統原理知識點並不常被問到,也沒列出(也是由於這些知識點多采用書本的方式複習,並未整理。。)。
JDK源碼
HashMap:(重點:HashMap的數組+鏈表+紅黑樹的含義,hash如何定位到對應的數組下標,put()和resize()的過程)
- HashMap源碼解析:https://blog.csdn.net/m0_37914588/article/details/82287191
- HashMap面試題:https://www.cnblogs.com/zengcongcong/p/11295349.html
- HashMap鏈表轉紅黑樹時機:https://www.cnblogs.com/wangflower/p/12235595.html
ArrayList、LinkedList:(源碼比較簡單,重點:兩者內部的數據結構,以及優缺點(增刪查改的性能))
- ArrayList源碼分析:https://blog.csdn.net/augfun/article/details/82323164
- LinkedList源碼分析:https://blog.csdn.net/m0_37884977/article/details/80467658
String相關(相對較簡單,重點:String結合字符串常量池理解,StringBuilder和StringBuffer)
- StringBuilder源碼分析:https://blog.csdn.net/u012317510/article/details/83721250
- String爲什麼設計爲不可變類型:https://blog.csdn.net/renfufei/article/details/16808775
- String源碼分析:https://blog.csdn.net/sun_shaoping/article/details/82079354
- String.intern()
- String的‘+’:採用StringBuilder()來完成。
包裝類(以Integer爲例,常作爲筆試題來出。重點:Integer.valueOf() (內部緩存),Integer.stringSize())
- Integer源碼解析:https://blog.csdn.net/JavaZWT/article/details/81587333
- Integer與int(Integer筆試題):https://www.cnblogs.com/demingblog/p/5626824.html
Java代理
- Java原生動態代理及源碼(通過和被代理類實現相同接口,動態生成代理對象的字節碼文件$Proxy0.class):https://www.jianshu.com/p/9bcac608c714
- CGlib代理:通過繼承實現(子類可以重寫,增強父類的方法):https://blog.csdn.net/flyfeifei66/article/details/81481222
其他雜亂知識點
- 深拷貝與淺拷貝以及實現深拷貝: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版》,此書講的非常清晰易懂,強推!
- InnoDB引擎:mysql數據庫(InnoDB引擎)筆記
- 數據庫面試題:https://www.cnblogs.com/wenxiaofei/p/9853682.html
- 數據庫原理解析:https://blog.csdn.net/qq_17312239/article/details/80825121
- Mysql實現可重複讀:https://www.cnblogs.com/lmj612/p/10598971.html
- InnoDB和MyISAM引擎的區別:https://blog.csdn.net/qq_27607965/article/details/79925288
- MySQL預編譯語句:https://www.cnblogs.com/micrari/p/7112781.html
- MySQL優化規範建議:https://mp.weixin.qq.com/s__biz=Mzg2OTA0Njk0OA==&mid=2247485117&idx=1&sn=92361755b7c3de488b415ec4c5f46d73
JVM
關於JVM,我主要看的是周志明的深入理解Java虛擬機,基本認真看了這本書就能應付絕大多數jvm面試問題了。下邊貼出整理筆記
JVM筆記:深入理解Java虛擬機 筆記
Java併發編程
Java併發編程主要考點在於鎖機制,重點Lock和synchronized,另外JUC包下的類,線程池,ThreadLocal也經常會問。也有問實操(給一個場景,分析可能的併發問題,採用什麼手段來解決。這個最麻煩,不是簡單背書能解決)。Java併發編程推薦一本入門數據《實戰Java高併發程序設計(第2版)》葛一鳴著,講的通俗易懂,讀起來很輕鬆,缺點也在於不夠深入。可以讀讀下邊的博客加以補充。推薦一個學習併發編程的網站(http://ifeve.com/),有許多權威併發編程文章的譯文。
鎖
- Synchronized關鍵字底層原理:https://blog.csdn.net/javazejian/article/details/72828483
- ReentrantLock源碼解析:https://www.cnblogs.com/takumicx/p/9402021.html
ThreadLocal
- ThreadLocal源碼解析:https://www.jianshu.com/p/3c5d7f09dfbd
- ThreadLocal內存泄漏問題:https://blog.csdn.net/puppylpg/article/details/80433271
- 1爲什麼key是弱引用value是強引用
- 2 ThreadLocal最佳實踐
- 3 ThreadLocal與線程池共用的問題
- 真實項目中的ThreadLocal使用:https://blog.csdn.net/chunaopan4255/article/details/100897981
- 父子線程傳值問題(InheritableThreadLocal):https://www.cnblogs.com/tracer-dhy/p/11404666.html
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線程池
- Java線程池簡單剖析:https://baijiahao.baidu.com/s?id=1641469444994560637
- Java線程池ThreadPoolExecutor實現源碼:https://www.jianshu.com/p/87bff5cc8d8c
- Java線程池設置優先級的簡單方式:https://blog.csdn.net/weixin_42440768/article/details/85333954
其他雜亂知識點
- Callable和Runnable的區別https://blog.csdn.net/MrHamster/article/details/89891145
- CopyOnWriteArrayList源碼解析(結合開頭提到的文章一起看):https://www.cnblogs.com/myseries/p/10877420.html
- ConcurrentHashMap
- JUC原子類以及ABA問題
- 創建線程的方式
Spring框架
spring框架主要問基本概念和源碼(一般問源碼的並不多),Spring相關有許多附加知識點,JPA,MyBatis,Hibernate等,由於部分並未整理不做介紹。
- Spring IOC源碼解析(詳細到看不下去):https://blog.csdn.net/nuomizhende45/article/details/81158383
- Spring 解決循環依賴:https://blog.csdn.net/qq_36381855/article/details/79752689
- Spring Bean生命週期:https://www.jianshu.com/p/1dec08d290c1
- @Autowire和@Resource: https://blog.csdn.net/magi1201/article/details/82590106
- @Autowire注入原理:https://blog.csdn.net/weixin_40444222/article/details/95932225
- @Component和@Bean的區別:https://snailclimb.gitee.io/javaguide-interview/#/./docs/e-1spring?id=component-%e5%92%8c-bean-%e7%9a%84%e5%8c%ba%e5%88%ab%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9f
- Spring事務傳播機制:https://blog.csdn.net/li396864285/article/details/75098303
- SpringBoot自動配置:https://blog.csdn.net/u014745069/article/details/83820511
- Spring @Transactional註解解析:https://blog.csdn.net/yangquanwa/article/details/88578357
計算機網絡
計算機網絡主要看書,如《計算機網絡 第七版》謝希仁著。一般主要考察TCP,HTTP相關知識點。
- HTTP協議:https://www.cnblogs.com/an-wen/p/11180076.html
- HTTP與HTTPS比較:https://blog.csdn.net/xiaoming100001/article/details/81109617
- HTTP請求的緩存機制:https://www.cnblogs.com/smallKilts/p/10916931.html
- HTTPS協議詳解:https://www.cnblogs.com/fecommunity/p/11965870.html
- TCP三次握手較正確的原因:https://blog.csdn.net/lengxiao1993/article/details/82771768
Redis
- Redis分佈式鎖:https://blog.csdn.net/yb223731/article/details/90349502
- Redis內存淘汰機制:https://www.jianshu.com/p/b1b4eeccc140
- Redis槽點:https://www.cnblogs.com/php-linux/p/11457317.html
- Redis緩存擊穿,緩存穿透,緩存雪崩:https://www.jianshu.com/p/b57d0773ee96
- 布隆過濾器:https://www.jianshu.com/p/2104d11ee0a2
RabbitMQ
- RabbitMQ介紹:https://blog.csdn.net/liuensong/article/details/103538985
- 消息隊列如何保證消息不被重複接收(簡單看):https://blog.csdn.net/ikownyou/article/details/88065709
- Rabbitmq保證可靠傳輸:https://www.cnblogs.com/mengchunchen/p/10020488.html
- Rabbitmq保證消息的順序性:https://www.cnblogs.com/doit8791/p/10340482.html
算法
基本面試必寫的算法,具體自行leetcode刷題(dfs解決一切hh)。本節只列舉自己整理的可能口述的算法題
- 排序算法(圖解):https://www.cnblogs.com/onepixel/articles/7674659.html
- 簡單約瑟夫環問題:https://blog.csdn.net/dongyanwen6036/article/details/84892590
- 100億個數裏找最大的前K個數: https://blog.csdn.net/sophia__yu/article/details/80216369
- 100本書,兩個人拿,一次只能拿1~5本,你先拿,問怎麼保證最後一本一定是你拿到:https://www.jianshu.com/p/42fa9fcccade
- 剪繩子:https://blog.csdn.net/yl_puyu/article/details/104497699
- 64匹馬,8個賽道,找出前4名最少比賽多少場?:https://www.cnblogs.com/reanote/p/find_4th_in_64horse.html
其他雜亂的知識點
僞共享和緩存行: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://crossoverjie.top/JCSprout/#/
JavaGuide:https://snailclimb.gitee.io/javaguide/#/
敖丙:https://github.com/AobingJava/JavaFamily