堪稱(chēng)全網(wǎng)最詳細(xì)的Java八股面試文,面試必備(附答案)
聽(tīng)一些小伙伴說(shuō),近期的面試越來(lái)越難了!為了幫大家節(jié)約時(shí)間,給大家搞來(lái)了今年上半年碰到的大廠Java面試題合集,內(nèi)容非常的全面。耗時(shí)半月,終于把??途W(wǎng)上的互聯(lián)網(wǎng)大廠Java面試八股文整理成了PDF合集。

其中概括的知識(shí)點(diǎn)有:java基礎(chǔ)、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技術(shù)棧共有1000+道面試題。

JAVA基礎(chǔ)
Java代碼一次編寫(xiě)、到處運(yùn)行
因?yàn)镴ava虛擬機(jī)可以實(shí)現(xiàn)跨平臺(tái)的代碼運(yùn)行,不同的操作系統(tǒng)中有不同的JVM。
在程序運(yùn)行前,JVM會(huì)將編寫(xiě)的Java代碼編譯為字節(jié)碼格式,這種格式是JVM能夠識(shí)別的格式。
運(yùn)行程序時(shí),Java類(lèi)加載器先加載字節(jié)碼文件,Java解釋器會(huì)將字節(jié)碼翻譯為操作系統(tǒng)可以識(shí)別的機(jī)器碼,方便操作系統(tǒng)去執(zhí)行。為了提高Java程序運(yùn)行速度,引入了JIT(即時(shí)編譯器),在第一次編譯后,將字節(jié)碼對(duì)應(yīng)的機(jī)器碼保存,下次可以直接使用。
Java文件里可以有多個(gè)類(lèi)嗎(不包含內(nèi)部類(lèi))?
一個(gè)Java文件中可以有多個(gè)類(lèi),但是最多只能有一個(gè)被public修飾的類(lèi);
如果該文件中包含public修飾的類(lèi),則類(lèi)的名稱(chēng)和Java文件的名稱(chēng)必須相同。
Java訪(fǎng)問(wèn)權(quán)限
Java語(yǔ)言中共有三種訪(fǎng)問(wèn)修飾符:public、private、protected;
在使用這些修飾符修飾目標(biāo)時(shí),一共可以形成四種訪(fǎng)問(wèn)權(quán)限,public、private、protected、default(不加任何修飾符)。
修飾成員變量/方法時(shí):
private:該成員可以被該類(lèi)內(nèi)部成員訪(fǎng)問(wèn);
default:該成員可以被該類(lèi)內(nèi)部成員訪(fǎng)問(wèn),也可以被同一包下的其他類(lèi)訪(fǎng)問(wèn);
protected:該成員可以被該類(lèi)內(nèi)部成員訪(fǎng)問(wèn),也可以被同一包下的其他類(lèi)訪(fǎng)問(wèn),還可以被它的子類(lèi)訪(fǎng)問(wèn);
public:該成員可以被任意類(lèi)訪(fǎng)問(wèn)。
修飾類(lèi)時(shí):
default:該類(lèi)可以被同一包下的其他類(lèi)訪(fǎng)問(wèn);
public: 該類(lèi)可以被任意包下,任意類(lèi)訪(fǎng)問(wèn)。
Java數(shù)據(jù)類(lèi)型
Java數(shù)據(jù)類(lèi)型包括兩大類(lèi):基本數(shù)據(jù)類(lèi)型,引用數(shù)據(jù)類(lèi)型。
基本數(shù)據(jù)類(lèi)型有8個(gè),可以分為4類(lèi):整數(shù)類(lèi)型(byte/short/int/long)、浮點(diǎn)類(lèi)型(float/double)、字符類(lèi)型(char)、布爾類(lèi)型(boolean)。除了布爾類(lèi)型,其他都可以看作為數(shù)組類(lèi)型,可以進(jìn)行類(lèi)型轉(zhuǎn)換。
引用類(lèi)型就是對(duì)一個(gè)對(duì)象的引用,根據(jù)引用對(duì)象的不同,可以分為數(shù)組、類(lèi)、接口引用類(lèi)型。實(shí)質(zhì)上就是通過(guò)指針,指向堆中對(duì)象所持有的內(nèi)存空間。
基本數(shù)據(jù)類(lèi)型所占的內(nèi)存空間:
byte:1字節(jié)(8位),數(shù)據(jù)范圍是 -2^7 ~ 2^7-1;
short:2字節(jié)(16位),數(shù)據(jù)范圍是 -2^15 ~ 2^15-1;
int:4字節(jié)(32位),數(shù)據(jù)范圍是 -2^31 ~ 2^31-1;
long:8字節(jié)(64位),數(shù)據(jù)范圍是 -2^63 ~ 2^63-1;
float:4字節(jié)(32位),數(shù)據(jù)范圍是 -3.4*10^38 ~ 3.4*10^38;
double:8字節(jié)(64位),數(shù)據(jù)范圍是 -1.8*10^308 ~ 1.8*10^308;
char:2字節(jié)(16位),數(shù)據(jù)范圍是 \u0000 ~ \uffff;
boolean:不同的JVM有不同的實(shí)現(xiàn)機(jī)制,沒(méi)有固定的參數(shù)。
全局變量(成員變量)和局部變量
Java中沒(méi)有全局變量,這是c語(yǔ)言中的概念,Java中對(duì)應(yīng)的名稱(chēng)叫做成員變量。
成員變量:
成員變量是在類(lèi)的范圍內(nèi)定義的變量;
成員變量有默認(rèn)初始值;
未被static修飾的成員變量也叫實(shí)例變量,存儲(chǔ)于對(duì)象所在的堆內(nèi)存當(dāng)中,生命周期與對(duì)象相同;
被static修飾的成員變量也叫類(lèi)變量,存儲(chǔ)于方法區(qū)當(dāng)中,生命周期與當(dāng)前類(lèi)相同。
局部變量:
局部變量是在方法內(nèi)定義的變量;
局部變量沒(méi)有默認(rèn)初始值;
局部變量存儲(chǔ)于棧內(nèi)存中,作用的范圍結(jié)束,變量空間會(huì)自動(dòng)的釋放。

為什么要有包裝類(lèi)?
Java是面向?qū)ο蟮恼Z(yǔ)言,設(shè)計(jì)理念就是“一切皆是對(duì)象”。但是8種基本數(shù)據(jù)類(lèi)型卻不屬于對(duì)象,為了解決這個(gè)問(wèn)題,Java為每個(gè)基本數(shù)據(jù)類(lèi)型都定義了一個(gè)對(duì)應(yīng)的引用類(lèi)型,叫做包裝類(lèi)。
自動(dòng)裝箱與自動(dòng)拆箱是JDK1.5提供的功能。
自動(dòng)裝箱:可以把一個(gè)基本類(lèi)型的數(shù)據(jù)直接賦值給對(duì)應(yīng)的包裝類(lèi)型;
自動(dòng)拆箱:可以把一個(gè)包裝類(lèi)型的數(shù)據(jù)直接賦值給對(duì)應(yīng)額基本類(lèi)型;
應(yīng)用場(chǎng)景:例如某個(gè)方法的參數(shù)是包裝類(lèi)型,調(diào)用時(shí)我們所使用的數(shù)據(jù)卻是基本類(lèi)型的數(shù)據(jù),這時(shí)可以不做任何處理,直接將這個(gè)基本類(lèi)型的值傳入給方法即可。
對(duì)面向?qū)ο蟮睦斫?/p>
重載和重寫(xiě)的區(qū)別
構(gòu)造方法不能重寫(xiě)
Object中常用的方法
getClass():返回該對(duì)象的運(yùn)行時(shí)類(lèi);
boolean equals(Object obj):判斷對(duì)象是否相等;
int hashCode():返回該對(duì)象的hashCode值,默認(rèn)情況下根據(jù)地址計(jì)算;
String toString():返回該對(duì)象的字符串表示;
finalize():當(dāng)系統(tǒng)中沒(méi)有引用變量引用到該對(duì)象時(shí),垃圾回收器調(diào)用此方法來(lái)清理該對(duì)象的資源,同一個(gè)對(duì)象只會(huì)調(diào)用一次。(不建議主動(dòng)調(diào)用)
hashCode()和equals()的關(guān)系
String常用的方法
String、StringBuffer、StringBuilder的區(qū)別
接口和抽象類(lèi)有什么區(qū)別
Java怎么處理異常
static關(guān)鍵字
泛型
反射
JDK - JVM - JRE
JVM
Java虛擬機(jī)(JVM)是運(yùn)行Java字節(jié)碼的虛擬機(jī)。JVM有針對(duì)不同系統(tǒng)的特定實(shí)現(xiàn),其目的就是使用相同的字節(jié)碼,這樣會(huì)給出相同的結(jié)果。字節(jié)碼和不同系統(tǒng)的JVM是實(shí)現(xiàn)Java語(yǔ)言跨平臺(tái)的關(guān)鍵。
JVM并不是只有一種!只要滿(mǎn)足JVM規(guī)范,每個(gè)公司、組織,甚至個(gè)人都可以開(kāi)發(fā)自己的JVM,我們平時(shí)接觸到的HotSpot VM僅僅是JVM規(guī)范中的一種實(shí)現(xiàn)。
JDK
JDK是功能齊全的SDK,擁有JRE的全部?jī)?nèi)容,還有編譯器(javac)和工具(如javadoc和jdb),能夠創(chuàng)建和編譯Java程序。
JRE
JRE是Java運(yùn)行時(shí)環(huán)境,它是運(yùn)行和編譯Java程序所需的所有內(nèi)容的集合,包括Java虛擬機(jī),Java類(lèi)庫(kù),Java命令和其他的一些基礎(chǔ)構(gòu)建,但是不能用于創(chuàng)建新程序。
Java基本語(yǔ)法
字符串常量和字符型常量的區(qū)別
靜態(tài)方法不能調(diào)用非靜態(tài)成員continue、break和return的區(qū)別自增自減運(yùn)算符
靜態(tài)方法和實(shí)例方法的不同重載和重寫(xiě)的區(qū)別
==與equals()的區(qū)別

MyBatis
1、什么是Mybatis?
2、Mybaits的優(yōu)點(diǎn)
3、MyBatis框架的缺點(diǎn)
4、MyBatis框架適用場(chǎng)合
5、MyBatis與Hibernate有哪些不同?
6、#{}和${}的區(qū)別是什么?
7、當(dāng)實(shí)體類(lèi)中的屬性名和表中的字段名不一樣,怎么辦?
8、 模糊查詢(xún)like語(yǔ)句該怎么寫(xiě)?
9、通常一個(gè)Xml映射文件,都會(huì)寫(xiě)一個(gè)Dao接口與之對(duì)應(yīng), 請(qǐng)問(wèn),這個(gè)Dao接口的工作原理是什么?Dao接口里的方法, 參數(shù)不同時(shí),方法能重載嗎?
10、Mybatis是如何進(jìn)行分頁(yè)的?分頁(yè)插件的原理是什么?
ZooKeeper
1. ZooKeeper是什么?
2. ZooKeeper提供了什么?
3.Zookeeper文件系統(tǒng)
4. ZAB 協(xié)議?
5. 四種類(lèi)型的數(shù)據(jù)節(jié)點(diǎn)Znode
6. Zookeeper Watcher機(jī)制--數(shù)據(jù)變更通知
7. 客戶(hù)端注冊(cè) Watcher實(shí)現(xiàn)
8. 服務(wù)端處理Watcher實(shí)現(xiàn)
9. 客戶(hù)端回調(diào)Watcher
10. ACL權(quán)限控制機(jī)制
Dubbo
基礎(chǔ)知識(shí)
1. 為什么要用Dubbo?
2. Dubbo是什么?
3. Dubbo的使用場(chǎng)景有哪些?
4. Dubbo核心功能有哪些?
架構(gòu)設(shè)計(jì)
7. Dubbo的整體架構(gòu)設(shè)計(jì)有哪些分層?
8. Dubbo Monitor實(shí)現(xiàn)原理?
分布式框架
9. Dubbo類(lèi)似的分布式框架還有哪些?
10. Dubbo和Spring Cloud有什么關(guān)系?
11. Dubbo和Spring Cloud有什么哪些區(qū)別?
12. Dubbo和Dubbox之間的區(qū)別?
注冊(cè)中心
13. Dubbo有哪些注冊(cè)中心?
14. Dubbo的注冊(cè)中心集群掛掉,發(fā)布者和訂閱者之間還能通信嗎?
Elasticsearch
1、elasticsearch了解多少,說(shuō)說(shuō)你們公司es的集群架構(gòu),索引數(shù)據(jù)大小,分片有多少,以及一些調(diào)優(yōu)手段。
2、elasticsearch的倒排索引是什么?
3、elasticsearch索引數(shù)據(jù)多了怎么辦,如何調(diào)優(yōu),部署?
4、elasticsearch是如何實(shí)現(xiàn)master選舉的
5、詳細(xì)描述一下Elasticsearch索引文檔的過(guò)程
6、詳細(xì)描述一下Elasticsearch搜索的過(guò)程?
7、Elasticsearch在部署時(shí),對(duì)Linux的設(shè)置有哪些優(yōu)化方法
8、lucence內(nèi)部結(jié)構(gòu)是什么?
9、Elasticsearch是如何實(shí)現(xiàn)Master選舉的?
10、Elasticsearch中的節(jié)點(diǎn)(比如共 20 個(gè)),其中的10 個(gè)選了一個(gè)master,另外10個(gè)選了另一個(gè)master,怎么辦?
Memcached
1、Memcached是什么,有什么作用?
2、Memcached服務(wù)分布式集群如何實(shí)現(xiàn)?
3、Memcached服務(wù)特點(diǎn)及工作原理是什么?
4、簡(jiǎn)述Memcached內(nèi)存管理機(jī)制原理?
5、memcached是怎么工作的?
6、memcached最大的優(yōu)勢(shì)是什么?
7、memcached和MySQL的query
8、memcached和服務(wù)器的local cache(比如PHP的APC、mmap文件等)相比,有什么優(yōu)缺點(diǎn)?
9、memcached的cache機(jī)制是怎樣的?
10、memcached如何實(shí)現(xiàn)冗余機(jī)制?
MySQL
1、MySQL中有哪幾種鎖?
2、MySQL中有哪些不同的表格?
3、簡(jiǎn)述在MySQL數(shù)據(jù)庫(kù)中MyISAM和InnoDB的區(qū)別
4、MySQL中InnoDB支持的四種事務(wù)隔離級(jí)別名稱(chēng),以及逐級(jí)之間的區(qū)別?
5、CHAR和VARCHAR的區(qū)別?
6、主鍵和候選鍵有什么區(qū)別?
7、myisamchk是用來(lái)做什么的?
8、如果一個(gè)表有一列定義為T(mén)IMESTAMP,將發(fā)生什么?
9、你怎么看到為表格定義的所有索引?
10、LIKE聲明中的%和_是什么意思?

Spring一般問(wèn)題
1、不同版本的Spring Framework有哪些主要功能?
2、什么是Spring Framework?
3、列舉Spring Framework的優(yōu)點(diǎn)。
4、Spring Framework有哪些不同的功能?
5、Spring Framework中有多少個(gè)模塊,它們分別是什么?
6、什么是Spring配置文件?
7、Spring應(yīng)用程序有哪些不同組件?
8、使用Spring有哪些方式?
依賴(lài)注入(Ioc)
1、什么是Spring IOC容器?
2、什么是依賴(lài)注入?
3、可以通過(guò)多少種方式完成依賴(lài)注入?
Spring Boot
1、什么是Spring Boot?
2、Spring Boot有哪些優(yōu)點(diǎn)?
3、什么是JavaConfig?
4、如何重新加載Spring Boot上的更改,而無(wú)需重新啟動(dòng)服務(wù)器?
5、Spring Boot中的監(jiān)視器是什么?
6、如何在Spring Boot中禁用Actuator端點(diǎn)安全性?
7、如何在自定義端口上運(yùn)行Spring Boot應(yīng)用程序?
8、什么是YAML?
9、如何實(shí)現(xiàn)Spring Boot應(yīng)用程序的安全性?
10、如何集成Spring Boot和ActiveMQ?

Spring Cloud
1、什么是Spring Cloud?
2、使用Spring Cloud有什么優(yōu)勢(shì)?
3、服務(wù)注冊(cè)和發(fā)現(xiàn)是什么意思?Spring Cloud如何實(shí)現(xiàn)?
4、負(fù)載平衡的意義什么?
5、什么是Hystrix?它如何實(shí)現(xiàn)容錯(cuò)?
6、什么是Hystrix 斷路器?我們需要它嗎?
7、什么是Netflix Feign?它的優(yōu)點(diǎn)是什么?
8、什么是Spring Cloud Bus?我們需要它嗎?
9、SpringBoot和SpringCloud的區(qū)別?
10、Spring Cloud和SpringBoot版本對(duì)應(yīng)關(guān)系
RabbitMQ
1、什么是rabbitmq
2、為什么要使用rabbitmq
3、使用rabbitmq的場(chǎng)景
4、如何確保消息正確地發(fā)送至RabbitMQ?如何確保消息接收方消費(fèi)了消息?
5.如何避免消息重復(fù)投遞或重復(fù)消費(fèi)?
6、消息基于什么傳輸?
7、消息如何分發(fā)?
8、消息怎么路由?
9、如何確保消息不丟失?
10、使用RabbitMQ有什么好處?
Linux
絕對(duì)路徑用什么符號(hào)表示?當(dāng)前目錄、上層目錄用什么表示?
主目錄用什么表示?
切換目錄用什么命令?
怎么查看當(dāng)前進(jìn)程?怎么執(zhí)行退出?怎么查看當(dāng)前路徑?
怎么清屏?怎么退出當(dāng)前命令?怎么執(zhí)行睡眠?
怎么查看當(dāng)前用戶(hù)id?
查看指定幫助用什么命令?
Ls命令執(zhí)行什么功能?可以帶哪些參數(shù),有什么區(qū)別?
建立軟鏈接(快捷方式),以及硬鏈接的命令。
目錄創(chuàng)建用什么命令?創(chuàng)建文件用什么命令?復(fù)制文件用什么命令?
查看文件內(nèi)容有哪些命令可以使用?
隨意寫(xiě)文件命令?怎么向屏幕輸出帶空格的字符串,比如”hello world”?
終端是哪個(gè)文件夾下的哪個(gè)文件?黑洞文件是哪個(gè)文件夾下的哪個(gè)命令?
移動(dòng)文件用哪個(gè)命令?改名用哪個(gè)命令?
最后
Java 面試的本質(zhì)就是八股文,把八股文面試題背好,面試才有可能表現(xiàn)好。大家在考研和找工作中糾結(jié)的時(shí)候,不妨先看一下面試題,畢竟最終目標(biāo)就是為了找一份心儀的工作!好工作都是早下手為強(qiáng)的,所以同學(xué)們要早做準(zhǔn)備!

