我的JAVA面試題備忘錄

前言

以下是我收集的一些問題,有的是網上摘錄的,有的是自己參加面試被問到的,有的是工作或學習時遇到的,等等。

爲什麼要記錄這些呢?

一方面,我相信,這樣做對我自己的技術提升是有幫助的。在全文結構上我儘量使問題連貫地形成知識體系,而不是堆積的碎片,而且,每個問題我會盡量地給出答案。

另一方面,我希望,有大佬可以指出我的錯誤。因爲我的答案不一定對,尤其那些帶 * 的問題。

這份資料將會持續更新,如果有其他問題也可以留言討論。歡迎交流,共同進步。

修改時間 版本 修改人 修改內容 問題答案
2022-05-02 1.0.0 ZhangZiSheng001 初始化 我的面試題備忘錄1.0.0.pdf

JDK

JVM

class文件的組成結構

說說JVM的運行時數據區

CompressedClassSpace是幹嘛用的

運行時常量池和字符串常量池的區別

Minor GC、Major GC和Full GC的區別

一次完整的GC流程是怎樣的

什麼時候觸發major gc

什麼是分配擔保機制

對象什麼時候晉升到老年代

有哪幾種垃圾回收算法

有哪幾種垃圾回收器

怎麼手動觸發gc

新生代和老年代比例多大比較好*

字符串常量池會gc嗎

MetaSpace會gc嗎

項目裏用到的JVM參數

項目中JVM調優的例子*

運行時能不能調整堆大小*

類加載器

說說類的加載過程

什麼是雙親委派機制

爲什麼要有多個類加載器

爲什麼會有雙親委派機制

爲什麼破壞雙親委派機制

Class.forName和ClassLoader.loadClass的區別

自定義java.lang.String可以嗎

JUC

線程和進程的區別

線程有哪幾個狀態?它們如何轉換的

如何中止一個線程

異步線程的異常怎麼處理*

什麼是線程池?說說它的原理

Executors的幾種線程池

線程池的關閉方式

你們項目怎麼用線程池*

線程池設置多大合適*

ThreadLocal有什麼用

使用ThreadLocal需要注意的問題

volatile的作用

什麼是樂觀鎖、悲觀鎖

CAS的作用

CAS的缺點

什麼是 AQS

什麼是獨佔鎖、共享鎖

什麼是公平鎖、非公平鎖

synchronized原理、優化

CyclicBarrier與CountDownLatch區別

三種等待/喚醒的使用和區別

Object.notify和Condition.signal是隨機喚醒線程嗎

如何保證多個線程順序執行

用三個線程按順序循環打印abc三個字母

不sleep(0)和sleep(0)的區別

容器

說說常用的幾個容器

爲什麼HashMap的數組是2的n次方

爲什麼鏈表大於8且size大於64才轉紅黑樹*

紅黑樹轉回鏈表的閾值爲什麼是6不是8

擴容因子爲什麼是0.75

HashMap和ConcurrentHashMap的區別

TreeMap的使用場景*

ConcurrentHashMap爲什麼放棄分段鎖

DelayQueue的原理

Collections.synchronizedMap本質

異常

Error和Exception的區別

RuntimeException和其他Exception的區別*

其他

String.length() 總是可靠嗎

static方法可以重寫嗎

類的實例化順序

redis

爲什麼要使用緩存

redis爲什麼快

redis爲什麼使用單線程

爲什麼redis6.0又用了多線程

說說redis的數據結構

redis還可以做什麼

redis有哪種持久化

項目中使用哪種持久化?爲什麼

說說redis的高可用架構

爲什麼Cluster模式不用一致性哈希,而是用哈希槽

怎麼解決一致性問題*

redis的過期策略

redis的淘汰策略

緩存穿透、緩存擊穿、緩存雪崩、熱key

如何解決雙寫不一致問題

說說分佈式鎖原理

如何避免多客戶端獲得同一把鎖

超時時間大小設置的依據是什麼*

如何實現一個列表中元素不同過期時間

mysql

爲什麼要用數據庫

爲什麼要用mysql*

關係型數據庫和非關係型的區別

SQL和NOSQL怎麼選擇

爲什麼查詢那麼快

什麼是B+樹

hash索引和B+樹索引的區別

聚簇索引和非聚簇索引的區別

組合索引生效規則

複合索引的索引樹是怎樣的*

怎麼判斷索引是否生效

重複性高的字段都不能加索引嗎

項目中有沒遇到慢查詢?怎麼辦

sql的執行順序

exists和in的區別

count(*)、count(字段) 和count(1)區別

爲什麼select count(*)在myisam比Innodb快

什麼是事務

髒讀、不可重複讀、幻讀的原因和解決方案

什麼是MVCC

RR級別能否解決幻讀

gap鎖和next-key鎖的關係

next-key的一些示例

爲什麼要有意向鎖

MyISAM 和 InnoDB 的區別

如何解決死鎖*

MVCC下delete的數據會一直存在嗎

爲什麼分庫分表

怎麼分庫分表

有哪些分庫分表方案

mysql的主從複製方式

mysql的高可用方案*

主從不一致怎麼解決

隊列

爲什麼使用隊列

爲什麼要用RabbitMQ*

項目裏怎麼用的

AMQP的協議模型

RabbitMQ的兩種模式

RabbitMQ的四種交換機

routingkey和bindingkey的區別

如何保證消息有序*

如何保證消息不丟失

怎麼保證消費冪等性

如何避免隊列消息積壓

如何做延遲隊列

重回隊列的消息排在哪裏

RabbitMQ的高可用方案

生產者創建隊列還是消費者創建隊列

死信交換(DLX)和死信隊列(DLQ)

推模式和拉模式

spring

IOC和DI的理解

beanFactory和applicationContext的區別

如何解決循環依賴

什麼情況會出現無法解析的循環依賴?爲什麼

bean的生命週期

事務傳播機制

Spring Cloud中feign、ribbon和hystrix的超時時間

springboot自動裝配的過程

微服務

爲什麼要用微服務

爲什麼要使用集羣而不是更好的單機

什麼是CAP

什麼是Service Mesh*

什麼是降級

幾種限流算法

分佈式事務*

分佈式id

oauth2.0

eureka、ribbon、hystrix是如何配合的*

你們項目的日活、qps是多少

怎麼統計qps

正向代理和反向代理的區別

如何實現熱部署*

你們項目的監控告警

Counter、Gauge、Summary、Histogram的區別

鏈路

操作系統

Linux的IO模型有哪幾種

reactor模型有哪幾種

epoll和poll的區別

平時用到的Linux命令

一個進程最多可以創建多少線程

故障排查

爲什麼 java 程序的內存溢出往往伴隨着 CPU 爆表

CPU爆表怎麼排查

內存高怎麼排查

線上系統突然變得異常緩慢,如何排查*

網絡

網絡:集線器、交換機、路由器

爲什麼是三次握手?最後一次省略不行嗎

爲什麼是四次揮手?第二次和第三次合併不行嗎?最後一次省略不行嗎

TCP四次揮手爲什麼要等待2msl

http和https的區別

說幾個HTTP狀態碼

當你用瀏覽器打開一個鏈接的時候,計算機做了哪些工作步驟

如何避免瀏覽器緩存

如何理解HTTP協議的無狀態性

HTTP有哪幾種method

算法

雪花算法

雪花算法如何解決時鐘回撥

一致性哈希算法

對稱加密、非對稱加密算法

時間輪算法

解決hash衝突的方法

paxos算法*

raft算法*

設計

設計模式

手寫單例模式

代理模式和裝飾模式的區別

面向對象設計的原則

如何設計一個良好的API

數據庫設計的三大範式

開發、設計中遇到的問題或挑戰

什麼是MVC

場景題

實現:搶紅包

實現:掃碼登錄

實現:秒殺*

實現:多少人在看這篇文章*

實現:瀏覽過這篇文章的還瀏覽了

實現:附近的人

實現:五億數據,找出數量top100

實現:併發安全的鏈表*

實現:30分鐘沒付款就自動關閉交易

實現:分佈式環境下的countDownLatch

其他

長鏈接轉短鏈接的原理

tomcat的併發控制參數

結語

感謝閱讀。

打賞支持 ~

微信|支付寶

本文爲原創文章,轉載請附上原文出處鏈接:https://www.cnblogs.com/ZhangZiSheng001/p/16218179.html

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