2023年Java大廠面試必備100題_第1頁(yè)
2023年Java大廠面試必備100題_第2頁(yè)
2023年Java大廠面試必備100題_第3頁(yè)
2023年Java大廠面試必備100題_第4頁(yè)
2023年Java大廠面試必備100題_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2023年JaVa大廠面試必備Ie)O題(一)

一、基礎(chǔ)篇

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

【僅供參考】

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

象并沒有復(fù)制。

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

2、構(gòu)造器是否可被重寫?

【僅供參考】

Constructor不能被override(重寫),但是可以overload(重載),所以你可以看到個(gè)

類中有多個(gè)構(gòu)造函數(shù)的情況。

3、String類的常用方法都有那些?

【僅供參考】

indexθf():返回指定字符的索引。

charAt():返回指定索引處的字符。

replace():字符串替換。

trim():去除字符串兩端空白。

split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組。

getBytes():返回字符串的byte類型數(shù)組。

IengthO:返回字符串長(zhǎng)度。

toLowerCase():將字符串轉(zhuǎn)成小寫字母。

toUpperCase():將字符串轉(zhuǎn)成大寫字符。

substring():截取字符串。

equals():字符串比較。

4、String類可以繼承嗎?

【僅供參考】

不行。String類使用final修飾,無法被繼承。

5、final在Java中有什么作用?

【僅供參考】

final修飾的類叫最終類,該類不能被繼承。

final修飾的方法不能被重寫。

final修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改。

第1/25頁(yè)

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

【僅供參考】

抽象類只能單繼承,接口可以多實(shí)現(xiàn)。

抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。

抽象類中可以有成員變量,接口中沒有成員變量,只能有常量(默認(rèn)就是publicstatic

final)

抽象類中可以包含非抽象的方法,在Java7之前接口中的所有方法都是抽象的,在Java8

之后,接口支持非抽象方法:default方法、靜態(tài)方法等。JaVa9支持私有方法、私有靜態(tài)方

法。

抽象類中的方法類型可以是任意修飾符,Java8之前接口中的方法只能是public類型,Java

9支持PriVate類型。

設(shè)計(jì)思想的區(qū)別:

接口是自上而下的抽象過程,接口規(guī)范了某些行為,是對(duì)某一行為的抽象。我需要這個(gè)行為,

我就去實(shí)現(xiàn)某個(gè)接口,但是具體這個(gè)行為怎么實(shí)現(xiàn),完全由自己決定。

抽象類是自下而上的抽象過程,抽象類提供了通用實(shí)現(xiàn),是對(duì)某一類事物的抽象。我們?cè)趯憣?shí)

現(xiàn)類的時(shí)候,發(fā)現(xiàn)某些實(shí)現(xiàn)類具有幾乎相同的實(shí)現(xiàn),因此我們將這些相同的實(shí)現(xiàn)抽取出來成為

抽象類,然后如果有一些差異點(diǎn),則可以提供抽象方法來支持自定義實(shí)現(xiàn)。

我在網(wǎng)上看到有個(gè)說法,挺形象的:

普通類像親爹,他有啥都是你的。

抽象類像叔伯,有一部分會(huì)給你,還能指導(dǎo)你做事的方法。

接口像干爹,可以給你指引方法,但是做成啥樣得你自己努力實(shí)現(xiàn)。

7、Java中的Math,round(-1.5)等于多少?

【僅供參考】

等于-1,因?yàn)樵跀?shù)軸上取值時(shí),中間值(0.5)向右取整,所以正0.5是往上取整,負(fù)0.5

是直接舍棄。

8、了解JaVa的包裝類型嗎?為什么需要包裝類?

【僅供參考】

Java是一種面向?qū)ο笳Z言,很多地方都需要使用對(duì)象而不是基本數(shù)據(jù)類型。比如,在集合類

中,我們是無法將int、double等類型放進(jìn)去的。因?yàn)榧系娜萜饕笤厥荗bject類

型。

為了讓基本類型也具有對(duì)象的特征,就出現(xiàn)了包裝類型。相當(dāng)于將基本類型包裝起來,使得它

具有了對(duì)象的性質(zhì),并且為其添加了屬性和方法,豐富了基本類型的操作。

9、是否可以從一個(gè)靜態(tài)(static)方法內(nèi)部發(fā)出對(duì)非靜態(tài)(non-static)方法的調(diào)用?

【僅供參考】

區(qū)分兩種情況,發(fā)出調(diào)用時(shí)是否顯示創(chuàng)建了對(duì)象實(shí)例。

1)沒有顯示創(chuàng)建對(duì)象實(shí)例:不可以發(fā)起調(diào)用,非靜態(tài)方法只能被對(duì)象所調(diào)用,靜態(tài)方法可以

通過對(duì)象調(diào)用,也可以通過類名調(diào)用,所以靜態(tài)方法被調(diào)用時(shí),可能還沒有創(chuàng)建任何實(shí)例對(duì)

象。因此通過靜態(tài)方法內(nèi)部發(fā)出對(duì)非靜態(tài)方法的調(diào)用,此時(shí)可能無法知道非靜態(tài)方法屬于哪個(gè)

第2/25頁(yè)

對(duì)象。

publicclassDemo{

publicstaticvoidStaticMethodO{

//直接調(diào)用非靜態(tài)方法:編譯報(bào)錯(cuò)

InstanceMethod();

publicvoidinstanceMethod(){

System.out.PrintI.n("非靜態(tài)方法");

2)顯示創(chuàng)建對(duì)象實(shí)例:可以發(fā)起調(diào)用,在靜態(tài)方法中顯示的創(chuàng)建對(duì)象實(shí)例,則可以正常的調(diào)

用。

publicclassDemo(

publicstaticvoidStaticMethodO{

//先創(chuàng)建實(shí)例對(duì)象,再調(diào)用非靜態(tài)方法:成功執(zhí)行

Demodemo=newDemo();

demo.instanceMethod0;

)

publicvoidinstanceMethod(){

System,out.Println("非靜態(tài)方法");

10、&和&&的區(qū)別?

【僅供參考】

&&:邏輯與運(yùn)算符。當(dāng)運(yùn)算符左右兩邊的表達(dá)式都為true,才返回true。同時(shí)具有短路性,

如果第一個(gè)表達(dá)式為false,則直接返回falseo

&:邏輯與運(yùn)算符、按位與運(yùn)算符。

按位與運(yùn)算符:用于二進(jìn)制的計(jì)算,只有對(duì)應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1,否則為

Oo

邏輯與運(yùn)算符:&在用于邏輯與時(shí),和&&的區(qū)別是不具有短路性。所在通常使用邏輯與運(yùn)算

符都會(huì)使用&&,而&更多的適用于位運(yùn)算。

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

【僅供參考】

英文名稱(JavaVirtualMachine),就是我們耳熟能詳?shù)腏aVa虛擬機(jī)。JaVa能夠跨平臺(tái)運(yùn)

行的核心在于JVM。

所有的java程序會(huì)首先被編譯為.class的類文件,這種類文件可以在虛擬機(jī)上執(zhí)行。也就是說

ClaSS文件并不直接與機(jī)器的操作系統(tǒng)交互,而是經(jīng)過虛擬機(jī)間接與操作系統(tǒng)交互,由虛擬機(jī)將

程序解釋給本地系統(tǒng)執(zhí)行。

第3/25頁(yè)

針對(duì)不同的系統(tǒng)有不同的jvm實(shí)現(xiàn),有LinUX版本的jvm實(shí)現(xiàn),也有WindOWS版本的jvm

實(shí)現(xiàn),但是同一段代碼在編譯后的字節(jié)碼是一樣的。這就是JaVa能夠跨平臺(tái),實(shí)現(xiàn)一次編寫,

多處運(yùn)行的原因所在。

JRE

英文名稱(JaVaRuntimeEnvironment),就是JaVa運(yùn)行時(shí)環(huán)境。我們編寫的JaVa程序必須要

在JRE才能運(yùn)行。它主要包含兩個(gè)部分,JVM和Java核心類庫(kù)。

JRE是JaVa的運(yùn)行環(huán)境,并不是一個(gè)開發(fā)環(huán)境,所以沒有包含任何開發(fā)工具,如編譯器和調(diào)試器

等。

如果你只是想運(yùn)行JaVa程序,而不是開發(fā)JaVa程序的話,那么你只需要安裝JRE即可。

JDK

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

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

JRE=JVM+Java核心類庫(kù)

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

12、兩個(gè)對(duì)象的hashCode()相同,則equals()也一定為true,對(duì)嗎?

【僅供參考】

不對(duì),兩個(gè)對(duì)象的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相等即兩個(gè)鍵值對(duì)的哈希值相等,然而哈希值相等,并不一定能得

出鍵值對(duì)相等。

13、面向?qū)ο蠛兔嫦蜻^程的區(qū)別?

【僅供參考】

面向?qū)ο蠛兔嫦蜻^程是一種軟件開發(fā)思想。

面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)按這些步驟實(shí)現(xiàn),使用的時(shí)候依次調(diào)

用就可以了。

面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個(gè)對(duì)象,分別設(shè)計(jì)這些對(duì)象,然后將他們組裝成有完整功

能的系統(tǒng)。面向過程只用函數(shù)實(shí)現(xiàn),面向?qū)ο笫怯妙悓?shí)現(xiàn)各個(gè)功能模塊。

以五子棋為例,面向過程的設(shè)計(jì)思路就是首先分析問題的步驟:

1、開始游戲,2、黑子先走,3、繪制畫面,4、判斷輸贏,5、輪到白子,6、繪制畫面,7、

判斷輸贏,8、返回步驟2,9、輸出最后結(jié)果。把上面每個(gè)步驟用分別的函數(shù)來實(shí)現(xiàn),問題就

第4/25頁(yè)

解決了。

而面向?qū)ο蟮脑O(shè)計(jì)則是從另外的思路來解決問題。整個(gè)五子棋可以分為:

黑白雙方

棋盤系統(tǒng),負(fù)責(zé)繪制畫面

規(guī)則系統(tǒng),負(fù)責(zé)判定諸如犯規(guī)、輸贏等。

黑白雙方負(fù)責(zé)接受用戶的輸入,并告知棋盤系統(tǒng)棋子布局發(fā)生變化,棋盤系統(tǒng)接收到了棋子的

變化的信息就負(fù)責(zé)在屏幕上面顯示出這種變化,同時(shí)利用規(guī)則系統(tǒng)來對(duì)棋局進(jìn)行判定。

14、JaVa創(chuàng)建對(duì)象有幾種方式?

【僅供參考】

JaVa創(chuàng)建對(duì)象有以下幾種方式:

用new語句創(chuàng)建對(duì)象。

使用反射,使用CIaSs.newlnstance()創(chuàng)建對(duì)象。

調(diào)用對(duì)象的CIOne()方法。

運(yùn)用反序列化手段,調(diào)用java.io.ObjeCtlnPUtStream對(duì)象的readθbject()方法。

15、JaVa的特點(diǎn)?

【僅供參考】

JaVa具有平臺(tái)獨(dú)立性和移植性。

JaVa有一句口號(hào):Writeonce,runanywhere,一次編寫、到處運(yùn)行。這也是JaVa的魅力所

在。而實(shí)現(xiàn)這種特性的正是JaVa虛擬機(jī)JVM。己編譯的JaVa程序可以在任何帶有JVM的平臺(tái)上運(yùn)

行。你可以在WindOWS平臺(tái)編寫代碼,然后拿到IinUX上運(yùn)行。只要你在編寫完代碼后,將代碼

編譯成.class文件,再把ClaSS文件打成JaVa包,這個(gè)jar包就可以在不同的平臺(tái)上運(yùn)行了。

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

JaVa是一個(gè)強(qiáng)類型語言,它允許擴(kuò)展編譯時(shí)檢查潛在類型不匹配問題的功能。JaVa要求顯式的

方法聲明,它不支持C風(fēng)格的隱式聲明。這些嚴(yán)格的要求保證編譯程序能捕捉調(diào)用錯(cuò)誤,這就導(dǎo)

致更可靠的程序。

異常處理是JaVa中使得程序更穩(wěn)健的另一個(gè)特征。異常是某種類似于錯(cuò)誤的異常條件出現(xiàn)的信

號(hào)。使用try/catch/finally語句,程序員可以找到出錯(cuò)的處理代碼,這就簡(jiǎn)化了出錯(cuò)處理和恢

復(fù)的任務(wù)。

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

【僅供參考】

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

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

異常。可能有一系列的方法調(diào)用,最終才進(jìn)入拋出異常的方法,這一系列方法調(diào)用的有序列表

叫做

調(diào)用棧。

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

第5/25頁(yè)

JVM

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

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

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

17、JaVa常見異常有哪些

【僅供參考】

java.lang.IllegalAccessError:違法訪問錯(cuò)誤。當(dāng)一個(gè)應(yīng)用試圖訪問、修改某個(gè)類的域

(Field)或

者調(diào)用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。

java.lang.InstantiationError:實(shí)例化錯(cuò)誤。當(dāng)一個(gè)應(yīng)用試圖通過JaVa的new操作符構(gòu)造一個(gè)

抽象

類或者接口時(shí)拋出該異常.

java.lang.OutOfMemoryError:內(nèi)存不足錯(cuò)誤。當(dāng)可用內(nèi)存不足以讓JaVa虛擬機(jī)分配給一個(gè)對(duì)

時(shí)拋出該錯(cuò)誤。

java.lang.StackOverflowError:堆棧溢出錯(cuò)誤。當(dāng)一個(gè)應(yīng)用遞歸調(diào)用的層次太深而導(dǎo)致堆棧

溢出

或者陷入死循環(huán)時(shí)拋出該錯(cuò)誤。

java.lang.ClassCastException:類造型異常。假設(shè)有類A和B(A不是B的父類或子類),0是A

實(shí)例,那么當(dāng)強(qiáng)制將0構(gòu)造為類B的實(shí)例時(shí)拋出該異常。該異常經(jīng)常被稱為強(qiáng)制類型轉(zhuǎn)換異常。

java.lang.ClassNotFoundException:找不到類異常。當(dāng)應(yīng)用試圖根據(jù)字符串形式的類名構(gòu)造

類,

而在遍歷CLASSPAH之后找不到對(duì)應(yīng)名稱的CIaSS文件時(shí),拋出該異常。

java.lang.ArithmeticException:算術(shù)條件異常。譬如:整數(shù)除零等。

java.lang.ArraylndexOutOfBoundsException:數(shù)組索引越界異常。當(dāng)對(duì)數(shù)組的索引值為負(fù)數(shù)

大于等于數(shù)組大小時(shí)拋出。

java.lang.IndexOutOfBoundsException:索引越界異常。當(dāng)訪問某個(gè)序列的索引值小于0或大

等于序列大小時(shí),拋出該異常。

java.lang.InstantiationException:實(shí)例化異常。當(dāng)試圖通過newlnstance()方法創(chuàng)建某個(gè)類

的實(shí)

例,而該類是一個(gè)抽象類或接口時(shí),拋出該異常。

java.lang.NoSuchFieldException:屬性不存在異常。當(dāng)訪問某個(gè)類的不存在的屬性時(shí)拋出該

常。

java.lang.NoSuchMethodException:方法不存在異常。當(dāng)訪問某個(gè)類的不存在的方法時(shí)拋出該

第6/25頁(yè)

異常。-

java.lang.NullPointerException:空指針異常。當(dāng)應(yīng)用試圖在要求使用對(duì)象的地方使用了

null時(shí),

拋出該異常。譬如:調(diào)用null對(duì)象的實(shí)例方法、訪問null對(duì)象的屬性、計(jì)算null對(duì)象的長(zhǎng)度、

使用

throw語句拋出null等等。

java.lang.NumberFormatException:數(shù)字格式異常。當(dāng)試圖將—IKString轉(zhuǎn)換為指定的數(shù)字類

型,而該字符串確不滿足數(shù)字類型要求的格式時(shí),拋出該異常。

java.lang.StringlndexOutOfBoundsException:字符串索引越界異常。當(dāng)使用索引值訪問某個(gè)

符串中的字符,而該索引值小于O或大于等于序列大小時(shí),拋出該異常。

18、Error和Exception區(qū)別是什么?

【僅供參考】

Error類型的錯(cuò)誤通常為虛擬機(jī)相關(guān)錯(cuò)誤,如系統(tǒng)崩潰,內(nèi)存不足,堆棧溢出等,編譯器不會(huì)

對(duì)這

類錯(cuò)誤進(jìn)行檢測(cè),JAVA應(yīng)用程序也不應(yīng)對(duì)這類錯(cuò)誤進(jìn)行捕獲,一旦這類錯(cuò)誤發(fā)生,通常應(yīng)用程

會(huì)被終止,僅靠應(yīng)用程序本身無法恢復(fù);

Exception類的錯(cuò)誤是可以在應(yīng)用程序中進(jìn)行捕獲并處理的,通常遇到這種錯(cuò)誤,應(yīng)對(duì)其進(jìn)行

理,使應(yīng)用程序可以繼續(xù)正常運(yùn)行。

19、throw和throws的區(qū)別?

【僅供參考】

throw:是真實(shí)拋出一個(gè)異常。

throws:是聲明可能會(huì)拋出一個(gè)異常。

20、常見的異常類有哪些?

【僅供參考】

NullPointerException空指針異常

ClassNotFoundException指定類不存在

NuniberFormatException字符串轉(zhuǎn)換為數(shù)字異常

IndexOutOfBoundsException數(shù)組下標(biāo)越界異常

ClassCastException數(shù)據(jù)類型轉(zhuǎn)換異常

FileNotFoUndEXCePtiOn文件未找到異常

NoSuchMethodException方法不存在異常

IOExceptionIO異常

SocketExceptionSocket異常

第7/25頁(yè)

IT辦

1、說一下HashMap的實(shí)現(xiàn)原理?

【僅供參考】

HashMap基于Hash算法實(shí)現(xiàn)的,我們通過PUt(key,value)存儲(chǔ),get(key)來獲取。當(dāng)傳入

key時(shí),HashMap會(huì)根據(jù)key.hashCode()計(jì)算出hash值,根據(jù)hash值將ValUe保存在

bucket里。當(dāng)計(jì)算出的hash值相同時(shí),我們稱之為hash沖突,HashMap的做法是用鏈表和

紅黑樹存儲(chǔ)相同hash值的valueo當(dāng)hash沖突的個(gè)數(shù)比較少時(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)在兩個(gè)方面:元素是否有序、是否允許元素重復(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頁(yè)

可以被繼承、可以有方法、可以有各種各樣的類變量,ReentrantLock比synchronized的擴(kuò)

展性體現(xiàn)在幾點(diǎn)上:

(1)ReentrantLock可以對(duì)獲取鎖的等待時(shí)間進(jìn)行設(shè)置,這樣就避免了死鎖

(2)ReentrantLock可以獲取各種鎖的信息

(3)ReentrantLock可以靈活地實(shí)現(xiàn)多路通知

另外,二者的鎖機(jī)制其實(shí)也是不一樣的。ReentrantLock底層調(diào)用的是Unsafe的park方法

加鎖,synchronized操作的應(yīng)該是對(duì)象頭中markword,這點(diǎn)我不能確定。

5^Semaphore有什么作用

【僅供參考】

Semaphore就是一個(gè)信號(hào)量,它的作用是限制某段代碼塊的并發(fā)數(shù)。Semaphore有一個(gè)構(gòu)造函

數(shù),可以傳入一個(gè)int型整數(shù)n,表示某段代碼最多只有n個(gè)線程可以訪問,如果超出了

n,那么請(qǐng)等待,等到某個(gè)線程執(zhí)行完畢這段代碼塊,下一個(gè)線程再進(jìn)入。由此可以看出如果

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底層實(shí)現(xiàn)原理?

【僅供參考】

synchronized是由一對(duì)monitorenter/monitorexit指令實(shí)現(xiàn)的,monitor對(duì)象是同步的基本

實(shí)現(xiàn)單元。在Java6之前,monitor的實(shí)現(xiàn)完全是依靠操作系統(tǒng)內(nèi)部的互斥鎖,因?yàn)樾枰M(jìn)

行用戶態(tài)到內(nèi)核態(tài)的切換,所以同步操作是一個(gè)無差別的重量級(jí)操作,性能也很低。但在Java

6的時(shí)候,Java虛擬機(jī)對(duì)此進(jìn)行了大刀闊斧地改進(jìn),提供了三種不同的monitor實(shí)現(xiàn),也就

是常說的三種不同的鎖:偏向鎖(BiaSedLocking),輕量級(jí)鎖和重量級(jí)鎖,大大改進(jìn)了其性

能。

9、JUC常用輔助類

【僅供參考】

COUntDOWnLatCh:設(shè)定一個(gè)數(shù),當(dāng)調(diào)用Cc)UntDoWn()時(shí)數(shù)量減一,當(dāng)調(diào)用await()時(shí)判斷計(jì)數(shù)器

是否為0,不為0就阻塞,直到計(jì)數(shù)器為0

CyclicBarrier:設(shè)定一個(gè)數(shù),當(dāng)調(diào)用await()時(shí)判斷計(jì)數(shù)器是否達(dá)到目標(biāo)值,未達(dá)到就阻塞,

第9/25頁(yè)

直到計(jì)數(shù)器達(dá)到目標(biāo)值

SemaPhore:設(shè)定一個(gè)信號(hào)量,當(dāng)調(diào)用acquire()時(shí)判斷是否還有信號(hào),有就信號(hào)量減一線程繼續(xù)

執(zhí)行,沒有就阻塞等待其他線程釋放信號(hào)量,當(dāng)調(diào)用release。時(shí)釋放信號(hào)量,喚醒阻塞線程

10、編寫多線程程序有幾種實(shí)現(xiàn)方式?

【僅供參考】

通常來說,可以認(rèn)為有三種方式:1)繼承Thread類;2)實(shí)現(xiàn)Runnable接口;3)實(shí)現(xiàn)

Callable接口。

其中,Thread其實(shí)也是實(shí)現(xiàn)了Runable接口。Runnable和Callable的主要區(qū)別在于是否有

返回值。

11、怎么喚醒一個(gè)阻塞的線程

【僅供參考】

如果線程是因?yàn)檎{(diào)用了wait。、SIeeP()或者join()方法而導(dǎo)致的阻塞,可以中斷線程,并

且通過拋出InterruptedException來喚醒它;如果線程遇到了IO阻塞,無能為力,因?yàn)镮O

是操作系統(tǒng)實(shí)現(xiàn)的,Java代碼并沒有辦法直接接觸到操作系統(tǒng)。

12、什么是多線程的上下文切換

【僅供參考】

多線程的上下文切換是指CPU控制權(quán)由一個(gè)已經(jīng)正在運(yùn)行的線程切換到另外一個(gè)就緒并等待獲

取CPU執(zhí)行權(quán)的線程的過程。

13^FutureTask是什么

【僅供參考】

這個(gè)其實(shí)前面有提到過,F(xiàn)utureTask表示一個(gè)異步運(yùn)算的任務(wù)。FutureTask里面可以傳入一

個(gè)Callable的具體實(shí)現(xiàn)類,可以對(duì)這個(gè)異步運(yùn)算的任務(wù)的結(jié)果進(jìn)行等待獲取、判斷是否已經(jīng)

完成、取消任務(wù)等操作。當(dāng)然,由于FutureTask也是Runnable接口的實(shí)現(xiàn)類,所以

FUtUreTaSk也可以放入線程池中。

14、Java線程數(shù)過多會(huì)造成什么異常?

【僅供參考】

(1)線程的生命周期開銷非常高

(2)消耗過多的CPU資源

如果可運(yùn)行的線程數(shù)量多于可用處理器的數(shù)量,那么有線程將會(huì)被閑置。大量空閑的線程會(huì)占

用許多內(nèi)存,給垃圾回收器帶來壓力,而且大量的線程在競(jìng)爭(zhēng)CPU資源時(shí)還將產(chǎn)生其他性能的

開銷。

(3)降低穩(wěn)定性

JVM在可創(chuàng)建線程的數(shù)量上存在一個(gè)限制,這個(gè)限制值將隨著平臺(tái)的不同而不同,并且承受著

多個(gè)因素制約,包括JVM的啟動(dòng)參數(shù)、Thread構(gòu)造函數(shù)中請(qǐng)求棧的大小,以及底層操作系統(tǒng)

對(duì)線程的限制等。如果破壞了這些限制,那么可能拋出OutOfMemoryError異常。

第10/25頁(yè)

15、java反射的作是什么?

【僅供參考】

反射機(jī)制是在運(yùn)時(shí),對(duì)于任意個(gè)類,都能夠知道這個(gè)類的所有屬性和法;對(duì)于任意個(gè)對(duì)

象,都能夠調(diào)它的任意個(gè)法。在java中,只要給定類的名字,就可以通過反射機(jī)制來獲

得類的所有信息。這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)對(duì)象的法的功能稱為java語的反射機(jī)

16、反射有哪些應(yīng)用場(chǎng)景呢?

【僅供參考】

川BC連接數(shù)據(jù)庫(kù)時(shí)使用ClaSS.forName()通過反射加載數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序

ECliSPe、IDEA等開發(fā)工具利用反射動(dòng)態(tài)解析對(duì)象的類型與結(jié)構(gòu),動(dòng)態(tài)提示對(duì)象的屬性和方法

Web服務(wù)器中利用反射調(diào)用了SeVIet的SerViCe方法

JDK動(dòng)態(tài)代理底層依賴反射實(shí)現(xiàn)

17、什么是裝飾器模式?

【僅供參考】

裝飾器模式是指動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的功能,同時(shí)又不改變其結(jié)構(gòu)。

優(yōu)點(diǎn):裝飾類和被裝飾類可以獨(dú)立發(fā)展,不會(huì)相互耦合,裝飾模式是繼承的一個(gè)替代模式,裝

飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能。

裝飾器模式的關(guān)鍵:裝飾器中使用了被裝飾的對(duì)象。

比如,創(chuàng)建一個(gè)對(duì)象“l(fā)aowang”,給對(duì)象添加不同的裝飾,穿上夾克、戴上帽子.這個(gè)

執(zhí)行過程就是裝飾者模式,實(shí)現(xiàn)代碼如下。

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

【僅供參考】

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

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

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

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

的變化、gc變化等。

19、說一下JVM的主要組成部分?及其作用?

【僅供參考】

類加載器(ClaSSLoader)

運(yùn)行時(shí)數(shù)據(jù)區(qū)(RuntimeDataArea)

執(zhí)行引擎(ExecutionEngine)

本地庫(kù)接口(NativeInterface)

「組件的作用:」首先通過類加載器(CIaSSLoader)會(huì)把Java代碼轉(zhuǎn)換成字節(jié)碼,運(yùn)行時(shí)

數(shù)據(jù)區(qū)(RuntimeDataArea)再把字節(jié)碼加載到內(nèi)存中,而字節(jié)碼文件只是JVM的一套指令

集規(guī)范,并不能直接交給底層操作系統(tǒng)去執(zhí)行,因此需要特定的命令解析器執(zhí)行引擎

第11/25頁(yè)

(ExecutionEngine),將字節(jié)碼翻譯成底層系統(tǒng)指令,再交由CPU去執(zhí)行,而這個(gè)過程中需

要調(diào)用其他語言的本地庫(kù)接口(NativeInterface)來實(shí)現(xiàn)整個(gè)程序的功能。

20、怎么判斷對(duì)象是否可以被回收?

【僅供參考】

一般有兩種方法來判斷:

引用計(jì)數(shù)器:為每個(gè)對(duì)象創(chuàng)建一個(gè)引用計(jì)數(shù),有對(duì)象引用時(shí)計(jì)數(shù)器+1,引用被釋放時(shí)計(jì)數(shù)-

1,當(dāng)計(jì)數(shù)器為0時(shí)就可以被回收。它有一個(gè)缺點(diǎn)不能解決循環(huán)引用的問題;

可達(dá)性分析:從GCRoots開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個(gè)對(duì)象到GC

Roots沒有任何引用鏈相連時(shí),則證明此對(duì)象是可以被回收的。

三、Web篇

1、常用HTTP狀態(tài)碼是怎么分類的?

【僅供參考】

狀態(tài)碼類別描述

Ixx信息狀態(tài)碼信息,服務(wù)器收到請(qǐng)求,需要請(qǐng)求者繼續(xù)執(zhí)行操作

2xx成功狀態(tài)碼成功,操作被成功接收并處理

3xx重定向狀態(tài)碼重定向,需要進(jìn)一步的操作以完成請(qǐng)求

4xx客戶端錯(cuò)誤狀態(tài)碼客戶端錯(cuò)誤,請(qǐng)求包含語法錯(cuò)誤或無法完成請(qǐng)求

5xx服務(wù)器錯(cuò)誤狀態(tài)碼服務(wù)器錯(cuò)誤,服務(wù)器在處理請(qǐng)求的過程中發(fā)生了錯(cuò)誤

HTTPl.0和HTTPLI和HTTP2.0的區(qū)別

HTTPl.0:無狀態(tài),無連接

HTTPl.1:長(zhǎng)連接,請(qǐng)求管道化,增加緩存處理,增加HoSt字段,支持?jǐn)帱c(diǎn)傳輸

HTTP2.0:二進(jìn)制分幀,多路復(fù)用(連接共享),頭部壓縮,服務(wù)器推送

2、http和https的基本概念

【僅供參考】

-HTTP:

是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)

(TCP),用于計(jì)算機(jī)之間傳輸文字,圖片,音頻,視頻等超文本數(shù)據(jù)的協(xié)議,它可以使瀏覽器

更加高效,使網(wǎng)絡(luò)傳輸減少

-HTTPS:

是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)

是SSL,HTTPS就是從HTTP加上加密處理(一般是SSL安全通信線路)+認(rèn)證+完整性保護(hù)

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

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

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

第12/25頁(yè)

3、什么是TOken

【僅供參考】

TOken的引入:Token是在客戶端頻繁向服務(wù)端請(qǐng)求數(shù)據(jù),服務(wù)端頻繁的去數(shù)據(jù)庫(kù)查詢用戶名和

密碼并進(jìn)行對(duì)比,判斷用戶名和密碼正確與否,并作出相應(yīng)提示,在這樣的背景下,Token便應(yīng)

運(yùn)而生。

TOken的定義:Token是服務(wù)端生成的一串字符串,以作客戶端進(jìn)行請(qǐng)求的一個(gè)令牌,當(dāng)?shù)谝淮?/p>

登錄后,服務(wù)器生成一個(gè)Token便將此Token返回給客戶端,以后客戶端只需帶上這個(gè)Token前來

請(qǐng)求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。

使用TOken的目的:Token的目的是為了減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫(kù),使服務(wù)器

更加健壯。

4、說一下tcp粘包是怎么產(chǎn)生的?

【僅供參考】

tcp粘包可能發(fā)生在發(fā)送端或者接收端,分別來看兩端各種產(chǎn)生粘包的原因:

發(fā)送端粘包:發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包;

接收方粘包:接收方不及時(shí)接收緩沖區(qū)的包,造成多個(gè)包接收。

5、spring中的bean是線程安全的嗎?

【僅供參考】

spring中的bean默認(rèn)是單例模式,spring框架并沒有對(duì)單例bean進(jìn)行多線程的封裝處

理。

實(shí)際上大部分時(shí)候springbean無狀態(tài)的(比如dao類),所有某種程度上來說bean也是

安全的,但如果bean有狀態(tài)的話(比如viewmodel對(duì)象),那就要開發(fā)者自己去保證線程

安全了,最簡(jiǎn)單的就是改變bean的作用域,把"singleton"變更為"prototype”,這樣請(qǐng)

求bean相當(dāng)于newBeano了,所以就可以保證線程安全了。

有狀態(tài)就是有數(shù)據(jù)存儲(chǔ)功能。

無狀態(tài)就是不會(huì)保存數(shù)據(jù)。

6、@ReqUeStMaPPing的作用是什么?

【僅供參考】

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

7、前端控制器DiSPatCherSerVlet作用?

【僅供參考】

接收請(qǐng)求,響應(yīng)結(jié)果,相當(dāng)于轉(zhuǎn)發(fā)器,中央處理器。有了dispatcherServlet減少了其它組件之

間的耦合度。

用戶請(qǐng)求到達(dá)前端控制器,它就相當(dāng)于Oivc模式中的c,diSpatcherServlet是整個(gè)流程控制的中

心,由它調(diào)用其它組件處理用戶的請(qǐng)求,dispatcherServlet的存在降低了組件之間的耦合性。

8、JPA和Ilibernate有哪些區(qū)別?

第13/25頁(yè)

簡(jiǎn)而言之

JPA是一個(gè)規(guī)范或者接口

Hibernate是JPA的一個(gè)實(shí)現(xiàn)

當(dāng)我們使用JPA的時(shí)候,我們使用javax.persistence包中的注釋和接口時(shí),不需要使用

hibernate的導(dǎo)入包。

我們建議使用JPA注釋,因?yàn)榕段覀儧]有將其綁定到Hibernate作為實(shí)現(xiàn)。后來(我知道-

小于百分之一的幾率),我們可以使用另一種JPA實(shí)現(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ù)庫(kù)的HATEOASRESTful資源。

11、什么是YAML?

【僅供參考】

YAML是一種人類可讀的數(shù)據(jù)序列化語言。它通常用于配置文件。

與屬性文件相比,如果我們想要在配置文件中添加復(fù)雜的屬性,YAML文件就更加結(jié)構(gòu)化,而且

更少混淆。可以看出YAML具有分層配置數(shù)據(jù)。

12、SPringbOOt讀取配置文件的方式

【僅供參考】

SPringboot默認(rèn)讀取配置文件為application.PrOPertieS或者是application,yml

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

【僅供參考】

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

成Spring及其他技術(shù),而不需要到處找示例代碼和依賴包。如你想使用SpringJPA訪問數(shù)

據(jù)庫(kù),只要加入spring-boot-starter-data-jpa啟動(dòng)器依賴就能使用了。

第14/25頁(yè)

14、在hibernate中使用Integer和int做映射有什么區(qū)別?

【僅供參考】

Integer類型為對(duì)象,它的值允許為null,而int屬于基礎(chǔ)數(shù)據(jù)類型,值不能為null0

15、說一下MyBatis的一級(jí)緩存和二級(jí)緩存?

【僅供參考】

一級(jí)緩存:基于PerpetualCache的HashMap本地緩存,它的聲明周期是和SQLSession一致

的,有多個(gè)SQLSession或者分布式的環(huán)境中數(shù)據(jù)庫(kù)操作,可能會(huì)出現(xiàn)臟數(shù)據(jù)。當(dāng)Session

flush或close之后,該Session中的所有Cache就將清空,默認(rèn)一級(jí)緩存是開啟的。

二級(jí)緩存:也是基于PerpetualCache的IlashMap本地緩存,不同在于其存儲(chǔ)作用域?yàn)?/p>

Mapper級(jí)別的,如果多個(gè)SQLSeSSiOn之間需要共享緩存,則需要使用到二級(jí)緩存,并且二級(jí)緩

存可自定義存儲(chǔ)源,如Ehcacheo默認(rèn)不打開二級(jí)緩存,要開啟二級(jí)緩存,使用二級(jí)緩存屬性

類需要實(shí)現(xiàn)Serializable序列化接口(可用來保存對(duì)象的狀態(tài))。

開啟二級(jí)緩存數(shù)據(jù)查詢流程:二級(jí)緩存->一級(jí)緩存->數(shù)據(jù)庫(kù)。

緩存更新機(jī)制:當(dāng)某一個(gè)作用域(一級(jí)緩存SeSSiOn/二級(jí)緩存MaPPer)進(jìn)行了C∕U∕D操作后,

默認(rèn)該作用域下所有select中的緩存將被Clearo

16、為什么要使用hibernate?

【僅供參考】

hibernate是對(duì)jdbc的封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問層的繁瑣的重復(fù)性代碼。

hibernate是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn),很多程度上簡(jiǎn)化了DAO層的編碼功能。

可以很方便的進(jìn)行數(shù)據(jù)庫(kù)的移植工作。

提供了緩存機(jī)制,是程序執(zhí)行更改的高效。

17、MyBatis邏輯分頁(yè)和物理分頁(yè)的區(qū)別是什么?

【僅供參考】

邏輯分頁(yè)是一次性查詢很多數(shù)據(jù),然后再在結(jié)果中檢索分頁(yè)的數(shù)據(jù)。這樣做弊端是需要消耗大

量的內(nèi)存、有內(nèi)存溢出的風(fēng)險(xiǎn)、對(duì)數(shù)據(jù)庫(kù)壓力較大。

物理分頁(yè)是從數(shù)據(jù)庫(kù)查詢指定條數(shù)的數(shù)據(jù),彌補(bǔ)了一次性全部查出的所有數(shù)據(jù)的種種缺點(diǎn),比

如需要大量的內(nèi)存,對(duì)數(shù)據(jù)庫(kù)查詢壓力較大等問題。

18、MyBatiS是否支持延遲加載?延遲加載的原理是什么?

【僅供參考】

MyBatis支持延遲加載,設(shè)置IaZyLe)adingEnabled=true即可。

延遲加載的原理的是調(diào)用的時(shí)候觸發(fā)加載,而不是在初始化的時(shí)候就加載信息。比如調(diào)用a.

getB().getName(),這個(gè)時(shí)候發(fā)現(xiàn)a.getB()的值為null,此時(shí)會(huì)單獨(dú)觸發(fā)事先保存好的關(guān)

聯(lián)B對(duì)象的SQL,先查詢出來B,然后再調(diào)用a.setB(b),而這時(shí)候再調(diào)用a.getB().

getName()就有值了,這就是延遲加載的基本原理。

19、RowBounds是一次性查詢?nèi)拷Y(jié)果嗎?為什么?

第15/25頁(yè)

RowBounds表面是在“所有”數(shù)據(jù)中檢索數(shù)據(jù),其實(shí)并非是一次性查詢出所有數(shù)據(jù),因?yàn)?/p>

MyBatis是對(duì)jdbc的封裝,在Jdbc驅(qū)動(dòng)中有一個(gè)FetchSize的配置,它規(guī)定了每次最多

從數(shù)據(jù)庫(kù)查詢多少條數(shù)據(jù),假如你要查詢更多數(shù)據(jù),它會(huì)在你執(zhí)行next()的時(shí)候,去查詢更多

的數(shù)據(jù)。就好比你去自動(dòng)取款機(jī)取IOooO元,但取款機(jī)每次最多能取2500元,所以你要取4

次才能把錢取完。只是對(duì)于Jdbc來說,當(dāng)你調(diào)用next。的時(shí)候會(huì)自動(dòng)幫你完成查詢工作。這

樣做的好處可以有效的防止內(nèi)存溢出。

20、hibernate實(shí)體類必須要有無參構(gòu)造函數(shù)嗎?為什么?

【僅供參考】

hibernate中每個(gè)實(shí)體類必須提供一個(gè)無參構(gòu)造函數(shù),因?yàn)閔ibernate框架要使用

reflectionapi,通過調(diào)用ClassnewInstance()來創(chuàng)建實(shí)體類的實(shí)例,如果沒有無參的構(gòu)造

函數(shù)就會(huì)拋出異常。

四、數(shù)據(jù)處理篇

1、RabbitMQ有哪些重要的組件?

【僅供參考】

ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立連接的管理器,程序代碼中使

用。

Channel(信道):消息推送使用的通道。

Exchange(交換器):用于接受、分配消息。

Queue(隊(duì)列):用于存儲(chǔ)生產(chǎn)者的消息。

RoutingKey(路由鍵):用于把生成者的數(shù)據(jù)分配到交換器上。

BindingKey(綁定鍵):用于把交換器的消息綁定到隊(duì)列上。

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

【僅供參考】

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

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

3、RabbitMQ節(jié)點(diǎn)的類型有哪些?

【僅供參考】

磁盤節(jié)點(diǎn):消息會(huì)存儲(chǔ)到磁盤。

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

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

【僅供參考】

一般我們?cè)谟玫竭@種消息中件的時(shí)候,肯定會(huì)考慮要怎樣才能保證數(shù)據(jù)不丟失,在面試中也會(huì)

問到相關(guān)的問題。但凡遇到這種問題,是指3個(gè)方面的數(shù)據(jù)不丟失,即:producerconsumer端

第16/25頁(yè)

數(shù)據(jù)不丟失broker端數(shù)據(jù)不丟失

5、集群中為什么要有主節(jié)點(diǎn)?

【僅供參考】

在分布式環(huán)境中,有些業(yè)務(wù)邏輯只需要集群中的某一臺(tái)機(jī)器進(jìn)行執(zhí)行,其他的機(jī)器可以共享這

個(gè)結(jié)果,這樣可以大大減少重復(fù)計(jì)算,提高性能,所以就需要主節(jié)點(diǎn)。

6、為什么要使用kafka,為什么要使用消息隊(duì)列?

【僅供參考】

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

余,kafka在中間可以起到一個(gè)緩沖的作用,把消息暫存在kafka中,下游服務(wù)就可以按照自己

的節(jié)奏進(jìn)行慢慢處理。

解耦和擴(kuò)展性:項(xiàng)目開始的時(shí)候,并不能確定具體需求。消息隊(duì)列可以作為一個(gè)接口層,解耦

重要的業(yè)務(wù)流程。只需要遵守約定,針對(duì)數(shù)據(jù)編程即可獲取擴(kuò)展能力。

冗余:可以采用一對(duì)多的方式,一個(gè)生產(chǎn)者發(fā)布消息,可以被多個(gè)訂閱topic的服務(wù)消費(fèi)到,供

多個(gè)毫無關(guān)聯(lián)的業(yè)務(wù)使用。

健壯性:消息隊(duì)列可以堆積請(qǐng)求,所以消費(fèi)端業(yè)務(wù)即使短時(shí)間死掉,也不會(huì)影響主要業(yè)務(wù)的正

常進(jìn)行。

異步通信:很多時(shí)候,用戶不想也不需要立即處理消息。消息隊(duì)列提供了異步處理機(jī)制,允許

用戶把一個(gè)消息放入隊(duì)列,但并不立即處理它。想向隊(duì)列中放入多少消息就放多少,然后在需

要的時(shí)候再去處理它們。

7、kafkafollower如何與Ieader同步數(shù)據(jù)?

【僅供參考】

Kafka的復(fù)制機(jī)制既不是完全的同步復(fù)制,也不是單純的異步復(fù)制。完全同步復(fù)制要求AIl

AliveFolIoWer都復(fù)制完,這條消息才會(huì)被認(rèn)為COnImit,這種復(fù)制方式極大的影響了吞吐率。

而異步復(fù)制方式下,F(xiàn)OnoWer異步的從Leader復(fù)制數(shù)據(jù),數(shù)據(jù)只要被Leader寫入Iog就被認(rèn)為已

經(jīng)COmmi3這種情況下,如果Ieader掛掉,會(huì)丟失數(shù)據(jù),kafka使用ISR的方式很好的均衡了確

保數(shù)據(jù)不丟失以及吞吐率。FOIlOWer可以批量的從Leader復(fù)制數(shù)據(jù),而且Leader充分利用磁盤

順序讀以及Sendfile(zeroCOPy)機(jī)制,這樣極大的提高復(fù)制性能,內(nèi)部批量寫磁盤,大幅減

少了FoIlOWer與Leader的消息量差。

8、kafka同時(shí)設(shè)置了7天和IOG清除數(shù)據(jù),到第五天的時(shí)候消息達(dá)到了10G,這個(gè)時(shí)候

kafka將如何處理?

【僅供參考】

這個(gè)時(shí)候kafka會(huì)執(zhí)行數(shù)據(jù)清除工作,時(shí)間和大小不論那個(gè)滿足條件,都會(huì)清空數(shù)據(jù)。

9、kafka可以脫離zookeeper單獨(dú)使用嗎?為什么?

【僅供參考】

kafka不能脫離zookeeper單獨(dú)使用,因?yàn)閗afka使用zookeeper管理和協(xié)調(diào)kafka的節(jié)

點(diǎn)服務(wù)器。

第17/25頁(yè)

10、kafka如何不消費(fèi)重復(fù)數(shù)據(jù)?比如扣款,我們不能重復(fù)的扣?

【僅供參考】

其實(shí)還是得結(jié)合業(yè)務(wù)來思考,我這里給幾個(gè)思路:

比如你拿個(gè)數(shù)據(jù)要寫庫(kù),你先根據(jù)主鍵查一下,如果這數(shù)據(jù)都有了,你就別插入了,update一

下好吧。

比如你是寫Redis,那沒問題了,反正每次都是set,天然幕等性。

比如你不是上面兩個(gè)場(chǎng)景,那做的稍微復(fù)雜一點(diǎn),你需要讓生產(chǎn)者發(fā)送每條數(shù)據(jù)的時(shí)候,里面

加一個(gè)全局唯一的id,類似訂單id之類的東西,然后你這里消費(fèi)到了之后,先根據(jù)這個(gè)id去比

如RediS里查一下,之前消費(fèi)過嗎?如果沒有消費(fèi)過,你就處理,然后這個(gè)id寫Redis。如果消

費(fèi)過了,那你就別處理了,保證別重復(fù)處理相同的消息即可。

比如基于數(shù)據(jù)庫(kù)的唯一鍵來保證重復(fù)數(shù)據(jù)不會(huì)重復(fù)插入多條。因?yàn)橛形ㄒ绘I約束了,重復(fù)數(shù)據(jù)

插入只會(huì)報(bào)錯(cuò),不會(huì)導(dǎo)致數(shù)據(jù)庫(kù)中出現(xiàn)臟數(shù)據(jù)。

11、Redis如何做內(nèi)存優(yōu)化?

【僅供參考】

盡量使用Redis的散列表,把相關(guān)的信息放到散列表里面存儲(chǔ),而不是把每個(gè)字段單獨(dú)存儲(chǔ),

這樣可以有效的減少內(nèi)存使用。比如將Web系統(tǒng)的用戶對(duì)象,應(yīng)該放到散列表里面再整體存儲(chǔ)

到Redis,而不是把用戶的姓名、年齡、密碼、郵箱等字段分別設(shè)置key進(jìn)行存儲(chǔ)。

12、Redis是什么?都有哪些使用場(chǎng)景?

【僅供參考】

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

Redis使用場(chǎng)景:

記錄帖子點(diǎn)贊數(shù)、點(diǎn)擊數(shù)、評(píng)論數(shù);

緩存近期熱帖;

緩存文章詳情信息;

記錄用戶會(huì)話信息。

13、RediS淘汰策略有哪些?

【僅供參考】

volatile-lru:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server,db[i].expires)中挑選最近最少使用

的數(shù)據(jù)淘汰。

volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server,db[i].expires)中挑選將要過期的數(shù)

據(jù)淘汰。

volatile-random:從已設(shè)置過期時(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頁(yè)

14、RediS支持的數(shù)據(jù)類型有哪些?

【僅供參考】

Redis支持的數(shù)據(jù)類型:string(字符串)、list(列表)、hash(字典)、set(集合)、

ZSet(有序集合)。

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

【僅供參考】

因?yàn)镃PU不是Redis的瓶頸,Redis的瓶頸最有可能是機(jī)器內(nèi)存或者網(wǎng)絡(luò)帶寬。既然單線程

容易實(shí)現(xiàn),而且cpu又不會(huì)成為瓶頸,那就順理成章地采用單線程的方案了。

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

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

16、Redis有哪些功能?

【僅供參考】

數(shù)據(jù)緩存功能

分布式鎖的功能

支持?jǐn)?shù)據(jù)持久化

支持事務(wù)

支持消息隊(duì)列

17、什么是緩存穿透?怎么解決?

【僅供參考】

緩存穿透:指查詢一個(gè)一定不存在的數(shù)據(jù),由于緩存是不命中時(shí)需要從數(shù)據(jù)庫(kù)查詢,查不到數(shù)

據(jù)則不寫入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到數(shù)據(jù)庫(kù)去查詢,造成緩存穿透。

解決方案:最簡(jiǎn)單粗暴的方法如果一個(gè)查詢返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在,還是系統(tǒng)故

障),我們就把這個(gè)空結(jié)果進(jìn)行緩存,但它的過期時(shí)間會(huì)很短,最長(zhǎng)不超過五分鐘。

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

【僅供參考】

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

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

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

19、Redis常見的性能問題有哪些?該如何解決?

【僅供參考】

主服務(wù)器寫內(nèi)存快照,會(huì)阻塞主線程的工作,當(dāng)快照比較大時(shí)對(duì)性能影響是非常大的,會(huì)間斷

性暫停服務(wù),所以主服務(wù)器最好不要寫內(nèi)存快照。

Redis主從復(fù)制的性能問題,為了主從復(fù)制的速度和連接的穩(wěn)定性,主從庫(kù)最好在同一個(gè)局域

網(wǎng)內(nèi)。

第19/25頁(yè)

20、怎么保證緩存和數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性?

【僅供參考】

合理設(shè)置緩存的過期時(shí)間。

新增、更改、刪除數(shù)據(jù)庫(kù)操作時(shí)同步更新Redis,可以使用事物機(jī)制來保證數(shù)據(jù)的一致性。

五、MySQL數(shù)據(jù)庫(kù)篇

1、char和Varehar的區(qū)別是什么?

【僅供參考】

Γchar(n)J:固定長(zhǎng)度類型,比如訂閱Char(10),當(dāng)你輸入"abc''三個(gè)字符的時(shí)候,它們占

的空間還是10個(gè)字節(jié),其他7個(gè)是空字節(jié)。

chat優(yōu)點(diǎn):效率高;缺點(diǎn):占用空間;適用場(chǎng)景:存儲(chǔ)密碼的md5值,固定長(zhǎng)度的,使用

char非常合適。

Γvarchar(n)J:可變長(zhǎng)度,存儲(chǔ)的值是每個(gè)值占用的字節(jié)再加上一個(gè)用來記錄其長(zhǎng)度的字節(jié)

的長(zhǎng)度。

所以,從空間上考慮VarCahr比較合適;從效率上考慮char比較合適,二者使用需要權(quán)衡。

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

【僅供參考】

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

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

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

inimum+Supermum:兩個(gè)虛擬的偽記錄,分別表示頁(yè)中的最小記錄和最大記錄,占固定的26字

節(jié)。

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

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

PageDirectory:頁(yè)中某些記錄的相對(duì)位置,也就是各個(gè)槽對(duì)應(yīng)的記錄在頁(yè)面中的地址偏移

量。

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

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

3、MySQL的并行策略有哪些?

【僅供參考】

按表分發(fā)策略:如果兩個(gè)事務(wù)更新不同的表,它們就可以并行。因?yàn)閿?shù)據(jù)是存儲(chǔ)在表里的,所

以按表分發(fā),可以保證兩個(gè)worker不會(huì)更新同一行。缺點(diǎn):如果碰到熱點(diǎn)表,比如所有的更

新事務(wù)都會(huì)涉及到某一個(gè)表的時(shí)候,所有事務(wù)都會(huì)被分配到同一個(gè)worker中,就變成單線程

復(fù)制了。

按行分發(fā)策略:如果兩個(gè)事務(wù)沒有更新相同的行,它們?cè)趥鋷?kù)上可以并行。如果兩個(gè)事務(wù)沒有

更新相同的行,它們?cè)趥鋷?kù)上可以并行執(zhí)行。顯然,這個(gè)模式要求binlog格式必須是rowo

第20/25頁(yè)

缺點(diǎn):相比于按表并行分發(fā)策略,按行并行策略在決定線程分發(fā)的時(shí)候,需要消耗更多的計(jì)算

資源。

4、join用法?

【僅供參考】

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

如果需要leftjoin的語義,就不能把被驅(qū)動(dòng)表的字段放在where條件里面做等值判斷或不

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

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

fromtgroupbyaorderbynull;

5、如何做MySQL的性能優(yōu)化?

【僅供參考】

為搜索字段創(chuàng)建索引。

避免使用select*,列出需要查詢的字段。

垂直分割分表。

選擇正確的存儲(chǔ)引擎。

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

【僅供參考】

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

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

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

分析器(對(duì)SQL進(jìn)行詞法分析和語法分析操作)

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

執(zhí)行器(執(zhí)行時(shí)會(huì)先看用戶是否有執(zhí)行權(quán)限,有才去使用這個(gè)引擎提供的接口)->去引擎層獲

取數(shù)據(jù)返回(如果開啟查詢緩存則會(huì)緩存查詢結(jié)果)

索引相關(guān)

7、關(guān)系型和非關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別?

【僅供參考】

關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)

容易理解,因?yàn)樗捎昧岁P(guān)系模型來組織數(shù)據(jù)。

可以保持?jǐn)?shù)據(jù)的一致性。

數(shù)據(jù)更新的開銷比較小。

支持復(fù)雜查詢(帶where子句的查詢)

非關(guān)系型數(shù)據(jù)庫(kù)(NOSQL)的優(yōu)點(diǎn)

無需經(jīng)過SQL層的解析,讀寫效率高。

基于鍵值對(duì),讀寫性能很高,易于擴(kuò)展

可以支持多種類型數(shù)據(jù)的存儲(chǔ),如圖片,文檔等等。

擴(kuò)展(可分為內(nèi)存性數(shù)據(jù)庫(kù)以及文檔型數(shù)據(jù)庫(kù),比如Redis,MongoDB,HBase等,適合場(chǎng)景:

第21/25頁(yè)

數(shù)據(jù)量大高可用的日志系統(tǒng)/地理位置存儲(chǔ)系統(tǒng))。

8、說一下數(shù)據(jù)庫(kù)的事務(wù)隔離?

【僅供參考】

MySQL的事務(wù)隔離是在MySQL,ini配置文件里添加的,在文件的最后添加:

*transaction-isolation=REPEATABLE-READ

99

可用的配置值:READ-UNCOMMITTED、READ-COMMnTED、REPEATABLE-READ、SERlALIZABLE0

READ-UNCOMMITTED:未提交讀,最低隔離級(jí)別、事務(wù)未提交前,就可被其他事務(wù)讀取(會(huì)出現(xiàn)

幻讀、臟讀、不可重復(fù)讀)。

READ-COMMITTED:提交讀,一個(gè)事務(wù)提交后才能被其他事務(wù)讀取到(會(huì)造成幻讀、不可重復(fù)

讀)。

REPEATABLE-READ:可重復(fù)讀,默認(rèn)級(jí)別,保證多次讀取同一個(gè)數(shù)據(jù)時(shí),其值都和事務(wù)開始時(shí)候

的內(nèi)容是一致,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(會(huì)造成幻讀)。

SERIALIZABLE:序列化,代價(jià)最高最可靠的隔離級(jí)別,該隔離級(jí)別能防止臟讀、不可重復(fù)讀、

幻讀。

「臟讀」:表示一個(gè)事務(wù)能夠讀取另一個(gè)事務(wù)中還未提交的數(shù)據(jù)。比如,某個(gè)事務(wù)嘗試插入記

錄A,此時(shí)該事務(wù)還未提交,然后另一個(gè)事務(wù)嘗試讀取到了記錄Ao

「不可重復(fù)讀」:是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。

「幻讀」:指同一個(gè)事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣。比如同一個(gè)事務(wù)A第一次查詢時(shí)

候有n條記錄,但是第二次同等條件下查詢卻有n+1條記錄,這就好像產(chǎn)生了幻覺。發(fā)生幻

讀的原因也是另外一個(gè)事務(wù)新增或者刪除或者修改了第一個(gè)事務(wù)結(jié)果集里面的數(shù)據(jù),同一個(gè)記

錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了。

9、binlog的概念是什么,起到什么作用,可以保證crash-safe嗎?

【僅供參考】

binlog是歸檔日志,屬于MySQLServer層的日志。可以實(shí)現(xiàn)主從復(fù)制和數(shù)據(jù)恢復(fù)兩個(gè)作用。

當(dāng)需要恢復(fù)數(shù)據(jù)時(shí),可以取出某個(gè)時(shí)間范圍內(nèi)的binlog進(jìn)行重放恢復(fù)。

但是binlog不可以做crashsafe,因?yàn)閏rash之前,binlog可能沒有寫入完全MySQL就

掛了。所以需要配合redolog才可以進(jìn)行crashsafeo

10、MySQL有哪些自增ID?各自場(chǎng)景是什么?

【僅供參考】

溫馨提示

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

評(píng)論

0/150

提交評(píng)論