版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年宣恩貢水融資擔(dān)保限公司公開招聘工作人員【2人】管理單位筆試遴選500模擬題附帶答案詳解
- 2025年審計署部分所屬事業(yè)單位公開招聘(11人)歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年安順市關(guān)嶺自治縣鄉(xiāng)鎮(zhèn)(街道)衛(wèi)生院引進醫(yī)療衛(wèi)生工作人員管理單位筆試遴選500模擬題附帶答案詳解
- 2025年安徽馬鞍山當(dāng)涂縣住房和城鄉(xiāng)建設(shè)局招聘派遣制人員6人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025-2030年中國核材料項目風(fēng)險評估報告
- 2025-2030年中國導(dǎo)熱油項目投資風(fēng)險分析報告
- 2025-2030年中國城市公園規(guī)劃建設(shè)行業(yè)市場深度調(diào)查及投資前景預(yù)測報告
- 2025-2030年中國制鞋項目風(fēng)險評估報告
- 2024-2030年氨酚偽麻膠囊公司技術(shù)改造及擴產(chǎn)項目可行性研究報告
- 2024-2030年撰寫:中國含硒腐植酸鈉項目風(fēng)險評估報告
- 天津市河北區(qū)2022-2023學(xué)年七年級上學(xué)期期末地理試題
- 國際戰(zhàn)略環(huán)境概述
- 趣味可拓學(xué)智慧樹知到期末考試答案章節(jié)答案2024年廣東工業(yè)大學(xué)
- (高清版)JTGT 5190-2019 農(nóng)村公路養(yǎng)護技術(shù)規(guī)范
- 2024智慧城市城市交通基礎(chǔ)設(shè)施智能監(jiān)測技術(shù)要求
- 《小學(xué)美術(shù)微課程資源開發(fā)與應(yīng)用的實踐研究》結(jié)題報告
- 物理診斷學(xué)智慧樹知到期末考試答案章節(jié)答案2024年溫州醫(yī)科大學(xué)
- 2024年輔警招聘考試試題庫含完整答案(各地真題)
- 《工程建設(shè)標(biāo)準(zhǔn)強制性條文電力工程部分2023年版》
- 2023-2024學(xué)年廣東省深圳市福田區(qū)教科版三年級上冊期末考試科學(xué)試卷
- 多發(fā)性骨折的護理
評論
0/150
提交評論