2023年Java(1~5年經(jīng)驗)面試題_第1頁
2023年Java(1~5年經(jīng)驗)面試題_第2頁
2023年Java(1~5年經(jīng)驗)面試題_第3頁
2023年Java(1~5年經(jīng)驗)面試題_第4頁
2023年Java(1~5年經(jīng)驗)面試題_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

2023年Java(1~5年經(jīng)驗)面試題(一)

一、基礎(chǔ)篇

1、如何實現(xiàn)對象克???

【僅供參考】

實現(xiàn)Cloneable接口并重寫Object類中的clone。方法。

實現(xiàn)Serializable接口,通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)

真正的深度克隆。

2、重載(Overload)和重寫(Override)的區(qū)別?

【僅供參考】

方法的重載和重寫都是實現(xiàn)多態(tài)的方式,區(qū)別在于前者實現(xiàn)的是編譯時的多態(tài)

性,而后者實現(xiàn)的是運行時的多態(tài)性。

重載:一個類中有多個同名的方法,但是具有有不同的參數(shù)列表(參數(shù)類型不

同、參數(shù)個數(shù)不同或者二者都不同)。

重寫:發(fā)生在子類與父類之間,子類對父類的方法進行重寫,參數(shù)都不能改

變,返回值類型可以不相同,但是必須是父類返回值的派生類。即外殼不變,

核心重寫!重寫的好處在于子類可以根據(jù)需要,定義特定于自己的行為。

3、JDKL8之后有哪些新特性?

【僅供參考】

接口默認(rèn)方法:Java8允許我們給接口添加一個非抽象的方法實現(xiàn),只需要使

用default關(guān)鍵字即可

Lambda表達式和函數(shù)式接口:Lambda表達式本質(zhì)上是一段匿名內(nèi)部類,也可

以是一段可以傳遞的代碼。Lambda允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為

參數(shù)傳遞到方法中),使用Lambda表達式使代碼更加簡潔,但是也不要濫用,

否則會有可讀性等問題,《EffectiveJava》作者JoshBloch建議使用

Lambda表達式最好不要超過3行。

StreamAPI:用函數(shù)式編程方式在集合類上進行復(fù)雜操作的工具,配合Lambda

表達式可以方便的對集合進行處理。Java8中處理集合的關(guān)鍵抽象概念,它可

以指定你希望對集合進行的操作,可以執(zhí)行非常復(fù)雜的查找、過濾和映射數(shù)據(jù)

等操作。使用StreamAPI對集合數(shù)據(jù)進行操作,就類似于使用SQL執(zhí)行的數(shù)

據(jù)庫查詢。也可以使用StreamAPI來并行執(zhí)行操作。簡而言之,StreamAPI

提供了一種高效且易于使用的處理數(shù)據(jù)的方式。

方法引用:方法引用提供了非常有用的語法,可以直接引用已有Java類或?qū)ο?/p>

(實例)的方法或構(gòu)造器。與lambda聯(lián)合使用,方法引用可以使語言的構(gòu)造更

緊湊簡潔,減少冗余代碼。

日期時間API:Java8引入了新的日期時間API改進了日期時間的管理。

Optional類:著名的NulIPointerException是引起系統(tǒng)失敗最常見的原因。

很久以前GoogleGuava項目引入了Optional作為解決空指針異常的一種方

式,不贊成代碼被null檢查的代碼污染,期望程序員寫整潔的代碼。受

GoogleGuava的鼓勵,Optional現(xiàn)在是Java8庫的一部分。

新工具:新的編譯工具,如:Nashorn引擎jjs、類依賴分析器jdeps。

4、兩個對象的hashCode()相同,則equals。是否也一定為true?

【僅供參考】

equals與hashcode的關(guān)系:

如果兩個對象調(diào)用equals比較返回true,那么它們的hashCode值一定要相

同;

如果兩個對象的hashCode相同,它們并不一定相同。

hashcode方法主要是用來提升對象比較的效率,先進行hashcode()的比較,如

果不相同,那就不必在進行equals的比較,這樣就大大減少了equals比較的

次數(shù),當(dāng)比較對象的數(shù)量很大的時候能提升效率。

之所以重寫equals。要重寫hashcode(),是為了保證equals。方法返回true

的情況下hashcode值也要一致,如果重寫了equals()沒有重寫hashcode(),

就會出現(xiàn)兩個對象相等但hashcode。不相等的情況。這樣,當(dāng)用其中的一個對

象作為鍵保存到hashMap、hashTable或hashSet中,再以另一個對象作為鍵值

去查找他們的時候,則會查找不到。

5、Object常用方法有哪些?

【僅供參考】

Java面試經(jīng)常會出現(xiàn)的一道題目,Object的常用方法。下面給大家整理一下。

Object常用方法有:toStringO>equals()>hashCode。、clone。等。

6、普通類和抽象類有哪些區(qū)別?

【僅供參考】

普通類不能包含抽象方法,抽象類可以包含抽象方法。

抽象類不能直接實例化,普通類可以直接實例化。

7、接口和抽象類有什么區(qū)別?

【僅供參考】

實現(xiàn):抽象類的子類使用extends來繼承;接口必須使用implements來實現(xiàn)

接口。

構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有。

實現(xiàn)數(shù)量:類可以實現(xiàn)很多個接口;但是只能繼承一個抽象類。

訪問修飾符:接口中的方法默認(rèn)使用public修飾;抽象類中的方法可以是任

意訪問修飾符。

8、用最有效率的方法計算2乘以8?

【僅供參考】

2?3。進階:通常情況下,可以認(rèn)為位運算是性能最高的。但是,其實編譯

器現(xiàn)在已經(jīng)“非常聰明了”,很多指令編譯器都能自己做優(yōu)化。所以在實際實

用中,我們無需特意去追求實用位運算,這樣不僅會導(dǎo)致代碼可讀性很差,而

且某些自作聰明的優(yōu)化反而會誤導(dǎo)編譯器,使得編譯器無法進行更好的優(yōu)化。

9、深拷貝和淺拷貝區(qū)別是什么?

【僅供參考】

淺克隆:當(dāng)對象被復(fù)制時只復(fù)制它本身和其中包含的值類型的成員變量,而引

用類型的成員對象并沒有復(fù)制。

深克隆:除了對象本身被復(fù)制外,對象所包含的所有成員變量也將復(fù)制。

10、Java的特點?

【僅供參考】

Java具有平臺獨立性和移植性。

Java有一句口號:Writeonce,runanywhere,一次編寫、到處運行。這也是

Java的魅力所在。而實現(xiàn)這種特性的正是Java虛擬機JVM。已編譯的Java程

序可以在任何帶有JVM的平臺上運行。你可以在windows平臺編寫代碼,然后

拿到linux上運行。只要你在編寫完代碼后,將代碼編譯成.class文件,再把

class文件打成Java包,這個jar包就可以在不同的平臺上運行了。

Java具有穩(wěn)健性。

Java是一個強類型語言,它允許擴展編譯時檢查潛在類型不匹配問題的功能。

Java要求顯式的方法聲明,它不支持C風(fēng)格的隱式聲明。這些嚴(yán)格的要求保證

編譯程序能捕捉調(diào)用錯誤,這就導(dǎo)致更可靠的程序。

異常處理是Java中使得程序更穩(wěn)健的另一個特征。異常是某種類似于錯誤的異

常條件出現(xiàn)的信號。使用try/catch/finally語句,程序員可以找到出錯的處

理代碼,這就簡化了出錯處理和恢復(fù)的任務(wù)。

11、JDK/JRE/JVM三者的關(guān)系

【僅供參考】

JVM

英文名稱(JavaVirtualMachine),就是我們耳熟能詳?shù)腏ava虛擬機。Java

能夠跨平臺運行的核心在于JVM。

所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機

上執(zhí)行。也就是說class文件并不直接與機器的操作系統(tǒng)交互,而是經(jīng)過虛擬

機間接與操作系統(tǒng)交互,由虛擬機將程序解釋給本地系統(tǒng)執(zhí)行。

針對不同的系統(tǒng)有不同的jvm實現(xiàn),有Linux版本的jvm實現(xiàn),也有

Windows版本的jvm實現(xiàn),但是同一段代碼在編譯后的字節(jié)碼是一樣的。這就

是Java能夠跨平臺,實現(xiàn)一次編寫,多處運行的原因所在。

JRE

英文名稱(JavaRuntimeEnvironment),就是Java運行時環(huán)境。我們編寫的

Java程序必須要在JRE才能運行。它主要包含兩個部分,JVM和Java核心類

庫。

JRE是Java的運行環(huán)境,并不是一個開發(fā)環(huán)境,所以沒有包含任何開發(fā)工具,

如編譯器和調(diào)試器等。

如果你只是想運行Java程序,而不是開發(fā)Java程序的話,那么你只需要安裝

JRE即可。

JDK

JDK目錄下有個JRE,也就是JDK中已經(jīng)集成了JRE,不用單獨安裝JRE。

另外,JDK中還有一些好用的工具,如jinfo,jps,jstack等。

JRE=JVM+Java核心類庫

JDK=JRE+Java工具+編譯器+調(diào)試器

12、String屬于基礎(chǔ)的數(shù)據(jù)類型嗎?

【僅供參考】

String不屬于基礎(chǔ)類型,基礎(chǔ)類型有8種:byte、boolean,char、short>

int、float、long>double,而String屬于對象。

13、Files的常用方法都有哪些?

【僅供參考】

Files,exists():檢測文件路徑是否存在。

Files.createFileO:創(chuàng)建文件。

Files.createDirectory():創(chuàng)建文件夾。

Files,delete():刪除一個文件或目錄。

Files,copy():復(fù)制文件。

Files.moveO:移動文件。

Files.size():查看文件個數(shù)。

Files.read():讀取文件。

Files,write():寫入文件。

14>Java中的Math,round(-1.5)等于多少?

【僅供參考】

等于-1,因為在數(shù)軸上取值時,中間值(0.5)向右取整,所以正0.5是往上

取整,負(fù)0.5是直接舍棄。

15、如何實現(xiàn)對象克???

【僅供參考】

實現(xiàn)Cloneable接口,重寫clone()方法。這種方式是淺拷貝,即如果類中屬

性有自定義引用類型,只拷貝引用,不拷貝引用指向的對象。如果對象的屬性

的Class也實現(xiàn)Cloneable接口,那么在克隆對象時也會克隆屬性,即深拷

貝。

結(jié)合序列化,深拷貝。

通過org.apache,commons中的工具類BeanUtiIs和PropertyUtiIs進行對象復(fù)

制。

16、JDK和JRE有什么區(qū)別?

【僅供參考】

JDK:JavaDevelopmentKit的簡稱,Java開發(fā)工具包,提供了Java的開發(fā)

環(huán)境和運行環(huán)境。

JRE:JavaRuntimeEnvironment的簡稱,Java運行環(huán)境,為Java的運行提

供了所需環(huán)境。

具體來說JDK其實包含了JRE,同時還包含了編譯Java源碼的編譯器

Javac,還包含了很多Java程序調(diào)試和分析的工具。簡單來說:如果你需要運

行Java程序,只需安裝JRE就可以了,如果你需要編寫Java程序,需要安

裝JDK?

17、JVM是如何處理異常的?

【僅供參考】

在一個方法中如果發(fā)生異常,這個方法會創(chuàng)建一個異常對象,并轉(zhuǎn)交給JVM,

該異常對象包含異

常名稱,異常描述以及異常發(fā)生時應(yīng)用程序的狀態(tài)。創(chuàng)建異常對象并轉(zhuǎn)交給

JVM的過程稱為拋出

異常??赡苡幸幌盗械姆椒ㄕ{(diào)用,最終才進入拋出異常的方法,這一系列方法

調(diào)用的有序列表叫做

調(diào)用棧。

JVM會順著調(diào)用棧去查找看是否有可以處理異常的代碼,如果有,則調(diào)用異常

處理代碼。當(dāng)JVM

發(fā)現(xiàn)可以處理異常的代碼時,會把發(fā)生的異常傳遞給它。如果JVM沒有找到可

以處理該異常的代

碼塊,JVM就會將該異常轉(zhuǎn)交給默認(rèn)的異常處理器(默認(rèn)處理器為JVM的一部

分),默認(rèn)異常處

理器打印出異常信息并終止應(yīng)用程序。

18、運行時異常和一般異常(受檢異常)區(qū)別是什么?

【僅供參考】

運行時異常包括RuntimeException類及其子類,表示JVM在運行期間可能出

現(xiàn)的異常。Java編

譯器不會檢查運行時異常。

受檢異常是Exception中除RuntimeException及其子類之外的異常。Java

編譯器會檢查受檢異常。

RuntimeException異常和受檢異常之間的區(qū)別:是否強制要求調(diào)用者必須處理

此異常,如果強

制要求調(diào)用者必須進行處理,那么就使用受檢異常,否則就選擇非受檢異常

(RuntimeException)0一般來講,如果沒有特殊的要求,我們建議使用

RuntimeException異常。

19、常見的RuntimeException有哪些?

【僅供參考】

ClassCastException(類轉(zhuǎn)換異常)

IndexOulOfBoundsExceplion(數(shù)組越界)

NulIPointerException(空指針)

ArrayStoreException(數(shù)據(jù)存儲異常,操作數(shù)組時類型不一致)

還有10操作的BufferOverflowException異常

20^try-catch-finally中哪個部分可以省略?

【僅供參考】

try-catch-finally其中catch和finally都可以被省略,但是不能同時省

略,也就是說有try的時候,必須后面跟一個catch或者finally。

二、容器/多線程/反射/JVM/設(shè)計模式

1、ArrayList和LinkedList的區(qū)別是什么?

【僅供參考】

數(shù)據(jù)結(jié)構(gòu)實現(xiàn):ArrayList是動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu)實現(xiàn),而LinkedList是雙

向鏈表的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。

隨機訪問效率:ArrayList比LinkedList在隨機訪問的時候效率要高,因為

LinkedList是線性的數(shù)據(jù)存儲方式,所以需要移動指針從前往后依次查找。

增加和刪除效率:在非首尾的增加和刪除操作,LinkedList要比ArrayList

效率要高,因為ArrayList增刪操作要影響數(shù)組內(nèi)的其他數(shù)據(jù)的下標(biāo)。

綜合來說,在需要頻繁讀取集合中的元素時,更推薦使用ArrayList,而在插

入和刪除操作較多時,更推薦使用LinkedList。

2^synchronized和Lock有什么區(qū)別?

【僅供參考】

synchronized可以給類、方法、代碼塊加鎖;而lock只能給代碼塊加鎖。

synchronized不需要手動獲取鎖和釋放鎖,使用簡單,發(fā)生異常會自動釋放

鎖,不會造成死鎖;而lock需要自己加鎖和釋放鎖,如果使用不當(dāng)沒有

unLock()去釋放鎖就會造成死鎖。

通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。

3、四種線程池的創(chuàng)建:

【僅供參考】

(1)newCachedThreadPool創(chuàng)建一個可緩存線程池

(2)newFixedThreadPool創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù)。

(3)newSchedu1edThreadPoo1創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)

執(zhí)行。

(4)newSingleThreadExecutor創(chuàng)建??個單線程化的線程池,它只會用唯一

的工作線程來執(zhí)行任務(wù)。

4、Linux環(huán)境下如何查找哪個線程使用CPU最長

【僅供參考】

(1)獲取項目的pid,jps或者ps-ef|grepjava

(2)top-H-ppid,順序不能改變

5、ThreadLocal是什么?有什么用?

【僅供參考】

ThreadLocal是一個本地線程副本變量工具類。主要用于將私有線程和該線程

存放的副本對象做一個映射,各個線程之間的變量互不干擾,在高并發(fā)場景

下,可以實現(xiàn)無狀態(tài)的調(diào)用,特別適用于各個線程依賴不通的變量值完成操作

的場景。簡單說ThreadLocal就是一種以空間換時間的做法,在每

個Thread里面維護了一個以開地址法實現(xiàn)的

ThreadLocal.ThreadLocalMap,把數(shù)據(jù)進行隔離,數(shù)據(jù)不共享,自然就沒有線

程安全方面的問題了。

6、sleep()和wait()有什么區(qū)別?

【僅供參考】

類的不同:sleepO來自Thread,wait。來自O(shè)bject。

釋放鎖:sleepO不釋放鎖;wait。釋放鎖。

用法不同:sleep。時間到會自動恢復(fù);wail()可以使用

notify()/notifyAll()直接喚醒。

7、線程池的優(yōu)點?

【僅供參考】

(1)重用存在的線程,減少對象創(chuàng)建銷毀的開銷。

(2)可有效的控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率,同時避免過多

資源競爭,避免堵塞。

(3)提供定時執(zhí)行、定期執(zhí)行、單線程、并發(fā)數(shù)控制等功能。

8、線程池的核心屬性有哪些?

【僅供參考】

threadFactory(線程工廠):用于創(chuàng)建工作線程的工廠。

corePoolSize(核心線程數(shù)):當(dāng)線程池運行的線程少于corePoolSize時,將

創(chuàng)建一個新線程來處理請求,即使其他工作線程處于空閑狀態(tài)。

workQueue(隊列):用于保留任務(wù)并移交給工作線程的阻塞隊列。

maximumPoolSize(最大線程數(shù)):線程池允許開啟的最大線程數(shù)。

handler(拒絕策略):往線程池添加任務(wù)時,將在下面兩種情況觸發(fā)拒絕策

略:1)線程池運行狀態(tài)不是RUNNING;2)線程池已經(jīng)達到最大線程數(shù),并且

阻塞隊列已滿時。

keepAliveTime(保持存活時間):如果線程池當(dāng)前線程數(shù)超過corePoolSize,

則多余的線程空閑時間超過keepAliveTime時會被終止。

9、Executors類是什么?

【僅供參考】

Executors為Executor,ExecutorService,ScheduledExecutorService,

ThreadFactory和Callable

類提供了一些工具方法。Executors可以用于方便的創(chuàng)建線程池

10、Thread調(diào)用start()方法和調(diào)用run()方法的區(qū)別

【僅供參考】

run():普通的方法調(diào)用,在主線程中執(zhí)行,不會新建一個線程來執(zhí)行。

start():新啟動一個線程,這時此線程處于就緒(可運行)狀態(tài),并沒有運

行,一旦得到CPU時間片,就開始執(zhí)行run()方法。

11、反射的缺點?

【僅供參考】

1、性能問題。

Java反射機制中包含了一些動態(tài)類型,所以Java虛擬機不能夠?qū)@些動態(tài)代

碼進行優(yōu)化。因此,反射操作的效率要比正常操作效率低很多。我們應(yīng)該避免

在對性能要求很高的程序或經(jīng)常被執(zhí)行的代碼中使用反射。而且,如何使用反

射決定了性能的高低。如果它作為程序中較少運行的部分,性能將不會成為一

個問題。

2、安全限制。

使用反射通常需要程序的運行沒有安全方面的限制。如果一個程序?qū)Π踩蕴?/p>

出要求,則最好不要使用反射。

3、程序健壯性。

反射允許代碼執(zhí)行一些通常不被允許的操作,所以使用反射有可能會導(dǎo)致意想

不到的后果。反射代碼破壞了Java程序結(jié)構(gòu)的抽象性,所以當(dāng)程序運行的平臺

發(fā)生變化的時候,由于抽象的邏輯結(jié)構(gòu)不能被識別,代碼產(chǎn)生的效果與之前會

產(chǎn)生差異。

12、Java反射創(chuàng)建對象效率高還是通過new創(chuàng)建對象的效率高?

【僅供參考】

通過new創(chuàng)建對象的效率比較高。通過反射時,先找查找類資源,使用類加載

器創(chuàng)建,過程比較繁瑣,所以效率較低。

13、下面的代碼哪些地方會產(chǎn)生編譯錯誤?

【僅供參考】

classOuter{

classInner{

publicstaticvoidfoo(){

newInner();

)

publicvoidbar(){

newInner();

}

publicstaticvoidmain(String[]args){

newInner();

)

)

Java中非靜態(tài)內(nèi)部類對象的創(chuàng)建要依賴其外部類對象,上面的面試題中f。。和

main方法都是靜態(tài)方法,靜態(tài)方法中沒有this,也就是說沒有所謂的外部類對

象,因此無法創(chuàng)建內(nèi)部類對象,如果要在靜態(tài)方法中創(chuàng)建內(nèi)部類對象,可以這

樣做:

newOuter().newInner();

在java編程中,用到反射的地方還是很多的,比如java框架就大量使用反

射,還有在加載驅(qū)動和讀取配置文件時,反射也是比不可少的。所以在java面

試中,面試官會想要考察應(yīng)聘者反射方面的知識,那么有面試需要的朋友,就

必須提前做好準(zhǔn)備,將能搜集到的java反射面試題整理到一起記住,另外,

java零基礎(chǔ)的小白也可以根據(jù)這篇java反射面試題來認(rèn)識java反射。

14、實現(xiàn)java反射的類有什么?

【僅供參考】

(l)Class:表示正在運行的Java應(yīng)用程序中的類和接口,注意所有獲取對象的

信息都需要Class類來實現(xiàn);

(2)Field:提供有關(guān)類和接口的屬性信息,以及對它的動態(tài)訪問權(quán)限;

(3)Constructor:提供關(guān)于類的單個構(gòu)造方法的信息以及它的訪問權(quán)限;

(4)Method:提供類或接口中某個方法的信息。

15、接口是什么?為什么要使用接口而不是直接使用具體類?

【僅供參考】

接口用于定義APE它定義了類必須得遵循的規(guī)則。同時,它提供了一種抽

象,因為客戶端只使用接口,這樣可以有多重實現(xiàn),如List接口,你可以使

用可隨機訪問的ArrayList,也可以使用方便插入和刪除的LinkedListo接口

中不允許寫代碼,以此來保證抽象,但是Java8中你可以在接口聲明靜態(tài)的

默認(rèn)方法,這種方法是具體的。

16、設(shè)計一個ATM機,請說出你的設(shè)計思路?

【僅供參考】

比如設(shè)計金融系統(tǒng)來說,必須知道它們應(yīng)該在任何情況下都能夠正常工作。不

管是斷電還是其他情況,ATM應(yīng)該保持正確的狀態(tài)(事務(wù)),想想加鎖

(locking)、事務(wù)(transaction)、錯誤條件(errorcondition)、邊界條件

(boundarycondition)等等。盡管你不能想到具體的設(shè)計,但如果你可以指

出非功能性需求,提出一些問題,想到關(guān)于邊界條件,這些都會是很好的。

17、簡述分代垃圾回收器是怎么工作的?

【僅供參考】

分代回收器有兩個分區(qū):老生代和新生代,新生代默認(rèn)的空間占比總空間的

1/3,老生代的默認(rèn)占比是2/3。

新生代使用的是復(fù)制算法,新生代里有3個分區(qū):Eden、ToSurvivor,From

Survivor,它們的默認(rèn)占比是8:1:1,它的執(zhí)行流程如下:

把Eden+FromSurvivor存活的對象放入ToSurvivor區(qū);

清空Eden和FromSurvivor分區(qū);

FromSurvivor和ToSurvivor分區(qū)交換,F(xiàn)romSurvivor變ToSurvivor,

ToSurvivor變FromSurvivor。

每次在FromSurvivor到ToSurvivor移動時都存活的對象,年齡就+1,當(dāng)

年齡到達15(默認(rèn)配置是15)時,升級為老生代。大對象也會直接進入老生

代。

老生代當(dāng)空間占用到達某個值之后就會觸發(fā)全局垃圾收回,一般使用標(biāo)記整理

的執(zhí)行算法。以上這些循環(huán)往復(fù)就構(gòu)成了整個分代垃圾回收的整體執(zhí)行流程。

18、什么是雙親委派模型?

【僅供參考】

在介紹雙親委派模型之前先說下類加載器。對于任意一個類,都需要由加載它

的類加載器和這個類本身一同確立在JVM中的唯一性,每一個類加載器,都有

一個獨立的類名稱空間。類加載器就是根據(jù)指定全限定名稱將class文件加載

到JVM內(nèi)存,然后再轉(zhuǎn)化為class對象。

類加載器分類:

啟動類加載器(BootstrapClassLoader),是虛擬機自身的一部分,用來加載

Java_HOME/lib/目錄中的,或者被-Xbootclasspath參數(shù)所指定的路徑中并且

被虛擬機識別的類庫;

其他類加載器:

擴展類加載器(ExtensionClassLoader):負(fù)責(zé)加載〈java_homestyle="box-

sizing:border-box;outline:Opx!important;z/>libext目錄或Java.ext.

dirs系統(tǒng)變量指定的路徑中的所有類庫;

應(yīng)用程序類加載器(ApplicationClassLoader)?負(fù)責(zé)加載用戶類路徑

(classpath)上的指定類庫,我們可以直接使用這個類加載器。一般情況,如

果我們沒有自定義類加載器默認(rèn)就是用這個加載器。

雙親委派模型:如果一個類加載器收到了類加載的請求,它首先不會自己去加

載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是

如此,這樣所有的加載請求都會被傳送到頂層的啟動類加載器中,只有當(dāng)父加

載無法完成加載請求(它的搜索范圍中沒找到所需的類)時,子加載器才會嘗

試去加載類。

19、說一下JVM調(diào)優(yōu)的工具?

【僅供參考】

JDK自帶了很多監(jiān)控工具,都位于JDK的bin目錄下,其中最常用的是

jconsole和jvisualvm這兩款視圖監(jiān)控工具。

jconsole:用于對JVM中的內(nèi)存、線程和類等進行監(jiān)控;

jvisualvm:JDK自帶的全能分析工具,可以分析:內(nèi)存快照、線程快照、程序

死鎖、監(jiān)控內(nèi)存的變化、gc變化等。

20、說一下JVM有哪些垃圾回收器?

【僅供參考】

Serial:最早的單線程串行垃圾回收器。

SerialOld:Serial垃圾回收器的老年版本,同樣也是單線程的,可以作為

CMS垃圾回收器的備選預(yù)案。

ParNew:是Serial的多線程版本。

Parallel和ParNew收集器類似是多線程的,但Parallel是吞吐量優(yōu)先的收

集器,可以犧牲等待時間換取系統(tǒng)的吞吐量。

ParallelOld是Parallel老生代版本,Parallel使用的是復(fù)制的內(nèi)存回收

算法,ParallelOld使用的是標(biāo)記-整理的內(nèi)存回收算法。

CMS:一種以獲得最短停頓時間為目標(biāo)的收集器,非常適用B/S系統(tǒng)。

G1:一種兼顧吞吐量和停頓時間的GC實現(xiàn),是JDK9以后的默認(rèn)GC選項。

三、JavaWeb/Spring/SpringMVC/Hibernate/MyBatis/Spring

Boot/SpringCloud

1、Servlet是線程安全的嗎

【僅供參考】

Servlet不是線程安全的,多線程并發(fā)的讀寫會導(dǎo)致數(shù)據(jù)不同步的問題。

解決的辦法是盡量不要在實現(xiàn)servlet接口的類中定義實例變量,而是要把變

量分別定義在doGet()和doPost()方法內(nèi)。雖然使用synchronized(name){}語

句塊可以解決問題,但是會造成線程的等待,不是很科學(xué)的辦法。

注意:多線程的并發(fā)的讀寫Servlet類屬性會導(dǎo)致數(shù)據(jù)不同步。但是如果只是

并發(fā)地讀取屬性而不寫入,則不存在數(shù)據(jù)不同步的問題。因此Servlet里的只

讀屬性最好定義為final類型的。

2、http和https的基本概念

【僅供參考】

-HTTP:

是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個客戶端和服務(wù)器端請求

和應(yīng)答的標(biāo)準(zhǔn)(TCP),用于計算機之間傳輸文字,圖片,音頻,視頻等超文本

數(shù)據(jù)的協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少

-HTTPS:

是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入

SSL層,HTTPS的安全基礎(chǔ)是SSL,HTTPS就是從HTTP加上加密處理(一般是

SSL安全通信線路)+認(rèn)證+完整性保護

-HTTPS協(xié)議的主要作用:

建立一個信息安全通道,來保證數(shù)據(jù)傳輸?shù)陌踩?/p>

確認(rèn)網(wǎng)站的真實性

3、說一下JS0NP實現(xiàn)原理?

【僅供參考】

jsonp:JSONwithPadding,它是利用script標(biāo)簽的src連接可以訪問不同

源的特性,加載遠(yuǎn)程返回的“JS函數(shù)”來執(zhí)行的。

4、@Autowired的作用是什么?

【僅供參考】

@Autowired它可以對類成員變量、方法及構(gòu)造函數(shù)進行標(biāo)注,完成自動裝配的

工作,通過@Aulowired的使用來消除set/get方法。

5、@RequestMapping的作用是什么?

【僅供參考】

將http請求映射到相應(yīng)的類/方法上。

6、你如何理解SpringBoot中的Starters?

【僅供參考】

Starters可以理解為啟動器,它包含了一系列可以集成到應(yīng)用里面的依賴包,

你可以一站式集成Spring及其他技術(shù),而不需要到處找示例代碼和依賴包。

如你想使用SpringJPA訪問數(shù)據(jù)庫,只要加入spring-boot-starter-data-

jpa啟動器依賴就能使用了。

7、springboot集成mybatis的過程

【僅供參考】

添加mybatis的startermaven依賴

<dependency>

<groupld>org.mybatis.spring.boot</groupld>

<artifactld>mybatis-spring-boot-starter</artifactld>

<version>l.3.2</version>

</dependency>

在mybatis的接口中添加@Mapper注解

在application,yml配置數(shù)據(jù)源信息

8、開啟SpringBoot特性有哪幾種方式?

【僅供參考】

1)繼承spring-boot-starter-parent項目

2)導(dǎo)入spring-boot-dependencies項目依賴

9、jpa和hibernate有什么區(qū)別?

【僅供參考】

jpa全稱JavaPersistenceAPI,是Java持久化接口規(guī)范,hibernate屬于

jpa的具體實現(xiàn)。

10、springboot有哪些方式可以實現(xiàn)熱部署?

【僅供參考】

使用devtools啟動熱部署,添加devtools庫,在配置文件中把spring,

devtools.restart,enabled設(shè)置為true;

使用IntellijIdea編輯器,勾上自動編譯或手動重新編譯。

11、為什么我們不建議在實際的應(yīng)用程序中使用SpringDataRest?

【僅供參考】

我們認(rèn)為SpringDataRest很適合快速原型制造!在大型應(yīng)用程序中使用需

要謹(jǐn)慎。

通過SpringDataREST你可以把你的數(shù)據(jù)實體作為RESTful服務(wù)直接發(fā)布。

當(dāng)你設(shè)計RESTful服務(wù)器的時候,最佳實踐表明,你的接口應(yīng)該考慮到兩件重

要的事情:

你的模型范圍。

你的客戶。

通過WithSpringDataREST,你不需要再考慮這兩個方面,只需要作為TEST

服務(wù)發(fā)布實體。

這就是為什么我們建議使用SpringDataRest在快速原型構(gòu)造上面,或者作

為項目的初始解決方法。對于完整演變項目來說,這并不是一個好的注意。

12、RequestMapping和GetMapping的不同之處在哪里?

【僅供參考】

RequestMapping具有類屬性的,可以進行GET,POST,PUT或者其它的注釋中具

有的請求方法。GetMapping是GET請求方法中的一個特例。它只是

ResquestMapping的一個延伸,目的是為了提高清晰度。

13^springcloud的核心組件有哪些?

【僅供參考】

Eureka:服務(wù)注冊于發(fā)現(xiàn)。

Feign:基于動態(tài)代理機制,根據(jù)注解和選擇的機器,拼接請求url地址,發(fā)

起請求。

Ribbon:實現(xiàn)負(fù)載均衡,從一個服務(wù)的多臺機器中選擇一臺。

Hystrix:提供線程池,不同的服務(wù)走不同的線程池,實現(xiàn)了不同服務(wù)調(diào)用的隔

離,避免了服務(wù)雪崩的問題。

Zuul:網(wǎng)關(guān)管理,由Zuul網(wǎng)關(guān)轉(zhuǎn)發(fā)請求給對應(yīng)的服務(wù)。

14、springcloud斷路器的作用是什么?

【僅供參考】

在分布式架構(gòu)中,斷路器模式的作用也是類似的,當(dāng)某個服務(wù)單元發(fā)生故障

(類似用電器發(fā)生短路)之后,通過斷路器的故障監(jiān)控(類似熔斷保險絲),向

調(diào)用方返回一個錯誤響應(yīng),而不是長時間的等待。這樣就不會使得線程因調(diào)用

故障服務(wù)被長時間占用不釋放,避免了故障在分布式系統(tǒng)中的蔓延。

15、Springboot有哪些優(yōu)點?

【僅供參考】

-快速創(chuàng)建獨立運行的spring項目與主流框架集成

-使用嵌入式的servlet容器,應(yīng)用無需打包成war包

-starters自動依賴與版本控制

-大量的自動配置,簡化開發(fā),也可修改默認(rèn)值

-準(zhǔn)生產(chǎn)環(huán)境的運行應(yīng)用監(jiān)控

-與云計算的天然集成

16、什么是SpringDataREST?

【僅供參考】

SpringDataTEST可以用來發(fā)布關(guān)于Spring數(shù)據(jù)庫的HATEOASRESTful資

源。

17、如何重新加載SpringBoot上的更改,而無需重新啟動服務(wù)器?

【僅供參考】

這可以使用DEV工具來實現(xiàn)。通過這種依賴關(guān)系,您可以節(jié)省任何更改,嵌入

式tomcat將重新啟動。

SpringBoot有一個開發(fā)工具(DevTools)模塊,它有助于提高開發(fā)人員的生

產(chǎn)力。Java開發(fā)人員面臨的一個主要挑戰(zhàn)是將文件更改自動部署到服務(wù)器并自

動重啟服務(wù)器。

開發(fā)人員可以重新加載SpringBoot上的更改,而無需重新啟動服務(wù)器。這將

消除每次手動部署更改的需要。SpringBoot在發(fā)布它的第一個版本時沒有這

個功能。

這是開發(fā)人員最需要的功能。DevTools模塊完全滿足開發(fā)人員的需求。該模塊

將在生產(chǎn)環(huán)境中被禁用。它還提供H2數(shù)據(jù)庫控制臺以更好地測試應(yīng)用程序。

org.springframework,boot

spring-boot-devtools

18、MyBatis有哪些執(zhí)行器(Executor)?

【僅供參考】

MyBatis有三種基本的Execulor執(zhí)行器:

SimpleExecutor:每執(zhí)行一次update或select就開啟一個Statement對

象,用完立刻關(guān)閉Statement對象;

ReuseExecutor:執(zhí)行update或select,以SQL作為key查找Statement

對象,存在就使用,不存在就創(chuàng)建,用完后不關(guān)閉Statement對象,而是放置

于Map內(nèi)供下一次使用。簡言之,就是重復(fù)使用Statement對象;

BatchExecutor:執(zhí)行update(沒有select,jdbc批處理不支持select),

將所有SQL都添加到批處理中(addBatch。),等待統(tǒng)一執(zhí)行

(executeBatch()),它緩存了多個Statement對象,每個Statement對象都

是addBatch()完畢后,等待逐一執(zhí)行executeBatch。批處理,與jdbc批處

理相同。

19、hibernate實體類可以被定義為final嗎?

【僅供參考】

實體類可以定義為final類,但這樣的話就不能使用hibernate代理模式下

的延遲關(guān)聯(lián)提供性能了,所以不建議定義實體類為finale

20、MyBatis中#{}和${}的區(qū)別是什么?

【僅供參考】

\#{}是預(yù)編譯處理,${}是字符替換。在使用時,MyBatis會將SQL中的

#{}替換成“?",配合PreparedStatement的set方法賦值,這樣可以有效

的防止SQL注入,保證程序的運行安全。

四、Redis/RabbitMQ/Kafka/Zookeeper

1、RabbitMQ集群搭建需要注意哪些問題?

【僅供參考】

各節(jié)點之間使用“一link”連接,此屬性不能忽略。

各節(jié)點使用的erlangcookie值必須相同,此值相當(dāng)于“秘鑰”的功能,用于

各節(jié)點的認(rèn)證。

整個集群中必須包含一個磁盤節(jié)點。

2、RabbitMQ持久化有什么缺點?

【僅供參考】

持久化的缺地就是降低了服務(wù)器的吞吐量,因為使用的是磁盤而非內(nèi)存存儲,

從而降低了吞吐量??杀M量使用ssd硬盤來緩解吞吐量的問題。

3、RabbitMQ怎么避免消息丟失?

【僅供參考】

把消息持久化磁盤,保證服務(wù)器重啟消息不丟失。

每個集群中至少有一個物理磁盤,保證消息落入磁盤。

4、RabbitMQ中vhost的作用是什么?

【僅供參考】

vhost:每個RabbitMQ都能創(chuàng)建很多vhost,我們稱之為虛擬主機,每個虛擬

主機其實都是mini版的RabbitMQ,它擁有自己的隊列,交換器和綁定,擁有

自己的權(quán)限機制。

5、RabbitMQ的消息是怎么發(fā)送的?

【僅供參考】

首先客戶端必須連接到RabbitMQ服務(wù)器才能發(fā)布和消費消息,客戶端和

rabbitserver之間會創(chuàng)建一個tcp連接,一旦tcp打開并通過了認(rèn)證(認(rèn)

證就是你發(fā)送給rabbit服務(wù)器的用戶名和密碼),你的客戶端和RabbitMQ就

創(chuàng)建了一條amqp信道(channel),信道是創(chuàng)建在"真實"tcp上的虛擬連

接,amqp命令都是通過信道發(fā)送出去的,每個信道都會有一個唯一的id,不

論是發(fā)布消息,訂閱隊列都是通過這個信道完成的。

6、RabbitMQ節(jié)點的類型有哪些?

【僅供參考】

磁盤節(jié)點:消息會存儲到磁盤。

內(nèi)存節(jié)點:消息都存儲在內(nèi)存中,重啟服務(wù)器消息丟失,性能高于磁盤類型。

7、RabbitMQ集群有什么用?

【僅供參考】

集群主要有以下兩個用途:

高可用:某個服務(wù)器出現(xiàn)問題,整個RabbitMQ還可以繼續(xù)使用;

高容量:集群可以承載更多的消息量。

8、RabbitMQ怎么保證消息的穩(wěn)定性?

【僅供參考】

提供了事務(wù)的功能。

通過將channel設(shè)置為confirm(確認(rèn))模式。

9、kafka如何減少數(shù)據(jù)丟失?

【僅供參考】

一般我們在用到這種消息中件的時候,肯定會考慮要怎樣才能保證數(shù)據(jù)不丟

失,在面試中也會問到相關(guān)的問題。但凡遇到這種問題,是指3個方面的數(shù)據(jù)

不丟失,即:producerconsumer端數(shù)據(jù)不丟失broker端數(shù)據(jù)不丟失

10、為什么要使用kafka,為什么要使用消息隊列?

【僅供參考】

緩沖和削峰:上游數(shù)據(jù)時有突發(fā)流量,下游可能扛不住,或者下游沒有足夠多

的機器來保證冗余,kafka在中間可以起到一個緩沖的作用,把消息暫存在

kafka中,下游服務(wù)就可以按照自己的節(jié)奏進行慢慢處理。

解耦和擴展性:項目開始的時候,并不能確定具體需求。消息隊列可以作為一

個接口層,解耦重要的業(yè)務(wù)流程。只需要遵守約定,針對數(shù)據(jù)編程即可獲取擴

展能力。

冗余:可以采用一對多的方式,一個生產(chǎn)者發(fā)布消息,可以被多個訂閱topic

的服務(wù)消費到,供多個毫無關(guān)聯(lián)的業(yè)務(wù)使用。

健壯性:消息隊列可以堆積請求,所以消費端業(yè)務(wù)即使短時間死掉,也不會影

響主要業(yè)務(wù)的正常進行。

異步通信:很多時候,用戶不想也不需要立即處理消息。消息隊列提供了異步

處理機制,允許用戶把一個消息放入隊列,但并不立即處理它。想向隊列中放

入多少消息就放多少,然后在需要的時候再去處理它們。

11、kafka中的broker是干什么的?

【僅供參考】

broker是消息的代理,Producers往Brokers里面的指定Topic中寫消息,

Consumers從Brokers里面拉取指定Topic的消息,然后進行業(yè)務(wù)處理,

broker在中間起到一個代理保存消息的中轉(zhuǎn)站。

12^zookeeper都有哪些功能?

【僅供參考】

集群管理:監(jiān)控節(jié)點存活狀態(tài)、運行請求等。

主節(jié)點選舉:主節(jié)點掛掉了之后可以從備用的節(jié)點開始新一輪選主,主節(jié)點選

舉說的就是這個選舉的過程,使用zookeeper可以協(xié)助完成這個過程。

分布式鎖:zookeeper提供兩種鎖:獨占鎖、共享鎖。獨占鎖即一次只能有一

個線程使用資源,共享鎖是讀鎖共享,讀寫互斥,即可以有多線線程同時讀同

一個資源,如果要使用寫鎖也只能有一個線程使用。zookeeper可以對分布式

鎖進行控制。

命名服務(wù):在分布式系統(tǒng)中,通過使用命名服務(wù),客戶端應(yīng)用能夠根據(jù)指定名

字來獲取資源或服務(wù)的地址,提供者等信息。

13>zookeeper怎么保證主從節(jié)點的狀態(tài)同步?

【僅供參考】

zookeeper的核心是原子廣播,這個機制保證了各個server之間的同步。實

現(xiàn)這個機制的協(xié)議叫做zab協(xié)議。zab協(xié)議有兩種模式,分別是恢復(fù)模式(選

主)和廣播模式(同步)。當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后,zab就進入了恢復(fù)

模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)server完成了和leader的狀態(tài)同步

以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和server具有相同的系

統(tǒng)狀態(tài)。

14、集群中有3臺服務(wù)器,其中一個節(jié)點宕機,這個時候zookeeper還可以

使用嗎?

【僅供參考】

可以繼續(xù)使用,單數(shù)服務(wù)器只要沒超過一半的服務(wù)器宕機就可以繼續(xù)使用。

15、kafka可以脫離zookeeper單獨使用嗎?為什么?

【僅供參考】

kafka不能脫離zookeeper單獨使用,因為kafka使用zookeeper管理和協(xié)

調(diào)kafka的節(jié)點服務(wù)器。

16、jedis和Redisson有哪些區(qū)別?

【僅供參考】

jedis:提供了比較全面的Redis命令的支持。

Redisson:實現(xiàn)了分布式和可擴展的Java數(shù)據(jù)結(jié)構(gòu),與jedis相比

Redisson的功能相對簡單,不支持排序、事務(wù)、管道、分區(qū)等Redis特性。

17、Redis支持的Java客戶端都有哪些?

【僅供參考】

支持的Java客戶端有Redisson、jedis、lettuce等。

18、Redis持久化有幾種方式?

【僅供參考】

Redis的持久化有兩種方式,或者說有兩種策略:

RDB(RedisDatabase):指定的時間間隔能對你的數(shù)據(jù)進行快照存儲。

AOF(AppendOnlyFile):每一個收到的寫命令都通過write函數(shù)追加到文件

中。

19、Redis為什么是單線程的?

【僅供參考】

因為cpu不是Redis的瓶頸,Redis的瓶頸最有可能是機器內(nèi)存或者網(wǎng)絡(luò)帶

寬。既然單線程容易實現(xiàn),而且cpu又不會成為瓶頸,那就順理成章地采用單

線程的方案了。

關(guān)于Redis的性能,官方網(wǎng)站也有,普通筆記本輕松處理每秒幾十萬的請求。

而且單線程并不代表就慢nginx和nodejs也都是高性能單線程的代表。

20、Redis是什么?都有哪些使用場景?

【僅供參考】

Redis是一個使用C語言開發(fā)的高速緩存數(shù)據(jù)庫。

Redis使用場景:

記錄帖子點贊數(shù)、點擊數(shù)、評論數(shù);

緩存近期熱帖;

緩存文章詳情信息;

記錄用戶會話信息。

五、MySQL

1、哪些操作會導(dǎo)致索引失效?

【僅供參考】

對索引使用左或者左右模糊匹配,也就是like%xx或者like%xx%這兩種方

式都會造成索引失效。原因在于查詢的結(jié)果可能是多個,不知道從哪個索引值

開始比較,于是就只能通過全表掃描的方式來查詢。

對索引進行函數(shù)/對索引進行表達式計算,因為索引保持的是索引字段的原始

值,而不是經(jīng)過函數(shù)計算的值,自然就沒辦法走索引。

對索引進行隱式轉(zhuǎn)換相當(dāng)于使用了新函數(shù)。

WHERE子句中的OR語句,只要有條件列不是索引列,就會進行全表掃描。

2、誤刪數(shù)據(jù)怎么辦?

【僅供參考】

DBA的最核心的工作就是保證數(shù)據(jù)的完整性,先要做好預(yù)防,預(yù)防的話大概是

通過這幾個點:

權(quán)限控制與分配(數(shù)據(jù)庫和服務(wù)器權(quán)限)

制作操作規(guī)范

定期給開發(fā)進行培訓(xùn)

搭建延遲備庫

做好SQL審計,只要是對線上數(shù)據(jù)有更改操作的語句(DML和DDL)都需要進行

審核

做好備份。備份的話又分為兩個點(1)如果數(shù)據(jù)量比較大,用物理備份

xtrabackupo定期對數(shù)據(jù)庫進行全量備份,也可以做增量備份。(2)如果數(shù)據(jù)量

較少,用mysqldump或者mysqldumper。再利用binlog來恢復(fù)或者搭建主從

的方式來恢復(fù)數(shù)據(jù)。定期備份binlog文件也是很有必要的

如果發(fā)生了數(shù)據(jù)刪除的操作,又可以從以下幾個點來恢復(fù):

DML誤操作語句造成數(shù)據(jù)不完整或者丟失??梢酝ㄟ^flashback,美團的

myflash,也是一個不錯的工具,本質(zhì)都差不多

都是先解析binlogevent,然后在進行反轉(zhuǎn)。把delete反轉(zhuǎn)為insert,

insert反轉(zhuǎn)為delete,update前后image對調(diào)。

所以必須設(shè)置binlog_format=ron和bin1og_row_image=fu11,切記恢復(fù)數(shù)據(jù)

的時候,應(yīng)該先恢復(fù)到臨時的實例,然后在恢復(fù)回主庫上。

DDL語句誤操作(truncate和drop),由于DDL語句不管binlog_format是

row還是statement,在binlog里都只記錄語句,不記錄image所以恢復(fù)

起來相對要麻煩得多。

只能通過全量備份+應(yīng)用binlog的方式來恢復(fù)數(shù)據(jù)。一旦數(shù)據(jù)量比較大,那么

恢復(fù)時間就特別長

rm刪除:使用備份跨機房,或者最好是跨城市保存。

3、如何理解MySQL的邊讀邊發(fā)?

【僅供參考】

如果客戶端接受慢,會導(dǎo)致MySQL服務(wù)端由于結(jié)果發(fā)不出去,這個事務(wù)的執(zhí)行

時間會很長。

服務(wù)端并不需要保存一個完整的結(jié)果集,取數(shù)據(jù)和發(fā)數(shù)據(jù)的流程都是通過一個

next_buffer來操作的。

內(nèi)存的數(shù)據(jù)頁都是在BuffejPool中操作的。

InnoDB管理Buffer_Pool使用的是改進的LRU算法,使用鏈表實現(xiàn),實現(xiàn)

上,按照5:3的比例把整個LRU鏈表分成了young區(qū)域和old區(qū)域。

4、都說InnoDB好,那還要不要使用MEMORY引擎?

【僅供參考】

內(nèi)存表就是使用memory引擎創(chuàng)建的表

為什么我不建議你在生產(chǎn)環(huán)境上使用內(nèi)存表。這里的原因主要包括兩個方面:

鎖粒度問題;數(shù)據(jù)持久化問題。

由于重啟會丟數(shù)據(jù),如果一個備庫重啟,會導(dǎo)致主備同步線程停止;如果主庫

跟這個備庫是雙M架構(gòu),還可能導(dǎo)致主庫的內(nèi)存表數(shù)據(jù)被刪掉。

5、為什么刪除了表,表文件的大小還是沒變?

【僅供參考】

數(shù)據(jù)項刪除之后InnoDB某個頁pageA會被標(biāo)記為可復(fù)用。

delete命令把整個表的數(shù)據(jù)刪除,結(jié)果就是,所有的數(shù)據(jù)頁都會被標(biāo)記為可復(fù)

用。但是磁盤上,文件不會變小。

經(jīng)過大量增刪改的表,都是可能是存在空洞的。這些空洞也占空間所以,如果

能夠把這些空洞去掉,就能達到收縮表空間的目的。

重建表,就可以達到這樣的目的??梢允褂胊ltertableAengine=InnoDB命

令來重建表。

6、MySQL使用索引的原因?

【僅供參考】

根本原因

索引的出現(xiàn),就是為了提高數(shù)據(jù)查詢的效率,就像書的目錄一樣。

對于數(shù)據(jù)庫的表而言,索引其實就是它的“目錄”。

擴展

創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。

幫助引擎層避免排序和臨時表

將隨機10變?yōu)轫樞?0,加速表和表之間的連接。

7、詳細(xì)說一下一條MySQL語句執(zhí)行的步驟

【僅供參考】

Server層按順序執(zhí)行SQL的步驟為:

客戶端請求->連接器(驗證用戶身份,給予權(quán)限)

查詢緩存(存在緩存則直接返回,不存在則執(zhí)行后續(xù)操作)

分析器(對SQL進行詞法分析和語法分析操作)

優(yōu)化器(主要對執(zhí)行的SQL優(yōu)化選擇最優(yōu)的執(zhí)行方案方法)

執(zhí)行器(執(zhí)行時會先看用戶是否有執(zhí)行權(quán)限,有才去使用這個引擎提供的接

口)->去引擎層獲取數(shù)據(jù)返回(如果開啟查詢緩存則會緩存查詢結(jié)果)

索引相關(guān)

8、MySQL有哪些自增ID?各自場景是什么?

【僅供參考】

表的自增ID達到上限之后,在申請值不會變化,進而導(dǎo)致聯(lián)系插入數(shù)據(jù)的時

候報主鍵沖突錯誤。

row_id達到上限之后,歸0在重新遞增,如果出現(xiàn)相同的row_id后寫的數(shù)

據(jù)會覆蓋之前的數(shù)據(jù)。

Xid只需要不在同一個binlog文件出現(xiàn)重復(fù)值即可,理論上會出現(xiàn)重復(fù)值,

但概率極小可忽略不計。

InnoDB的max_trx_id遞增值每次MySQL重啟會保存起來。

Xid是由server層維護的。InnoDB內(nèi)部使用Xid,就是為了能夠在InnoDB

事務(wù)和server之間做關(guān)聯(lián)。但是,InnoDB自己的trx_id,是另外維護的。

threadid是我們使用中最常見的,而且也是處理得最好的一個自增id邏輯

了。使用了insert_unique算法

9、join用法?

【僅供參考】

使用leftjoin左邊的表不一定是驅(qū)動表

如果需要leftjoin的語義,就不能把被驅(qū)動表的字段放在where條件里面

做等值判斷或不等值判斷,必須都寫在on里面

標(biāo)準(zhǔn)的groupby語句,是需要在select部分加一個聚合函數(shù),比如select

a,count(*)fromtgroupbyaorderbynull;

10、如何最快的復(fù)制一張表?

【僅供參考】

為了避免對源表加讀鎖,更穩(wěn)妥的方案是先將數(shù)據(jù)寫到外部文本文件,然后再

寫回目標(biāo)表

一種方法是,使用mysqldump命令將數(shù)據(jù)導(dǎo)出成一組INSERT語句

另一種方法是直接將結(jié)果導(dǎo)出成.csv文件。MySQL提供語法,用來將查詢結(jié)果

導(dǎo)出到服務(wù)端本地目錄:select*fromdbl.twherea>900intooutfile

'/server_tmp/t.csv';得到.csv導(dǎo)出文件后,你就可以用下面的loaddata

命令將數(shù)據(jù)導(dǎo)入到目標(biāo)表db2.t中:loaddatainfile'/server_tmp/t.csv)

intotabledb2.t;

物理拷貝:在MySQL5.6版本引入了可傳輸表空間(transportable

tablespace)的方法,可以通過導(dǎo)出+導(dǎo)入表空間的方式,實現(xiàn)物理拷貝表的

功能。

11、MySQL的changebuffer是什么?

【僅供參考】

當(dāng)需要更新一個數(shù)據(jù)頁時,如果數(shù)據(jù)頁在內(nèi)存中就直接更新;而如果這個數(shù)據(jù)

頁還沒有在內(nèi)存中的話,在不影響數(shù)據(jù)一致性的前提下,InnoDB會將這些更新

r

操作緩存在changebuffer|='o

這樣就不需要從磁盤中讀入這個數(shù)據(jù)頁了,在下次查詢需要訪問這個數(shù)據(jù)頁的

時候,將數(shù)據(jù)頁讀入內(nèi)存,然后執(zhí)行changebuffer中與這個頁有關(guān)的操作。

通過這種方式就能保證這個數(shù)據(jù)邏輯的正確性。

注意唯一索引的更新就不能使用changebuffer,實際上也只有普通索引可以

使用。

適用場景:

-對于寫多讀少的業(yè)務(wù)來說,頁面在寫完以后馬上被訪問到的概率比較小,此

時changebuffer的使用效果最好。這種業(yè)務(wù)模型常見的就是賬單類、日志類

的系統(tǒng)。

-反過來,假設(shè)一個業(yè)務(wù)的更新模式是寫入之后馬上會做查詢,那么即使?jié)M足

了條件,將更新先記錄在changebuffer,但之后由于馬上要訪問這個數(shù)據(jù)

頁,會立即觸發(fā)merge過程。這樣隨機訪問10的次數(shù)不會減少,反而增加了

changebuffer的維護代價。

12、InnoDB數(shù)據(jù)頁結(jié)構(gòu)?

【僅供參考】

一個數(shù)據(jù)頁大致劃分七個部分

FileHeader:表示頁的一些通用信息,占固定的38字節(jié)。

pageHeader:表示數(shù)據(jù)頁專有信息,占固定的56字節(jié)。

inimum+Supermum:兩個虛擬的偽記錄,分別表示頁中的最小記錄和最大記錄,

占固定的26字節(jié)。

UserRecords:真正存儲我們插入的數(shù)據(jù),大小不固定。

FreeSpace:頁中尚未使用的部分,大小不固定。

PageDirectory:頁中某些記錄的相對位置,也就是各個槽對應(yīng)的記錄在頁面

中的地址偏移量。

FileTrailer:用于檢驗頁是否完整,占固定大小8字節(jié)。

數(shù)據(jù)相關(guān)

13、MySQL的一主一備和一主多從有什么區(qū)別?

【僅供參考】

在一主一備的雙M架構(gòu)里,主備切換只需要把客戶端流量切到備庫;而在一主

多從架構(gòu)里,主備切換除了要把客戶端流量切到備庫外,還需要把從庫接到新

主庫上。

14、drop、truncate和delete的區(qū)別?

【僅供參考】

DELETE語句執(zhí)行刪除的過程是每次從表中刪除一行,并且同時將該行的刪除操

作作為事務(wù)記錄在日志中保存以便進行進行回滾操作。

TRUNCATETABLE則一次性地從表中刪除所有的數(shù)據(jù)并不把單獨的刪除操作記錄

記入日志保存,刪除行是不能恢復(fù)的。并且在刪除的過程中不會激活與表有關(guān)

的刪除觸發(fā)器。執(zhí)行速度快。

drop語句將表所占用的空間全釋放掉。

在速度上,一般來說,drop>truncate>delete。

如果想刪除部分?jǐn)?shù)據(jù)用delete,注意帶上where子句,回滾段要足夠大;

如果想刪除表,當(dāng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論