![2023年Java大廠面試必備100題_第1頁](http://file4.renrendoc.com/view4/M02/3B/08/wKhkGGYE8dqAKuZOAAIfOYirD3k099.jpg)
![2023年Java大廠面試必備100題_第2頁](http://file4.renrendoc.com/view4/M02/3B/08/wKhkGGYE8dqAKuZOAAIfOYirD3k0992.jpg)
![2023年Java大廠面試必備100題_第3頁](http://file4.renrendoc.com/view4/M02/3B/08/wKhkGGYE8dqAKuZOAAIfOYirD3k0993.jpg)
![2023年Java大廠面試必備100題_第4頁](http://file4.renrendoc.com/view4/M02/3B/08/wKhkGGYE8dqAKuZOAAIfOYirD3k0994.jpg)
![2023年Java大廠面試必備100題_第5頁](http://file4.renrendoc.com/view4/M02/3B/08/wKhkGGYE8dqAKuZOAAIfOYirD3k0995.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
2023年JaVa大廠面試必備Ie)O題(一)
一、基礎(chǔ)篇
1、深拷貝和淺拷貝區(qū)別是什么?
【僅供參考】
淺克?。寒?dāng)對象被復(fù)制時只復(fù)制它本身和其中包含的值類型的成員變量,而引用類型的成員對
象并沒有復(fù)制。
深克?。撼藢ο蟊旧肀粡?fù)制外,對象所包含的所有成員變量也將復(fù)制。
2、構(gòu)造器是否可被重寫?
【僅供參考】
Constructor不能被override(重寫),但是可以overload(重載),所以你可以看到個
類中有多個構(gòu)造函數(shù)的情況。
3、String類的常用方法都有那些?
【僅供參考】
indexθf():返回指定字符的索引。
charAt():返回指定索引處的字符。
replace():字符串替換。
trim():去除字符串兩端空白。
split():分割字符串,返回一個分割后的字符串?dāng)?shù)組。
getBytes():返回字符串的byte類型數(shù)組。
IengthO:返回字符串長度。
toLowerCase():將字符串轉(zhuǎn)成小寫字母。
toUpperCase():將字符串轉(zhuǎn)成大寫字符。
substring():截取字符串。
equals():字符串比較。
4、String類可以繼承嗎?
【僅供參考】
不行。String類使用final修飾,無法被繼承。
5、final在Java中有什么作用?
【僅供參考】
final修飾的類叫最終類,該類不能被繼承。
final修飾的方法不能被重寫。
final修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改。
第1/25頁
6、抽象類(abstractclass)和接口(interface)有什么區(qū)別?
【僅供參考】
抽象類只能單繼承,接口可以多實現(xiàn)。
抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
抽象類中可以有成員變量,接口中沒有成員變量,只能有常量(默認就是publicstatic
final)
抽象類中可以包含非抽象的方法,在Java7之前接口中的所有方法都是抽象的,在Java8
之后,接口支持非抽象方法:default方法、靜態(tài)方法等。JaVa9支持私有方法、私有靜態(tài)方
法。
抽象類中的方法類型可以是任意修飾符,Java8之前接口中的方法只能是public類型,Java
9支持PriVate類型。
設(shè)計思想的區(qū)別:
接口是自上而下的抽象過程,接口規(guī)范了某些行為,是對某一行為的抽象。我需要這個行為,
我就去實現(xiàn)某個接口,但是具體這個行為怎么實現(xiàn),完全由自己決定。
抽象類是自下而上的抽象過程,抽象類提供了通用實現(xiàn),是對某一類事物的抽象。我們在寫實
現(xiàn)類的時候,發(fā)現(xiàn)某些實現(xiàn)類具有幾乎相同的實現(xiàn),因此我們將這些相同的實現(xiàn)抽取出來成為
抽象類,然后如果有一些差異點,則可以提供抽象方法來支持自定義實現(xiàn)。
我在網(wǎng)上看到有個說法,挺形象的:
普通類像親爹,他有啥都是你的。
抽象類像叔伯,有一部分會給你,還能指導(dǎo)你做事的方法。
接口像干爹,可以給你指引方法,但是做成啥樣得你自己努力實現(xiàn)。
7、Java中的Math,round(-1.5)等于多少?
【僅供參考】
等于-1,因為在數(shù)軸上取值時,中間值(0.5)向右取整,所以正0.5是往上取整,負0.5
是直接舍棄。
8、了解JaVa的包裝類型嗎?為什么需要包裝類?
【僅供參考】
Java是一種面向?qū)ο笳Z言,很多地方都需要使用對象而不是基本數(shù)據(jù)類型。比如,在集合類
中,我們是無法將int、double等類型放進去的。因為集合的容器要求元素是Object類
型。
為了讓基本類型也具有對象的特征,就出現(xiàn)了包裝類型。相當(dāng)于將基本類型包裝起來,使得它
具有了對象的性質(zhì),并且為其添加了屬性和方法,豐富了基本類型的操作。
9、是否可以從一個靜態(tài)(static)方法內(nèi)部發(fā)出對非靜態(tài)(non-static)方法的調(diào)用?
【僅供參考】
區(qū)分兩種情況,發(fā)出調(diào)用時是否顯示創(chuàng)建了對象實例。
1)沒有顯示創(chuàng)建對象實例:不可以發(fā)起調(diào)用,非靜態(tài)方法只能被對象所調(diào)用,靜態(tài)方法可以
通過對象調(diào)用,也可以通過類名調(diào)用,所以靜態(tài)方法被調(diào)用時,可能還沒有創(chuàng)建任何實例對
象。因此通過靜態(tài)方法內(nèi)部發(fā)出對非靜態(tài)方法的調(diào)用,此時可能無法知道非靜態(tài)方法屬于哪個
第2/25頁
對象。
publicclassDemo{
publicstaticvoidStaticMethodO{
//直接調(diào)用非靜態(tài)方法:編譯報錯
InstanceMethod();
publicvoidinstanceMethod(){
System.out.PrintI.n("非靜態(tài)方法");
2)顯示創(chuàng)建對象實例:可以發(fā)起調(diào)用,在靜態(tài)方法中顯示的創(chuàng)建對象實例,則可以正常的調(diào)
用。
publicclassDemo(
publicstaticvoidStaticMethodO{
//先創(chuàng)建實例對象,再調(diào)用非靜態(tài)方法:成功執(zhí)行
Demodemo=newDemo();
demo.instanceMethod0;
)
publicvoidinstanceMethod(){
System,out.Println("非靜態(tài)方法");
10、&和&&的區(qū)別?
【僅供參考】
&&:邏輯與運算符。當(dāng)運算符左右兩邊的表達式都為true,才返回true。同時具有短路性,
如果第一個表達式為false,則直接返回falseo
&:邏輯與運算符、按位與運算符。
按位與運算符:用于二進制的計算,只有對應(yīng)的兩個二進位均為1時,結(jié)果位才為1,否則為
Oo
邏輯與運算符:&在用于邏輯與時,和&&的區(qū)別是不具有短路性。所在通常使用邏輯與運算
符都會使用&&,而&更多的適用于位運算。
11、JDK/JRE/JVM三者的關(guān)系
【僅供參考】
英文名稱(JavaVirtualMachine),就是我們耳熟能詳?shù)腏aVa虛擬機。JaVa能夠跨平臺運
行的核心在于JVM。
所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執(zhí)行。也就是說
ClaSS文件并不直接與機器的操作系統(tǒng)交互,而是經(jīng)過虛擬機間接與操作系統(tǒng)交互,由虛擬機將
程序解釋給本地系統(tǒng)執(zhí)行。
第3/25頁
針對不同的系統(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,也就是川K中已經(jīng)集成了JRE,不用單獨安裝JRE。
另外,JDK中還有一些好用的工具,如jinfo,jps,jstack等。
JRE=JVM+Java核心類庫
JDK=JRE+JaVa工具+編譯器+調(diào)試器
12、兩個對象的hashCode()相同,則equals()也一定為true,對嗎?
【僅供參考】
不對,兩個對象的hashCode()相同,equals()不一*定true0
代碼示例:
Stringstrl="通話";
Stringstr2="重地
System,out.printin(String,format("strl:%d∣str2:%d”,strl.hashCode(),str2.
hashCode()));
System,out.printin(strl.equals(str2));
執(zhí)行的結(jié)果:
strl:1179395∣str2:1179395
false
代碼解讀:很顯然“通話”和“重地”的hashCode()相同,然而equals()則為false,因
為在散列表中,hashCode0相等即兩個鍵值對的哈希值相等,然而哈希值相等,并不一定能得
出鍵值對相等。
13、面向?qū)ο蠛兔嫦蜻^程的區(qū)別?
【僅供參考】
面向?qū)ο蠛兔嫦蜻^程是一種軟件開發(fā)思想。
面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)按這些步驟實現(xiàn),使用的時候依次調(diào)
用就可以了。
面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個對象,分別設(shè)計這些對象,然后將他們組裝成有完整功
能的系統(tǒng)。面向過程只用函數(shù)實現(xiàn),面向?qū)ο笫怯妙悓崿F(xiàn)各個功能模塊。
以五子棋為例,面向過程的設(shè)計思路就是首先分析問題的步驟:
1、開始游戲,2、黑子先走,3、繪制畫面,4、判斷輸贏,5、輪到白子,6、繪制畫面,7、
判斷輸贏,8、返回步驟2,9、輸出最后結(jié)果。把上面每個步驟用分別的函數(shù)來實現(xiàn),問題就
第4/25頁
解決了。
而面向?qū)ο蟮脑O(shè)計則是從另外的思路來解決問題。整個五子棋可以分為:
黑白雙方
棋盤系統(tǒng),負責(zé)繪制畫面
規(guī)則系統(tǒng),負責(zé)判定諸如犯規(guī)、輸贏等。
黑白雙方負責(zé)接受用戶的輸入,并告知棋盤系統(tǒng)棋子布局發(fā)生變化,棋盤系統(tǒng)接收到了棋子的
變化的信息就負責(zé)在屏幕上面顯示出這種變化,同時利用規(guī)則系統(tǒng)來對棋局進行判定。
14、JaVa創(chuàng)建對象有幾種方式?
【僅供參考】
JaVa創(chuàng)建對象有以下幾種方式:
用new語句創(chuàng)建對象。
使用反射,使用CIaSs.newlnstance()創(chuàng)建對象。
調(diào)用對象的CIOne()方法。
運用反序列化手段,調(diào)用java.io.ObjeCtlnPUtStream對象的readθbject()方法。
15、JaVa的特點?
【僅供參考】
JaVa具有平臺獨立性和移植性。
JaVa有一句口號:Writeonce,runanywhere,一次編寫、到處運行。這也是JaVa的魅力所
在。而實現(xiàn)這種特性的正是JaVa虛擬機JVM。己編譯的JaVa程序可以在任何帶有JVM的平臺上運
行。你可以在WindOWS平臺編寫代碼,然后拿到IinUX上運行。只要你在編寫完代碼后,將代碼
編譯成.class文件,再把ClaSS文件打成JaVa包,這個jar包就可以在不同的平臺上運行了。
JaVa具有穩(wěn)健性。
JaVa是一個強類型語言,它允許擴展編譯時檢查潛在類型不匹配問題的功能。JaVa要求顯式的
方法聲明,它不支持C風(fēng)格的隱式聲明。這些嚴格的要求保證編譯程序能捕捉調(diào)用錯誤,這就導(dǎo)
致更可靠的程序。
異常處理是JaVa中使得程序更穩(wěn)健的另一個特征。異常是某種類似于錯誤的異常條件出現(xiàn)的信
號。使用try/catch/finally語句,程序員可以找到出錯的處理代碼,這就簡化了出錯處理和恢
復(fù)的任務(wù)。
16、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)
第5/25頁
JVM
發(fā)現(xiàn)可以處理異常的代碼時,會把發(fā)生的異常傳遞給它。如果JVM沒有找到可以處理該異常的
代
碼塊,JVM就會將該異常轉(zhuǎn)交給默認的異常處理器(默認處理器為JVM的一部分),默認異常
處
理器打印出異常信息并終止應(yīng)用程序。
17、JaVa常見異常有哪些
【僅供參考】
java.lang.IllegalAccessError:違法訪問錯誤。當(dāng)一個應(yīng)用試圖訪問、修改某個類的域
(Field)或
者調(diào)用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。
java.lang.InstantiationError:實例化錯誤。當(dāng)一個應(yīng)用試圖通過JaVa的new操作符構(gòu)造一個
抽象
類或者接口時拋出該異常.
java.lang.OutOfMemoryError:內(nèi)存不足錯誤。當(dāng)可用內(nèi)存不足以讓JaVa虛擬機分配給一個對
象
時拋出該錯誤。
java.lang.StackOverflowError:堆棧溢出錯誤。當(dāng)一個應(yīng)用遞歸調(diào)用的層次太深而導(dǎo)致堆棧
溢出
或者陷入死循環(huán)時拋出該錯誤。
java.lang.ClassCastException:類造型異常。假設(shè)有類A和B(A不是B的父類或子類),0是A
的
實例,那么當(dāng)強制將0構(gòu)造為類B的實例時拋出該異常。該異常經(jīng)常被稱為強制類型轉(zhuǎn)換異常。
java.lang.ClassNotFoundException:找不到類異常。當(dāng)應(yīng)用試圖根據(jù)字符串形式的類名構(gòu)造
類,
而在遍歷CLASSPAH之后找不到對應(yīng)名稱的CIaSS文件時,拋出該異常。
java.lang.ArithmeticException:算術(shù)條件異常。譬如:整數(shù)除零等。
java.lang.ArraylndexOutOfBoundsException:數(shù)組索引越界異常。當(dāng)對數(shù)組的索引值為負數(shù)
或
大于等于數(shù)組大小時拋出。
java.lang.IndexOutOfBoundsException:索引越界異常。當(dāng)訪問某個序列的索引值小于0或大
于
等于序列大小時,拋出該異常。
java.lang.InstantiationException:實例化異常。當(dāng)試圖通過newlnstance()方法創(chuàng)建某個類
的實
例,而該類是一個抽象類或接口時,拋出該異常。
java.lang.NoSuchFieldException:屬性不存在異常。當(dāng)訪問某個類的不存在的屬性時拋出該
異
常。
java.lang.NoSuchMethodException:方法不存在異常。當(dāng)訪問某個類的不存在的方法時拋出該
第6/25頁
異常。-
java.lang.NullPointerException:空指針異常。當(dāng)應(yīng)用試圖在要求使用對象的地方使用了
null時,
拋出該異常。譬如:調(diào)用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、
使用
throw語句拋出null等等。
java.lang.NumberFormatException:數(shù)字格式異常。當(dāng)試圖將—IKString轉(zhuǎn)換為指定的數(shù)字類
型,而該字符串確不滿足數(shù)字類型要求的格式時,拋出該異常。
java.lang.StringlndexOutOfBoundsException:字符串索引越界異常。當(dāng)使用索引值訪問某個
字
符串中的字符,而該索引值小于O或大于等于序列大小時,拋出該異常。
18、Error和Exception區(qū)別是什么?
【僅供參考】
Error類型的錯誤通常為虛擬機相關(guān)錯誤,如系統(tǒng)崩潰,內(nèi)存不足,堆棧溢出等,編譯器不會
對這
類錯誤進行檢測,JAVA應(yīng)用程序也不應(yīng)對這類錯誤進行捕獲,一旦這類錯誤發(fā)生,通常應(yīng)用程
序
會被終止,僅靠應(yīng)用程序本身無法恢復(fù);
Exception類的錯誤是可以在應(yīng)用程序中進行捕獲并處理的,通常遇到這種錯誤,應(yīng)對其進行
處
理,使應(yīng)用程序可以繼續(xù)正常運行。
19、throw和throws的區(qū)別?
【僅供參考】
throw:是真實拋出一個異常。
throws:是聲明可能會拋出一個異常。
20、常見的異常類有哪些?
【僅供參考】
NullPointerException空指針異常
ClassNotFoundException指定類不存在
NuniberFormatException字符串轉(zhuǎn)換為數(shù)字異常
IndexOutOfBoundsException數(shù)組下標越界異常
ClassCastException數(shù)據(jù)類型轉(zhuǎn)換異常
FileNotFoUndEXCePtiOn文件未找到異常
NoSuchMethodException方法不存在異常
IOExceptionIO異常
SocketExceptionSocket異常
第7/25頁
IT辦
1、說一下HashMap的實現(xiàn)原理?
【僅供參考】
HashMap基于Hash算法實現(xiàn)的,我們通過PUt(key,value)存儲,get(key)來獲取。當(dāng)傳入
key時,HashMap會根據(jù)key.hashCode()計算出hash值,根據(jù)hash值將ValUe保存在
bucket里。當(dāng)計算出的hash值相同時,我們稱之為hash沖突,HashMap的做法是用鏈表和
紅黑樹存儲相同hash值的valueo當(dāng)hash沖突的個數(shù)比較少時,使用鏈表否則使用紅黑
樹。
2、Java容器都有哪些?
【僅供參考,
Java容器分為Collection和Map兩大類,其下又有很多子類,如下所示:
Collection
List
ArrayList
LinkedList
Vector
Stack
Set
HashSet
LinkedHashSet
TreeSet
Map
HashMap
LinkedHashMap
TreeMap
ConcurrentllashMap
Hashtable
3、List?Set、Map之間的區(qū)別是什么?
【僅供參考】
List、Set、Map的區(qū)別主要體現(xiàn)在兩個方面:元素是否有序、是否允許元素重復(fù)。LiSt元素有
序且允許重復(fù)。Set元素?zé)o序(AbStraCtSet和HaShSet無序,TreeSet二叉樹排序,元素有
序),不允許重復(fù)。MaP元素?zé)o序(AbStraCtMaP和HaShmaP無序,TreeMaP二叉樹排序,元素有
序),key值必須唯一,ValUe可以重復(fù)。
4、synchronized和ReentrantLock的區(qū)別
【僅供參考】
synchronized是和if、else、for、while一樣的關(guān)鍵字,ReentrantLock是類,這是二者的
本質(zhì)區(qū)別。既然ReentrantLock是類,那么它就提供了比synchronized更多更靈活的特性,
第8/25頁
可以被繼承、可以有方法、可以有各種各樣的類變量,ReentrantLock比synchronized的擴
展性體現(xiàn)在幾點上:
(1)ReentrantLock可以對獲取鎖的等待時間進行設(shè)置,這樣就避免了死鎖
(2)ReentrantLock可以獲取各種鎖的信息
(3)ReentrantLock可以靈活地實現(xiàn)多路通知
另外,二者的鎖機制其實也是不一樣的。ReentrantLock底層調(diào)用的是Unsafe的park方法
加鎖,synchronized操作的應(yīng)該是對象頭中markword,這點我不能確定。
5^Semaphore有什么作用
【僅供參考】
Semaphore就是一個信號量,它的作用是限制某段代碼塊的并發(fā)數(shù)。Semaphore有一個構(gòu)造函
數(shù),可以傳入一個int型整數(shù)n,表示某段代碼最多只有n個線程可以訪問,如果超出了
n,那么請等待,等到某個線程執(zhí)行完畢這段代碼塊,下一個線程再進入。由此可以看出如果
Semaphore構(gòu)造函數(shù)中傳入的int型整數(shù)n=l,相當(dāng)于變成了一"t^synchronized了。
6、說一下atomic的原理?
【僅供參考】
atomic主要利用CAS(CompareAndWwap)和volatile和native方法來保證原子操作,從
而避免synchronized的高開銷,執(zhí)行效率大為提升。
7、常用的并發(fā)工具類有哪些?
【僅供參考】
(1)CountDownLatch
(2)CyclicBarrier
(3)Semaphore
(4)Exchanger
8、說一下synchronized底層實現(xiàn)原理?
【僅供參考】
synchronized是由一對monitorenter/monitorexit指令實現(xiàn)的,monitor對象是同步的基本
實現(xiàn)單元。在Java6之前,monitor的實現(xiàn)完全是依靠操作系統(tǒng)內(nèi)部的互斥鎖,因為需要進
行用戶態(tài)到內(nèi)核態(tài)的切換,所以同步操作是一個無差別的重量級操作,性能也很低。但在Java
6的時候,Java虛擬機對此進行了大刀闊斧地改進,提供了三種不同的monitor實現(xiàn),也就
是常說的三種不同的鎖:偏向鎖(BiaSedLocking),輕量級鎖和重量級鎖,大大改進了其性
能。
9、JUC常用輔助類
【僅供參考】
COUntDOWnLatCh:設(shè)定一個數(shù),當(dāng)調(diào)用Cc)UntDoWn()時數(shù)量減一,當(dāng)調(diào)用await()時判斷計數(shù)器
是否為0,不為0就阻塞,直到計數(shù)器為0
CyclicBarrier:設(shè)定一個數(shù),當(dāng)調(diào)用await()時判斷計數(shù)器是否達到目標值,未達到就阻塞,
第9/25頁
直到計數(shù)器達到目標值
SemaPhore:設(shè)定一個信號量,當(dāng)調(diào)用acquire()時判斷是否還有信號,有就信號量減一線程繼續(xù)
執(zhí)行,沒有就阻塞等待其他線程釋放信號量,當(dāng)調(diào)用release。時釋放信號量,喚醒阻塞線程
10、編寫多線程程序有幾種實現(xiàn)方式?
【僅供參考】
通常來說,可以認為有三種方式:1)繼承Thread類;2)實現(xiàn)Runnable接口;3)實現(xiàn)
Callable接口。
其中,Thread其實也是實現(xiàn)了Runable接口。Runnable和Callable的主要區(qū)別在于是否有
返回值。
11、怎么喚醒一個阻塞的線程
【僅供參考】
如果線程是因為調(diào)用了wait。、SIeeP()或者join()方法而導(dǎo)致的阻塞,可以中斷線程,并
且通過拋出InterruptedException來喚醒它;如果線程遇到了IO阻塞,無能為力,因為IO
是操作系統(tǒng)實現(xiàn)的,Java代碼并沒有辦法直接接觸到操作系統(tǒng)。
12、什么是多線程的上下文切換
【僅供參考】
多線程的上下文切換是指CPU控制權(quán)由一個已經(jīng)正在運行的線程切換到另外一個就緒并等待獲
取CPU執(zhí)行權(quán)的線程的過程。
13^FutureTask是什么
【僅供參考】
這個其實前面有提到過,F(xiàn)utureTask表示一個異步運算的任務(wù)。FutureTask里面可以傳入一
個Callable的具體實現(xiàn)類,可以對這個異步運算的任務(wù)的結(jié)果進行等待獲取、判斷是否已經(jīng)
完成、取消任務(wù)等操作。當(dāng)然,由于FutureTask也是Runnable接口的實現(xiàn)類,所以
FUtUreTaSk也可以放入線程池中。
14、Java線程數(shù)過多會造成什么異常?
【僅供參考】
(1)線程的生命周期開銷非常高
(2)消耗過多的CPU資源
如果可運行的線程數(shù)量多于可用處理器的數(shù)量,那么有線程將會被閑置。大量空閑的線程會占
用許多內(nèi)存,給垃圾回收器帶來壓力,而且大量的線程在競爭CPU資源時還將產(chǎn)生其他性能的
開銷。
(3)降低穩(wěn)定性
JVM在可創(chuàng)建線程的數(shù)量上存在一個限制,這個限制值將隨著平臺的不同而不同,并且承受著
多個因素制約,包括JVM的啟動參數(shù)、Thread構(gòu)造函數(shù)中請求棧的大小,以及底層操作系統(tǒng)
對線程的限制等。如果破壞了這些限制,那么可能拋出OutOfMemoryError異常。
第10/25頁
15、java反射的作是什么?
【僅供參考】
反射機制是在運時,對于任意個類,都能夠知道這個類的所有屬性和法;對于任意個對
象,都能夠調(diào)它的任意個法。在java中,只要給定類的名字,就可以通過反射機制來獲
得類的所有信息。這種動態(tài)獲取的信息以及動態(tài)調(diào)對象的法的功能稱為java語的反射機
16、反射有哪些應(yīng)用場景呢?
【僅供參考】
川BC連接數(shù)據(jù)庫時使用ClaSS.forName()通過反射加載數(shù)據(jù)庫的驅(qū)動程序
ECliSPe、IDEA等開發(fā)工具利用反射動態(tài)解析對象的類型與結(jié)構(gòu),動態(tài)提示對象的屬性和方法
Web服務(wù)器中利用反射調(diào)用了SeVIet的SerViCe方法
JDK動態(tài)代理底層依賴反射實現(xiàn)
17、什么是裝飾器模式?
【僅供參考】
裝飾器模式是指動態(tài)地給一個對象增加一些額外的功能,同時又不改變其結(jié)構(gòu)。
優(yōu)點:裝飾類和被裝飾類可以獨立發(fā)展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝
飾模式可以動態(tài)擴展一個實現(xiàn)類的功能。
裝飾器模式的關(guān)鍵:裝飾器中使用了被裝飾的對象。
比如,創(chuàng)建一個對象“l(fā)aowang”,給對象添加不同的裝飾,穿上夾克、戴上帽子.這個
執(zhí)行過程就是裝飾者模式,實現(xiàn)代碼如下。
18、說一下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變化等。
19、說一下JVM的主要組成部分?及其作用?
【僅供參考】
類加載器(ClaSSLoader)
運行時數(shù)據(jù)區(qū)(RuntimeDataArea)
執(zhí)行引擎(ExecutionEngine)
本地庫接口(NativeInterface)
「組件的作用:」首先通過類加載器(CIaSSLoader)會把Java代碼轉(zhuǎn)換成字節(jié)碼,運行時
數(shù)據(jù)區(qū)(RuntimeDataArea)再把字節(jié)碼加載到內(nèi)存中,而字節(jié)碼文件只是JVM的一套指令
集規(guī)范,并不能直接交給底層操作系統(tǒng)去執(zhí)行,因此需要特定的命令解析器執(zhí)行引擎
第11/25頁
(ExecutionEngine),將字節(jié)碼翻譯成底層系統(tǒng)指令,再交由CPU去執(zhí)行,而這個過程中需
要調(diào)用其他語言的本地庫接口(NativeInterface)來實現(xiàn)整個程序的功能。
20、怎么判斷對象是否可以被回收?
【僅供參考】
一般有兩種方法來判斷:
引用計數(shù)器:為每個對象創(chuàng)建一個引用計數(shù),有對象引用時計數(shù)器+1,引用被釋放時計數(shù)-
1,當(dāng)計數(shù)器為0時就可以被回收。它有一個缺點不能解決循環(huán)引用的問題;
可達性分析:從GCRoots開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個對象到GC
Roots沒有任何引用鏈相連時,則證明此對象是可以被回收的。
三、Web篇
1、常用HTTP狀態(tài)碼是怎么分類的?
【僅供參考】
狀態(tài)碼類別描述
Ixx信息狀態(tài)碼信息,服務(wù)器收到請求,需要請求者繼續(xù)執(zhí)行操作
2xx成功狀態(tài)碼成功,操作被成功接收并處理
3xx重定向狀態(tài)碼重定向,需要進一步的操作以完成請求
4xx客戶端錯誤狀態(tài)碼客戶端錯誤,請求包含語法錯誤或無法完成請求
5xx服務(wù)器錯誤狀態(tài)碼服務(wù)器錯誤,服務(wù)器在處理請求的過程中發(fā)生了錯誤
HTTPl.0和HTTPLI和HTTP2.0的區(qū)別
HTTPl.0:無狀態(tài),無連接
HTTPl.1:長連接,請求管道化,增加緩存處理,增加HoSt字段,支持斷點傳輸
HTTP2.0:二進制分幀,多路復(fù)用(連接共享),頭部壓縮,服務(wù)器推送
2、http和https的基本概念
【僅供參考】
-HTTP:
是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個客戶端和服務(wù)器端請求和應(yīng)答的標準
(TCP),用于計算機之間傳輸文字,圖片,音頻,視頻等超文本數(shù)據(jù)的協(xié)議,它可以使瀏覽器
更加高效,使網(wǎng)絡(luò)傳輸減少
-HTTPS:
是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)
是SSL,HTTPS就是從HTTP加上加密處理(一般是SSL安全通信線路)+認證+完整性保護
-HTTPS協(xié)議的主要作用:
建立一個信息安全通道,來保證數(shù)據(jù)傳輸?shù)陌踩?/p>
確認網(wǎng)站的真實性
第12/25頁
3、什么是TOken
【僅供參考】
TOken的引入:Token是在客戶端頻繁向服務(wù)端請求數(shù)據(jù),服務(wù)端頻繁的去數(shù)據(jù)庫查詢用戶名和
密碼并進行對比,判斷用戶名和密碼正確與否,并作出相應(yīng)提示,在這樣的背景下,Token便應(yīng)
運而生。
TOken的定義:Token是服務(wù)端生成的一串字符串,以作客戶端進行請求的一個令牌,當(dāng)?shù)谝淮?/p>
登錄后,服務(wù)器生成一個Token便將此Token返回給客戶端,以后客戶端只需帶上這個Token前來
請求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。
使用TOken的目的:Token的目的是為了減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫,使服務(wù)器
更加健壯。
4、說一下tcp粘包是怎么產(chǎn)生的?
【僅供參考】
tcp粘包可能發(fā)生在發(fā)送端或者接收端,分別來看兩端各種產(chǎn)生粘包的原因:
發(fā)送端粘包:發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包;
接收方粘包:接收方不及時接收緩沖區(qū)的包,造成多個包接收。
5、spring中的bean是線程安全的嗎?
【僅供參考】
spring中的bean默認是單例模式,spring框架并沒有對單例bean進行多線程的封裝處
理。
實際上大部分時候springbean無狀態(tài)的(比如dao類),所有某種程度上來說bean也是
安全的,但如果bean有狀態(tài)的話(比如viewmodel對象),那就要開發(fā)者自己去保證線程
安全了,最簡單的就是改變bean的作用域,把"singleton"變更為"prototype”,這樣請
求bean相當(dāng)于newBeano了,所以就可以保證線程安全了。
有狀態(tài)就是有數(shù)據(jù)存儲功能。
無狀態(tài)就是不會保存數(shù)據(jù)。
6、@ReqUeStMaPPing的作用是什么?
【僅供參考】
將http請求映射到相應(yīng)的類/方法上。
7、前端控制器DiSPatCherSerVlet作用?
【僅供參考】
接收請求,響應(yīng)結(jié)果,相當(dāng)于轉(zhuǎn)發(fā)器,中央處理器。有了dispatcherServlet減少了其它組件之
間的耦合度。
用戶請求到達前端控制器,它就相當(dāng)于Oivc模式中的c,diSpatcherServlet是整個流程控制的中
心,由它調(diào)用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
8、JPA和Ilibernate有哪些區(qū)別?
第13/25頁
簡而言之
JPA是一個規(guī)范或者接口
Hibernate是JPA的一個實現(xiàn)
當(dāng)我們使用JPA的時候,我們使用javax.persistence包中的注釋和接口時,不需要使用
hibernate的導(dǎo)入包。
我們建議使用JPA注釋,因為哦我們沒有將其綁定到Hibernate作為實現(xiàn)。后來(我知道-
小于百分之一的幾率),我們可以使用另一種JPA實現(xiàn)。
9、springboot配置文件有哪幾種類型?它們有什么區(qū)別?
【僅供參考】
配置文件有?properties格式和?yml格式,它們主要的區(qū)別是書法風(fēng)格不同。
.properties配置如下:
spring.RabbitMQ.port=5672
.yml配置如下:
spring:
RabbitMQ:
port:5672
yml格式不支持?PropertySource注解導(dǎo)入。
10、什么是SpringDataREST?
【僅供參考】
SpringDataTEST可以用來發(fā)布關(guān)于SPring數(shù)據(jù)庫的HATEOASRESTful資源。
11、什么是YAML?
【僅供參考】
YAML是一種人類可讀的數(shù)據(jù)序列化語言。它通常用于配置文件。
與屬性文件相比,如果我們想要在配置文件中添加復(fù)雜的屬性,YAML文件就更加結(jié)構(gòu)化,而且
更少混淆??梢钥闯鯵AML具有分層配置數(shù)據(jù)。
12、SPringbOOt讀取配置文件的方式
【僅供參考】
SPringboot默認讀取配置文件為application.PrOPertieS或者是application,yml
13、你如何理解SpringBoot中的Starters?
【僅供參考】
StarterS可以理解為啟動器,它包含了一系列可以集成到應(yīng)用里面的依賴包,你可以一站式集
成Spring及其他技術(shù),而不需要到處找示例代碼和依賴包。如你想使用SpringJPA訪問數(shù)
據(jù)庫,只要加入spring-boot-starter-data-jpa啟動器依賴就能使用了。
第14/25頁
14、在hibernate中使用Integer和int做映射有什么區(qū)別?
【僅供參考】
Integer類型為對象,它的值允許為null,而int屬于基礎(chǔ)數(shù)據(jù)類型,值不能為null0
15、說一下MyBatis的一級緩存和二級緩存?
【僅供參考】
一級緩存:基于PerpetualCache的HashMap本地緩存,它的聲明周期是和SQLSession一致
的,有多個SQLSession或者分布式的環(huán)境中數(shù)據(jù)庫操作,可能會出現(xiàn)臟數(shù)據(jù)。當(dāng)Session
flush或close之后,該Session中的所有Cache就將清空,默認一級緩存是開啟的。
二級緩存:也是基于PerpetualCache的IlashMap本地緩存,不同在于其存儲作用域為
Mapper級別的,如果多個SQLSeSSiOn之間需要共享緩存,則需要使用到二級緩存,并且二級緩
存可自定義存儲源,如Ehcacheo默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性
類需要實現(xiàn)Serializable序列化接口(可用來保存對象的狀態(tài))。
開啟二級緩存數(shù)據(jù)查詢流程:二級緩存->一級緩存->數(shù)據(jù)庫。
緩存更新機制:當(dāng)某一個作用域(一級緩存SeSSiOn/二級緩存MaPPer)進行了C∕U∕D操作后,
默認該作用域下所有select中的緩存將被Clearo
16、為什么要使用hibernate?
【僅供參考】
hibernate是對jdbc的封裝,大大簡化了數(shù)據(jù)訪問層的繁瑣的重復(fù)性代碼。
hibernate是一個優(yōu)秀的ORM實現(xiàn),很多程度上簡化了DAO層的編碼功能。
可以很方便的進行數(shù)據(jù)庫的移植工作。
提供了緩存機制,是程序執(zhí)行更改的高效。
17、MyBatis邏輯分頁和物理分頁的區(qū)別是什么?
【僅供參考】
邏輯分頁是一次性查詢很多數(shù)據(jù),然后再在結(jié)果中檢索分頁的數(shù)據(jù)。這樣做弊端是需要消耗大
量的內(nèi)存、有內(nèi)存溢出的風(fēng)險、對數(shù)據(jù)庫壓力較大。
物理分頁是從數(shù)據(jù)庫查詢指定條數(shù)的數(shù)據(jù),彌補了一次性全部查出的所有數(shù)據(jù)的種種缺點,比
如需要大量的內(nèi)存,對數(shù)據(jù)庫查詢壓力較大等問題。
18、MyBatiS是否支持延遲加載?延遲加載的原理是什么?
【僅供參考】
MyBatis支持延遲加載,設(shè)置IaZyLe)adingEnabled=true即可。
延遲加載的原理的是調(diào)用的時候觸發(fā)加載,而不是在初始化的時候就加載信息。比如調(diào)用a.
getB().getName(),這個時候發(fā)現(xiàn)a.getB()的值為null,此時會單獨觸發(fā)事先保存好的關(guān)
聯(lián)B對象的SQL,先查詢出來B,然后再調(diào)用a.setB(b),而這時候再調(diào)用a.getB().
getName()就有值了,這就是延遲加載的基本原理。
19、RowBounds是一次性查詢?nèi)拷Y(jié)果嗎?為什么?
第15/25頁
RowBounds表面是在“所有”數(shù)據(jù)中檢索數(shù)據(jù),其實并非是一次性查詢出所有數(shù)據(jù),因為
MyBatis是對jdbc的封裝,在Jdbc驅(qū)動中有一個FetchSize的配置,它規(guī)定了每次最多
從數(shù)據(jù)庫查詢多少條數(shù)據(jù),假如你要查詢更多數(shù)據(jù),它會在你執(zhí)行next()的時候,去查詢更多
的數(shù)據(jù)。就好比你去自動取款機取IOooO元,但取款機每次最多能取2500元,所以你要取4
次才能把錢取完。只是對于Jdbc來說,當(dāng)你調(diào)用next。的時候會自動幫你完成查詢工作。這
樣做的好處可以有效的防止內(nèi)存溢出。
20、hibernate實體類必須要有無參構(gòu)造函數(shù)嗎?為什么?
【僅供參考】
hibernate中每個實體類必須提供一個無參構(gòu)造函數(shù),因為hibernate框架要使用
reflectionapi,通過調(diào)用ClassnewInstance()來創(chuàng)建實體類的實例,如果沒有無參的構(gòu)造
函數(shù)就會拋出異常。
四、數(shù)據(jù)處理篇
1、RabbitMQ有哪些重要的組件?
【僅供參考】
ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立連接的管理器,程序代碼中使
用。
Channel(信道):消息推送使用的通道。
Exchange(交換器):用于接受、分配消息。
Queue(隊列):用于存儲生產(chǎn)者的消息。
RoutingKey(路由鍵):用于把生成者的數(shù)據(jù)分配到交換器上。
BindingKey(綁定鍵):用于把交換器的消息綁定到隊列上。
2.RabbitMQ怎么保證消息的穩(wěn)定性?
【僅供參考】
提供了事務(wù)的功能。
通過將channel設(shè)置為confirm(確認)模式。
3、RabbitMQ節(jié)點的類型有哪些?
【僅供參考】
磁盤節(jié)點:消息會存儲到磁盤。
內(nèi)存節(jié)點:消息都存儲在內(nèi)存中,重啟服務(wù)器消息丟失,性能高于磁盤類型。
4、kafka如何減少數(shù)據(jù)丟失?
【僅供參考】
一般我們在用到這種消息中件的時候,肯定會考慮要怎樣才能保證數(shù)據(jù)不丟失,在面試中也會
問到相關(guān)的問題。但凡遇到這種問題,是指3個方面的數(shù)據(jù)不丟失,即:producerconsumer端
第16/25頁
數(shù)據(jù)不丟失broker端數(shù)據(jù)不丟失
5、集群中為什么要有主節(jié)點?
【僅供參考】
在分布式環(huán)境中,有些業(yè)務(wù)邏輯只需要集群中的某一臺機器進行執(zhí)行,其他的機器可以共享這
個結(jié)果,這樣可以大大減少重復(fù)計算,提高性能,所以就需要主節(jié)點。
6、為什么要使用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ù)的正
常進行。
異步通信:很多時候,用戶不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許
用戶把一個消息放入隊列,但并不立即處理它。想向隊列中放入多少消息就放多少,然后在需
要的時候再去處理它們。
7、kafkafollower如何與Ieader同步數(shù)據(jù)?
【僅供參考】
Kafka的復(fù)制機制既不是完全的同步復(fù)制,也不是單純的異步復(fù)制。完全同步復(fù)制要求AIl
AliveFolIoWer都復(fù)制完,這條消息才會被認為COnImit,這種復(fù)制方式極大的影響了吞吐率。
而異步復(fù)制方式下,F(xiàn)OnoWer異步的從Leader復(fù)制數(shù)據(jù),數(shù)據(jù)只要被Leader寫入Iog就被認為已
經(jīng)COmmi3這種情況下,如果Ieader掛掉,會丟失數(shù)據(jù),kafka使用ISR的方式很好的均衡了確
保數(shù)據(jù)不丟失以及吞吐率。FOIlOWer可以批量的從Leader復(fù)制數(shù)據(jù),而且Leader充分利用磁盤
順序讀以及Sendfile(zeroCOPy)機制,這樣極大的提高復(fù)制性能,內(nèi)部批量寫磁盤,大幅減
少了FoIlOWer與Leader的消息量差。
8、kafka同時設(shè)置了7天和IOG清除數(shù)據(jù),到第五天的時候消息達到了10G,這個時候
kafka將如何處理?
【僅供參考】
這個時候kafka會執(zhí)行數(shù)據(jù)清除工作,時間和大小不論那個滿足條件,都會清空數(shù)據(jù)。
9、kafka可以脫離zookeeper單獨使用嗎?為什么?
【僅供參考】
kafka不能脫離zookeeper單獨使用,因為kafka使用zookeeper管理和協(xié)調(diào)kafka的節(jié)
點服務(wù)器。
第17/25頁
10、kafka如何不消費重復(fù)數(shù)據(jù)?比如扣款,我們不能重復(fù)的扣?
【僅供參考】
其實還是得結(jié)合業(yè)務(wù)來思考,我這里給幾個思路:
比如你拿個數(shù)據(jù)要寫庫,你先根據(jù)主鍵查一下,如果這數(shù)據(jù)都有了,你就別插入了,update一
下好吧。
比如你是寫Redis,那沒問題了,反正每次都是set,天然幕等性。
比如你不是上面兩個場景,那做的稍微復(fù)雜一點,你需要讓生產(chǎn)者發(fā)送每條數(shù)據(jù)的時候,里面
加一個全局唯一的id,類似訂單id之類的東西,然后你這里消費到了之后,先根據(jù)這個id去比
如RediS里查一下,之前消費過嗎?如果沒有消費過,你就處理,然后這個id寫Redis。如果消
費過了,那你就別處理了,保證別重復(fù)處理相同的消息即可。
比如基于數(shù)據(jù)庫的唯一鍵來保證重復(fù)數(shù)據(jù)不會重復(fù)插入多條。因為有唯一鍵約束了,重復(fù)數(shù)據(jù)
插入只會報錯,不會導(dǎo)致數(shù)據(jù)庫中出現(xiàn)臟數(shù)據(jù)。
11、Redis如何做內(nèi)存優(yōu)化?
【僅供參考】
盡量使用Redis的散列表,把相關(guān)的信息放到散列表里面存儲,而不是把每個字段單獨存儲,
這樣可以有效的減少內(nèi)存使用。比如將Web系統(tǒng)的用戶對象,應(yīng)該放到散列表里面再整體存儲
到Redis,而不是把用戶的姓名、年齡、密碼、郵箱等字段分別設(shè)置key進行存儲。
12、Redis是什么?都有哪些使用場景?
【僅供參考】
Redis是一個使用C語言開發(fā)的高速緩存數(shù)據(jù)庫。
Redis使用場景:
記錄帖子點贊數(shù)、點擊數(shù)、評論數(shù);
緩存近期熱帖;
緩存文章詳情信息;
記錄用戶會話信息。
13、RediS淘汰策略有哪些?
【僅供參考】
volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server,db[i].expires)中挑選最近最少使用
的數(shù)據(jù)淘汰。
volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server,db[i].expires)中挑選將要過期的數(shù)
據(jù)淘汰。
volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server,db[i].expires)中任意選擇數(shù)據(jù)淘
汰。
allkeys-lru:從數(shù)據(jù)集(server,db[i].diet)中挑選最近最少使用的數(shù)據(jù)淘汰。
allkeys-random:從數(shù)據(jù)集(server,db[i].diet)中任意選擇數(shù)據(jù)淘汰。
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)。
第18/25頁
14、RediS支持的數(shù)據(jù)類型有哪些?
【僅供參考】
Redis支持的數(shù)據(jù)類型:string(字符串)、list(列表)、hash(字典)、set(集合)、
ZSet(有序集合)。
15、Redis為什么是單線程的?
【僅供參考】
因為CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內(nèi)存或者網(wǎng)絡(luò)帶寬。既然單線程
容易實現(xiàn),而且cpu又不會成為瓶頸,那就順理成章地采用單線程的方案了。
關(guān)于Redis的性能,官方網(wǎng)站也有,普通筆記本輕松處理每秒幾十萬的請求。
而且單線程并不代表就慢nginx和nodejs也都是高性能單線程的代表。
16、Redis有哪些功能?
【僅供參考】
數(shù)據(jù)緩存功能
分布式鎖的功能
支持數(shù)據(jù)持久化
支持事務(wù)
支持消息隊列
17、什么是緩存穿透?怎么解決?
【僅供參考】
緩存穿透:指查詢一個一定不存在的數(shù)據(jù),由于緩存是不命中時需要從數(shù)據(jù)庫查詢,查不到數(shù)
據(jù)則不寫入緩存,這將導(dǎo)致這個不存在的數(shù)據(jù)每次請求都要到數(shù)據(jù)庫去查詢,造成緩存穿透。
解決方案:最簡單粗暴的方法如果一個查詢返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在,還是系統(tǒng)故
障),我們就把這個空結(jié)果進行緩存,但它的過期時間會很短,最長不超過五分鐘。
18、Redis持久化有幾種方式?
【僅供參考】
Redis的持久化有兩種方式,或者說有兩種策略:
RDB(RedisDatabase):指定的時間間隔能對你的數(shù)據(jù)進行快照存儲。
AOF(AppendOnlyFile):每一個收到的寫命令都通過Write函數(shù)追加到文件中。
19、Redis常見的性能問題有哪些?該如何解決?
【僅供參考】
主服務(wù)器寫內(nèi)存快照,會阻塞主線程的工作,當(dāng)快照比較大時對性能影響是非常大的,會間斷
性暫停服務(wù),所以主服務(wù)器最好不要寫內(nèi)存快照。
Redis主從復(fù)制的性能問題,為了主從復(fù)制的速度和連接的穩(wěn)定性,主從庫最好在同一個局域
網(wǎng)內(nèi)。
第19/25頁
20、怎么保證緩存和數(shù)據(jù)庫數(shù)據(jù)的一致性?
【僅供參考】
合理設(shè)置緩存的過期時間。
新增、更改、刪除數(shù)據(jù)庫操作時同步更新Redis,可以使用事物機制來保證數(shù)據(jù)的一致性。
五、MySQL數(shù)據(jù)庫篇
1、char和Varehar的區(qū)別是什么?
【僅供參考】
Γchar(n)J:固定長度類型,比如訂閱Char(10),當(dāng)你輸入"abc''三個字符的時候,它們占
的空間還是10個字節(jié),其他7個是空字節(jié)。
chat優(yōu)點:效率高;缺點:占用空間;適用場景:存儲密碼的md5值,固定長度的,使用
char非常合適。
Γvarchar(n)J:可變長度,存儲的值是每個值占用的字節(jié)再加上一個用來記錄其長度的字節(jié)
的長度。
所以,從空間上考慮VarCahr比較合適;從效率上考慮char比較合適,二者使用需要權(quán)衡。
2、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)
3、MySQL的并行策略有哪些?
【僅供參考】
按表分發(fā)策略:如果兩個事務(wù)更新不同的表,它們就可以并行。因為數(shù)據(jù)是存儲在表里的,所
以按表分發(fā),可以保證兩個worker不會更新同一行。缺點:如果碰到熱點表,比如所有的更
新事務(wù)都會涉及到某一個表的時候,所有事務(wù)都會被分配到同一個worker中,就變成單線程
復(fù)制了。
按行分發(fā)策略:如果兩個事務(wù)沒有更新相同的行,它們在備庫上可以并行。如果兩個事務(wù)沒有
更新相同的行,它們在備庫上可以并行執(zhí)行。顯然,這個模式要求binlog格式必須是rowo
第20/25頁
缺點:相比于按表并行分發(fā)策略,按行并行策略在決定線程分發(fā)的時候,需要消耗更多的計算
資源。
4、join用法?
【僅供參考】
使用leftjoin左邊的表不一定是驅(qū)動表
如果需要leftjoin的語義,就不能把被驅(qū)動表的字段放在where條件里面做等值判斷或不
等值判斷,必須都寫在on里面
標準的groupby語句,是需要在select部分加一個聚合函數(shù),比如SeIeCta,count(*)
fromtgroupbyaorderbynull;
5、如何做MySQL的性能優(yōu)化?
【僅供參考】
為搜索字段創(chuàng)建索引。
避免使用select*,列出需要查詢的字段。
垂直分割分表。
選擇正確的存儲引擎。
6、詳細說一下一條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)
7、關(guān)系型和非關(guān)系型數(shù)據(jù)庫的區(qū)別?
【僅供參考】
關(guān)系型數(shù)據(jù)庫的優(yōu)點
容易理解,因為它采用了關(guān)系模型來組織數(shù)據(jù)。
可以保持數(shù)據(jù)的一致性。
數(shù)據(jù)更新的開銷比較小。
支持復(fù)雜查詢(帶where子句的查詢)
非關(guān)系型數(shù)據(jù)庫(NOSQL)的優(yōu)點
無需經(jīng)過SQL層的解析,讀寫效率高。
基于鍵值對,讀寫性能很高,易于擴展
可以支持多種類型數(shù)據(jù)的存儲,如圖片,文檔等等。
擴展(可分為內(nèi)存性數(shù)據(jù)庫以及文檔型數(shù)據(jù)庫,比如Redis,MongoDB,HBase等,適合場景:
第21/25頁
數(shù)據(jù)量大高可用的日志系統(tǒng)/地理位置存儲系統(tǒng))。
8、說一下數(shù)據(jù)庫的事務(wù)隔離?
【僅供參考】
MySQL的事務(wù)隔離是在MySQL,ini配置文件里添加的,在文件的最后添加:
*transaction-isolation=REPEATABLE-READ
99
可用的配置值:READ-UNCOMMITTED、READ-COMMnTED、REPEATABLE-READ、SERlALIZABLE0
READ-UNCOMMITTED:未提交讀,最低隔離級別、事務(wù)未提交前,就可被其他事務(wù)讀?。〞霈F(xiàn)
幻讀、臟讀、不可重復(fù)讀)。
READ-COMMITTED:提交讀,一個事務(wù)提交后才能被其他事務(wù)讀取到(會造成幻讀、不可重復(fù)
讀)。
REPEATABLE-READ:可重復(fù)讀,默認級別,保證多次讀取同一個數(shù)據(jù)時,其值都和事務(wù)開始時候
的內(nèi)容是一致,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(會造成幻讀)。
SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復(fù)讀、
幻讀。
「臟讀」:表示一個事務(wù)能夠讀取另一個事務(wù)中還未提交的數(shù)據(jù)。比如,某個事務(wù)嘗試插入記
錄A,此時該事務(wù)還未提交,然后另一個事務(wù)嘗試讀取到了記錄Ao
「不可重復(fù)讀」:是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù)。
「幻讀」:指同一個事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣。比如同一個事務(wù)A第一次查詢時
候有n條記錄,但是第二次同等條件下查詢卻有n+1條記錄,這就好像產(chǎn)生了幻覺。發(fā)生幻
讀的原因也是另外一個事務(wù)新增或者刪除或者修改了第一個事務(wù)結(jié)果集里面的數(shù)據(jù),同一個記
錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了。
9、binlog的概念是什么,起到什么作用,可以保證crash-safe嗎?
【僅供參考】
binlog是歸檔日志,屬于MySQLServer層的日志??梢詫崿F(xiàn)主從復(fù)制和數(shù)據(jù)恢復(fù)兩個作用。
當(dāng)需要恢復(fù)數(shù)據(jù)時,可以取出某個時間范圍內(nèi)的binlog進行重放恢復(fù)。
但是binlog不可以做crashsafe,因為crash之前,binlog可能沒有寫入完全MySQL就
掛了。所以需要配合redolog才可以進行crashsafeo
10、MySQL有哪些自增ID?各自場景是什么?
【僅供參考】
表
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年石家莊貨運從業(yè)資格證模擬考試系統(tǒng)
- 服務(wù)延期合同(2篇)
- 2025年四川水利職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025至2031年中國機場驅(qū)鳥車行業(yè)投資前景及策略咨詢研究報告
- 教育科技行業(yè)人才需求預(yù)測-深度研究
- 創(chuàng)新創(chuàng)業(yè)教育體系構(gòu)建-深度研究
- 2025年度裝合同終止協(xié)議書:綠色建材應(yīng)用項目合同終止協(xié)議書
- 二零二五年度室內(nèi)外裝修一體化合同終止及后續(xù)管理協(xié)議
- 2025年度鋼結(jié)構(gòu)拆除施工安全生產(chǎn)責(zé)任保險合同
- 2025年度跨境電商平臺終止合作解除合同協(xié)議書
- 2023年四川省公務(wù)員錄用考試《行測》真題卷及答案解析
- 2025年高考物理復(fù)習(xí)壓軸題:電磁感應(yīng)綜合問題(原卷版)
- 雨棚鋼結(jié)構(gòu)施工組織設(shè)計正式版
- 2024尼爾森IQ中國本土快消企業(yè)調(diào)研報告
- 2024年印度辣椒行業(yè)狀況及未來發(fā)展趨勢報告
- 鑄鋁焊接工藝
- 《社區(qū)康復(fù)》課件-第六章 骨關(guān)節(jié)疾病、損傷患者的社區(qū)康復(fù)實踐
- 2024年湖南省公務(wù)員考試行政職業(yè)能力測驗真題
- 攀巖運動之繩結(jié)技巧課程
- 防打架毆斗安全教育課件
- 采購行業(yè)的swot分析
評論
0/150
提交評論