版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
極兔java面試題
1.JDK和JRE有什么區(qū)別?
JDK:JavaDevelopmentKit的簡(jiǎn)稱,Java開(kāi)發(fā)工具包,提供了Java
的開(kāi)發(fā)環(huán)境和運(yùn)行環(huán)境。
JRE:JavaRuntimeEnvironment的簡(jiǎn)稱,Java運(yùn)行環(huán)境,為Java
的運(yùn)行提供了所需環(huán)境。
具體來(lái)說(shuō)JDK其實(shí)包含了JRE,同時(shí)還包含了編譯Java源碼的編
譯器Javac,還包含了很多Java程序調(diào)試和分析的工具。簡(jiǎn)單來(lái)說(shuō):
如果你需要運(yùn)行Java程序,只需安裝JRE就可以了,如果你需要
編寫(xiě)Java程序,需要安裝JDKo
2.==和equals的區(qū)別是什么?
r==解讀」
對(duì)于基本類型和引用類型==的作用效果是不同的,如下所示:
基本類型:比較的是值是否相同;
引用類型:比較的是引用是否相同;
Fequals解讀」
equals本質(zhì)上就是==,只不過(guò)String和Integer等重寫(xiě)了
equals方法,把它變成了值比較。
「總結(jié)」:==對(duì)于基本類型來(lái)說(shuō)是值比較,對(duì)于引用類型來(lái)說(shuō)是
比較的是引用;而equals默認(rèn)情況下是引用比較,只是很多類重新
了equals方法,比如String,Integer等把它變成了值比較,所
以一般情況下equals比較的是值是否相等。
3.兩個(gè)對(duì)象的hashCode()相同,則equals()也一定為true,對(duì)
嗎?
不對(duì),兩個(gè)對(duì)象的hashCode()相同,equals()不一定true。
很顯然“通話”和“重地”的hashCode()相同,然而equals()則
為false,因?yàn)樵谏⒘斜碇?,hashCode()相等即兩個(gè)鍵值對(duì)的哈希
值相等,然而哈希值相等,并不一定能得出鍵值對(duì)相等。
4.final在Java中有什么作用?
final修飾的類叫最終類,該類不能被繼承。
final修飾的方法不能被重寫(xiě)。
final修飾的變量叫常量,常量必須初始化,初始化之后值就不能被
修改。
5.Java中的Math,round(-1.5)等于多少?
等于-1,因?yàn)樵跀?shù)軸上取值時(shí),中間值(0.5)向右取整,所以正0.5
是往上取整,負(fù)0.5是直接舍棄。
6.String屬于基礎(chǔ)的數(shù)據(jù)類型嗎?
String不屬于基礎(chǔ)類型,基礎(chǔ)類型有8種:byte、boolean,char、
short、int>float,long、double,而String屬于對(duì)象。
7.Java中操作字符串都有哪些類?它們之間有什么區(qū)別?
操作字符串的類有:String,StringBuffer,StringBuilder□
String和StringBuffer,StringBuilder的區(qū)別在于String聲明
的是不可變的對(duì)象,每次操作都會(huì)生成新的String對(duì)象,然后將指
針指向新的String對(duì)象,而StringBuffer,StringBuilder可以
在原有對(duì)象的基礎(chǔ)上進(jìn)行操作,所以在經(jīng)常改變字符串內(nèi)容的情況下
最好不要使用Stringo
StringBuffer和StringBuilder最大的區(qū)別在于,StringBuffer
是線程安全的,而StringBuilder是非線程安全的,但
StringBuilder的性能卻高于StringBuffer,所以在單線程環(huán)境下
推薦使用StringBuilder,多線程環(huán)境下推薦使用StringBuffer。
8.Stringstr="i"與Stringstr=newString(ni")一樣嗎?
不一樣,因?yàn)閮?nèi)存的分配方式不一樣。Stringstr="i"的方式,Java
虛擬機(jī)會(huì)將其分配到常量池中;而Stringstr=newString(nin)則
會(huì)被分到堆內(nèi)存中。
9.如何將字符串反轉(zhuǎn)?
使用StringBuilder或者StringBuffer的reverse()方法。
10.String類的常用方法都有那些?
indexOfO:返回指定字符的索引。
charAt():返回指定索引處的字符。
replace():字符串替換。
trim():去除字符串兩端空白。
splitO:分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組。
getBytes():返回字符串的byte類型數(shù)組。
lengthO:返回字符串長(zhǎng)度。
toLowerCase():將字符串轉(zhuǎn)成小寫(xiě)字母。
toUpperCase():將字符串轉(zhuǎn)成大寫(xiě)字符。
substring():截取字符串。
equals():字符串比較。
11.抽象類必須要有抽象方法嗎?
不需要,抽象類不一定非要有抽象方法。
12.普通類和抽象類有哪些區(qū)別?
普通類不能包含抽象方法,抽象類可以包含抽象方法。
抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化。
13.抽象類能使用final修飾嗎?
不能,定義抽象類就是讓其他類繼承的,如果定義為final該類就
不能被繼承,這樣彼此就會(huì)產(chǎn)生矛盾,所以final不能修飾抽象類。
14.接口和抽象類有什么區(qū)別?
實(shí)現(xiàn):抽象類的子類使用extends來(lái)繼承;接口必須使用
implements來(lái)實(shí)現(xiàn)接口。
構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有。
實(shí)現(xiàn)數(shù)量:類可以實(shí)現(xiàn)很多個(gè)接口;但是只能繼承一個(gè)抽象類。
訪問(wèn)修飾符:接口中的方法默認(rèn)使用public修飾;抽象類中的方法
可以是任意訪問(wèn)修飾符。
15.Java中10流分為幾種?
按功能來(lái)分:輸入流(input)、輸出流(output)o
按類型來(lái)分:字節(jié)流和字符流。
字節(jié)流和字符流的區(qū)別是:字節(jié)流按8位傳輸以字節(jié)為單位輸入輸
出數(shù)據(jù),字符流按16位傳輸以字符為單位輸入輸出數(shù)據(jù)。
16.BIO、NIO、AIO有什么區(qū)別?
BIO:Block10同步阻塞式10,就是我們平常使用的傳統(tǒng)10,它的
特點(diǎn)是模式簡(jiǎn)單使用方便,并發(fā)處理能力低。
NIO:Non10同步非阻塞10,是傳統(tǒng)10的升級(jí),客戶端和服務(wù)器
端通過(guò)Channel(通道)通訊,實(shí)現(xiàn)了多路復(fù)用。
AIO:Asynchronous10是NI0的升級(jí),也叫NI02,實(shí)現(xiàn)了異步非
堵塞10,異步10的操作基于事件和回調(diào)機(jī)制。
17.Files的常用方法都有哪些?
Files,exists():檢測(cè)文件路徑是否存在。
Files.createFile():創(chuàng)建文件。
Files.createDirectory():創(chuàng)建文件夾。
Files,delete():刪除一個(gè)文件或目錄。
Files,copy():復(fù)制文件。
Files,move():移動(dòng)文件。
Files,size():查看文件個(gè)數(shù)。
Files,read():讀取文件。
Files,write():寫(xiě)入文件。
18.Collection和Collections有什么區(qū)別?
Collection是一個(gè)集合接口,它提供了對(duì)集合對(duì)象進(jìn)行基本操作的
通用接口方法,所有集合都是它的子類,比如List、Set等。
Collections是一個(gè)包裝類,包含了很多靜態(tài)方法,不能被實(shí)例化,
就像一個(gè)工具類,比如提供的排序方法:Collections.sort(list)o
19.List、Set、Map之間的區(qū)別是什么?
List、Set、Map的區(qū)別主要體現(xiàn)在兩個(gè)方面:元素是否有序、是否
允許元素重復(fù)。
20.HashMap和Hashtable有什么區(qū)別?
存儲(chǔ):HashMap運(yùn)行key和value為null,而Hashtable不允許。
線程安全:Hashtable是線程安全的,而HashMap是非線程安全的。
推薦使用:在Hashtable的類注釋可以看到,Hashtable是保留類
不建議使用,推薦在單線程環(huán)境下使用HashMap替代,如果需要多
線程使用則用ConcurrentHashMap替代。
21.如何決定使用HashMap還是TreeMap?
對(duì)于在Map中插入、刪除、定位一個(gè)元素這類操作,HashMap是最
好的選擇,因?yàn)橄鄬?duì)而言HashMap的插入會(huì)更快,但如果你要對(duì)一
個(gè)key集合進(jìn)行有序的遍歷,那TreeMap是更好的選擇。
22.說(shuō)一下HashMap的實(shí)現(xiàn)原理?
HashMap基于Hash算法實(shí)現(xiàn)的,我們通過(guò)put(key,value)存儲(chǔ),
get(key)來(lái)獲取。當(dāng)傳入key時(shí),HashMap會(huì)根據(jù)key.hashCode()
計(jì)算出hash值,根據(jù)hash值將value保存在bucket里。當(dāng)計(jì)
算出的hash值相同時(shí),我們稱之為hash沖突,HashMap的做法是
用鏈表和紅黑樹(shù)存儲(chǔ)相同hash值的value。當(dāng)hash沖突的個(gè)數(shù)比
較少時(shí),使用鏈表否則使用紅黑樹(shù)。
23.說(shuō)一下HashSet的實(shí)現(xiàn)原理?
HashSet是基于HashMap實(shí)現(xiàn)的,HashSet底層使用HashMap來(lái)保
存所有元素,因此HashSet的實(shí)現(xiàn)比較簡(jiǎn)單,相關(guān)HashSet的操作,
基本上都是直接調(diào)用底層HashMap的相關(guān)方法來(lái)完成,HashSet不
允許重復(fù)的值。
24.ArrayList和LinkedList的區(qū)別是什么?
數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn):ArrayList是動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),而
LinkedList是雙向鏈表的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。
隨機(jī)訪問(wèn)效率:ArrayList比LinkedList在隨機(jī)訪問(wèn)的時(shí)候效率要
高,因?yàn)長(zhǎng)inkedList是線性的數(shù)據(jù)存儲(chǔ)方式,所以需要移動(dòng)指針從
前往后依次查找。
增加和刪除效率:在非首尾的增加和刪除操作,LinkedList要比
ArrayList效率要高,因?yàn)锳rrayList增刪操作要影響數(shù)組內(nèi)的其
他數(shù)據(jù)的下標(biāo)。
綜合來(lái)說(shuō),在需要頻繁讀取集合中的元素時(shí),更推薦使用ArrayList,
而在插入和刪除操作較多時(shí),更推薦使用LinkedList。
25.如何實(shí)現(xiàn)數(shù)組和List之間的轉(zhuǎn)換?
數(shù)組轉(zhuǎn)List:使用Arrays.asList(array)進(jìn)行轉(zhuǎn)換。
List轉(zhuǎn)數(shù)組:使用List自帶的toArray()方法。
26.ArrayList和Vector的區(qū)別是什么?
線程安全:Vector使用了Synchronized來(lái)實(shí)現(xiàn)線程同步,是線程
安全的,而ArrayList是非線程安全的。
性能:ArrayList在性能方面要優(yōu)于Vector□
擴(kuò)容:ArrayList和Vector都會(huì)根據(jù)實(shí)際的需要?jiǎng)討B(tài)的調(diào)整容量,
只不過(guò)在Vector擴(kuò)容每次會(huì)增加1倍,而ArrayList只會(huì)增加
50%□
27.Array和ArrayList有何區(qū)別?
Array可以存儲(chǔ)基本數(shù)據(jù)類型和對(duì)象,ArrayList只能存儲(chǔ)對(duì)象。
Array是指定固定大小的,而ArrayList大小是自動(dòng)擴(kuò)展的。
Array內(nèi)置方法沒(méi)有ArrayList多,比如addAll、removeAll
iteration等方法只有ArrayList有。
28.在Queue中poll。和remove()有什么區(qū)別?
相同點(diǎn):都是返回第一個(gè)元素,并在隊(duì)列中刪除返回的對(duì)象。
不同點(diǎn):如果沒(méi)有元素poll()會(huì)返回null,而remove()會(huì)直接拋
出NoSuchElementException異常。
29.哪些集合類是線程安全的?
Vector、Hashtable>Stack都是線程安全的,而像HashMap則是非
線程安全的,不過(guò)在JDK1.5之后隨著Java.util,concurrent并
發(fā)包的出現(xiàn),它們也有了自己對(duì)應(yīng)的線程安全類,比如HashMap對(duì)
應(yīng)的線程安全類就是ConcurrentHashMapo
30.迭代器Iterator是什么?
Iterator接口提供遍歷任何Collection的接口。我們可以從一個(gè)
Collection中使用迭代器方法來(lái)獲取迭代器實(shí)例。迭代器取代了
Java集合框架中的Enumeration,迭代器允許調(diào)用者在迭代過(guò)程中
移除元素。
31.Iterator和Listiterator有什么區(qū)別?
Iterator可以遍歷Set和List集合,而Listiterator只能遍歷
Listo
Iterator只能單向遍歷,而Listiterator可以雙向遍歷(向前/
后遍歷)。
Listiterator從Iterator接口繼承,然后添加了一些額外的功能,
比如添加一個(gè)元素、替換一個(gè)元素、獲取前面或后面元素的索引位置。
32.怎么確保一個(gè)集合不能被修改?
可以使用Collections,unmodifiableCollection(Collectionc)
方法來(lái)創(chuàng)建一個(gè)只讀集合,這樣改變集合的任何操作都會(huì)拋出Java,
lang.UnsupportedOperationException異常。
33.并行和并發(fā)有什么區(qū)別?
并行:多個(gè)處理器或多核處理器同時(shí)處理多個(gè)任務(wù)。
并發(fā):多個(gè)任務(wù)在同一個(gè)CPU核上,按細(xì)分的時(shí)間片輪流(交替)執(zhí)
行,從邏輯上來(lái)看那些任務(wù)是同時(shí)執(zhí)行。
34.線程和進(jìn)程的區(qū)別?
一個(gè)程序下至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程下至少有一個(gè)線程,一個(gè)進(jìn)程
下也可以有多個(gè)線程來(lái)增加程序的執(zhí)行速度。
35.守護(hù)線程是什么?
守護(hù)線程是運(yùn)行在后臺(tái)的一種特殊進(jìn)程。它獨(dú)立于控制終端并且周期
性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。在Java中垃圾回收
線程就是特殊的守護(hù)線程。
36.創(chuàng)建線程有哪幾種方式?
創(chuàng)建線程有三種方式:
繼承Thread重寫(xiě)run方法;
實(shí)現(xiàn)Runnable接口;
實(shí)現(xiàn)Callable接口。
37.說(shuō)一下runnable和callable有什么區(qū)別?
runnable沒(méi)有返回值,callable可以拿到有返回值,callable可
以看作是runnable的補(bǔ)充。
38.線程有哪些狀態(tài)?
線程的狀態(tài):
NEW尚未啟動(dòng)
RUNNABLE正在執(zhí)行中
BLOCKED阻塞的(被同步鎖或者10鎖阻塞)
WAITING永久等待狀態(tài)
TIMED_WAITING等待指定的時(shí)間重新被喚醒的狀態(tài)
TERMINATED執(zhí)行完成
39.sleep()和wait()有什么區(qū)別?
類的不同:sleep()來(lái)自Thread,wait()來(lái)自O(shè)bject。
釋放鎖:sleep()不釋放鎖;wait()釋放鎖。
用法不同:sleep()時(shí)間到會(huì)自動(dòng)恢復(fù);wait()可以使用
notify()/notifyAll()直接喚醒。
40.notify。和notifyAH()有什么區(qū)別?
notifyAll()會(huì)喚醒所有的線程,notify()之后喚醒一個(gè)線程。
notifyAH()調(diào)用后,會(huì)將全部線程由等待池移到鎖池,然后參與鎖
的競(jìng)爭(zhēng),競(jìng)爭(zhēng)成功則繼續(xù)執(zhí)行,如果不成功則留在鎖池等待鎖被釋放
后再次參與競(jìng)爭(zhēng)。而notify()只會(huì)喚醒一個(gè)線程,具體喚醒哪一個(gè)
線程由虛擬機(jī)控制。
41.線程的run()和start()有什么區(qū)別?
start()方法用于啟動(dòng)線程,run()方法用于執(zhí)行線程的運(yùn)行時(shí)代碼。
run()可以重復(fù)調(diào)用,而start()只能調(diào)用一次。
42.線程池都有哪些狀態(tài)?
RUNNING:這是最正常的狀態(tài),接受新的任務(wù),處理等待隊(duì)列中的任
務(wù)。
SHUTDOWN:不接受新的任務(wù)提交,但是會(huì)繼續(xù)處理等待隊(duì)列中的任務(wù)。
STOP:不接受新的任務(wù)提交,不再處理等待隊(duì)列中的任務(wù),中斷正在
執(zhí)行任務(wù)的線程。
TIDYING:所有的任務(wù)都銷毀了,workCount為0,線程池的狀態(tài)在
轉(zhuǎn)換為T(mén)IDYING狀態(tài)時(shí),會(huì)執(zhí)行鉤子方法terminated()o
TERMINATED:terminated()方法結(jié)束后,線程池的狀態(tài)就會(huì)變成這個(gè)。
43.線程池中submit()和execute()方法有什么區(qū)別?
execute():只能執(zhí)行Runnable類型的任務(wù)。
submit():可以執(zhí)行Runnable和Callable類型的任務(wù)。
Callable類型的任務(wù)可以獲取執(zhí)行的返回值,而Runnable執(zhí)行無(wú)
返回值。
44.在Java程序中怎么保證多線程的運(yùn)行安全?
方法一:使用安全類,比如Java.util,concurrent下的類。
方法二:使用自動(dòng)鎖synchronizedo
方法三:使用手動(dòng)鎖Lock。
45.多線程中synchronized鎖升級(jí)的原理是什么?
synchronized鎖升級(jí)原理:在鎖對(duì)象的對(duì)象頭里面有一個(gè)threadid
字段,在第一次訪問(wèn)的時(shí)候threadid為空,jvm讓其持有偏向鎖,
并將threadid設(shè)置為其線程id,再次進(jìn)入的時(shí)候會(huì)先判斷
threadid是否與其線程id一致,如果一致則可以直接使用此對(duì)象,
如果不一致,則升級(jí)偏向鎖為輕量級(jí)鎖,通過(guò)自旋循環(huán)一定次數(shù)來(lái)獲
取鎖,執(zhí)行一定次數(shù)之后,如果還沒(méi)有正常獲取到要使用的對(duì)象,此
時(shí)就會(huì)把鎖從輕量級(jí)升級(jí)為重量級(jí)鎖,此過(guò)程就構(gòu)成了
synchronized鎖的升級(jí)。
鎖的升級(jí)的目的:鎖升級(jí)是為了減低了鎖帶來(lái)的性能消耗。在Java6
之后優(yōu)化synchronized的實(shí)現(xiàn)方式,使用了偏向鎖升級(jí)為輕量級(jí)鎖
再升級(jí)到重量級(jí)鎖的方式,從而減低了鎖帶來(lái)的性能消耗。
46.什么是死鎖?
當(dāng)線程A持有獨(dú)占鎖a,并嘗試去獲取獨(dú)占鎖b的同時(shí),線程B持
有獨(dú)占鎖b,并嘗試獲取獨(dú)占鎖a的情況下,就會(huì)發(fā)生AB兩個(gè)線
程由于互相持有對(duì)方需要的鎖,而發(fā)生的阻塞現(xiàn)象,我們稱為死鎖。
47.怎么防止死鎖?
盡量使用tryLock(longtimeout,TimeUnitunit)的方法
(ReentrantLock、ReentrantReadWriteLock),設(shè)置超時(shí)時(shí)間,超時(shí)
可以退出防止死鎖。
盡量使用Java.util,concurrent并發(fā)類代替自己手寫(xiě)鎖。
盡量降低鎖的使用粒度,盡量不要幾個(gè)功能用同一把鎖。
盡量減少同步的代碼塊。
48.ThreadLocal是什么?有哪些使用場(chǎng)景?
ThreadLocal為每個(gè)使用該變量的線程提供獨(dú)立的變量副本,所以每
一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)影響其它線程所對(duì)應(yīng)
的副本。
ThreadLocal的經(jīng)典使用場(chǎng)景是數(shù)據(jù)庫(kù)連接和session管理等。
49.說(shuō)一下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è)無(wú)差別的重量級(jí)操作,性能也很低。
但在Java6的時(shí)候,Java虛擬機(jī)對(duì)此進(jìn)行了大刀闊斧地改進(jìn),提
供了三種不同的monitor實(shí)現(xiàn),也就是常說(shuō)的三種不同的鎖:偏向
鎖(BiasedLocking),輕量級(jí)鎖和重量級(jí)鎖,大大改進(jìn)了其性能。
50.synchronized和volatile的區(qū)別是什么?
volatile是變量修飾符;synchronized是修飾類、方法、代碼段。
volatile僅能實(shí)現(xiàn)變量的修改可見(jiàn)性,不能保證原子性;而
synchronized則可以保證變量的修改可見(jiàn)性和原子性。
volatile不會(huì)造成線程的阻塞;synchronized可能會(huì)造成線程的阻
塞。
51.synchronized和Lock有什么區(qū)別?
synchronized可以給類、方法、代碼塊加鎖;而lock只能給代碼
塊加鎖。
synchronized不需要手動(dòng)獲取鎖和釋放鎖,使用簡(jiǎn)單,發(fā)生異常會(huì)
自動(dòng)釋放鎖,不會(huì)造成死鎖;而lock需要自己加鎖和釋放鎖,如果
使用不當(dāng)沒(méi)有unLock()去釋放鎖就會(huì)造成死鎖。
通過(guò)Lock可以知道有沒(méi)有成功獲取鎖,而synchronized卻無(wú)法辦
到。
52.synchronized和ReentrantLock區(qū)別是什么?
synchronized早期的實(shí)現(xiàn)比較低效,對(duì)比ReentrantLock,大多數(shù)
場(chǎng)景性能都相差較大,但是在Java6中對(duì)synchronized進(jìn)行了非
常多的改進(jìn)。
主要區(qū)別如下:
ReentrantLock使用起來(lái)比較靈活,但是必須有釋放鎖的配合動(dòng)作;
ReentrantLock必須手動(dòng)獲取與釋放鎖,而synchronized不需要手
動(dòng)釋放和開(kāi)啟鎖;
ReentrantLock只適用于代碼塊鎖,而synchronized可用于修飾方
法、代碼塊等。
53.說(shuō)一下atomic的原理?
atomic主要利用CAS(CompareAndWwap)和volatile和native
方法來(lái)保證原子操作,從而避免synchronized的高開(kāi)銷,執(zhí)行效率
大為提升。
54.什么是反射?
反射是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬
性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;
這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為Java語(yǔ)
言的反射機(jī)制。
55.什么是Java序列化?什么情況下需要序列化?
Java序列化是為了保存各種對(duì)象在內(nèi)存中的狀態(tài),并且可以把保存
的對(duì)象狀態(tài)再讀出來(lái)。
以下情況需要使用Java序列化:
想把的內(nèi)存中的對(duì)象狀態(tài)保存到一個(gè)文件中或者數(shù)據(jù)庫(kù)中時(shí)候;
想用套接字在網(wǎng)絡(luò)上傳送對(duì)象的時(shí)候;
想通過(guò)RMI(遠(yuǎn)程方法調(diào)用)傳輸對(duì)象的時(shí)候。
56.動(dòng)態(tài)代理是什么?有哪些應(yīng)用?
動(dòng)態(tài)代理是運(yùn)行時(shí)動(dòng)態(tài)生成代理類。
動(dòng)態(tài)代理的應(yīng)用有springaop、hibernate數(shù)據(jù)查詢、測(cè)試框架的
后端mock、rpc,Java注解對(duì)象獲取等。
57.怎么實(shí)現(xiàn)動(dòng)態(tài)代理?
JDK原生動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理。JDK原生動(dòng)態(tài)代理是基于接
口實(shí)現(xiàn)的,而cglib是基于繼承當(dāng)前類的子類實(shí)現(xiàn)的。
58.為什么要使用克???
克隆的對(duì)象可能包含一些已經(jīng)修改過(guò)的屬性,而new出來(lái)的對(duì)象的
屬性都還是初始化時(shí)候的值,所以當(dāng)需要一個(gè)新的對(duì)象來(lái)保存當(dāng)前對(duì)
象的“狀態(tài)”就靠克隆方法了
59.如何實(shí)現(xiàn)對(duì)象克隆?
實(shí)現(xiàn)Cloneable接口并重寫(xiě)Object類中的clone()方法。
實(shí)現(xiàn)Serializable接口,通過(guò)對(duì)象的序列化和反序列化實(shí)現(xiàn)克隆,
可以實(shí)現(xiàn)真正的深度克隆。
60.深拷貝和淺拷貝區(qū)別是什么?
淺克?。寒?dāng)對(duì)象被復(fù)制時(shí)只復(fù)制它本身和其中包含的值類型的成員變
量,而引用類型的成員對(duì)象并沒(méi)有復(fù)制。
深克?。撼藢?duì)象本身被復(fù)制外,對(duì)象所包含的所有成員變量也將復(fù)
制。
61.JSP和servlet有什么區(qū)別?
JSP是servlet技術(shù)的擴(kuò)展,本質(zhì)上就是servlet的簡(jiǎn)易方式。
servlet和JSP最主要的不同點(diǎn)在于,servlet的應(yīng)用邏輯是在
Java文件中,并且完全從表示層中的html里分離開(kāi)來(lái),而JSP的
情況是Java和html可以組合成一個(gè)擴(kuò)展名為JSP的文件。JSP
側(cè)重于視圖,servlet主要用于控制邏輯。
62.JSP有哪些內(nèi)置對(duì)象?作用分別是什么?
JSP有9大內(nèi)置對(duì)象:
request:封裝客戶端的請(qǐng)求,其中包含來(lái)自get或post請(qǐng)求的參
數(shù);
response:封裝服務(wù)器對(duì)客戶端的響應(yīng);
pageContext:通過(guò)該對(duì)象可以獲取其他對(duì)象;
session:封裝用戶會(huì)話的對(duì)象;
application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象;
out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象;
config:Web應(yīng)用的配置對(duì)象;
page:JSP頁(yè)面本身(相當(dāng)于Java程序中的this);
exception:封裝頁(yè)面拋出異常的對(duì)象。
63.說(shuō)一下JSP的4種作用域?
page:代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。
request:代表與客戶端發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)
求可能跨越多個(gè)頁(yè)面,涉及多個(gè)Web組件;需要在頁(yè)面顯示的臨時(shí)
數(shù)據(jù)可以置于此作用域。
session:代表與某個(gè)用戶與服務(wù)器建立的一次會(huì)話相關(guān)的對(duì)象和屬
性。跟某個(gè)用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中。
application:代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性,它實(shí)質(zhì)
上是跨越整個(gè)Web應(yīng)用程序,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話的一個(gè)全
局作用域。
64.session和cookie有什么區(qū)別?
存儲(chǔ)位置不同:session存儲(chǔ)在服務(wù)器端;cookie存儲(chǔ)在瀏覽器端。
安全性不同:cookie安全性一般,在瀏覽器存儲(chǔ),可以被偽造和修
改。
容量和個(gè)數(shù)限制:cookie有容量限制,每個(gè)站點(diǎn)下的cookie也有
個(gè)數(shù)限制。
存儲(chǔ)的多樣性:session可以存儲(chǔ)在Redis中、數(shù)據(jù)庫(kù)中、應(yīng)用程
序中;而cookie只能存儲(chǔ)在瀏覽器中。
65.說(shuō)一下session的工作原理?
session的工作原理是客戶端登錄完成之后,服務(wù)器會(huì)創(chuàng)建對(duì)應(yīng)的
session,session創(chuàng)建完之后,會(huì)把session的id發(fā)送給客戶端,
客戶端再存儲(chǔ)到瀏覽器中。這樣客戶端每次訪問(wèn)服務(wù)器時(shí),都會(huì)帶著
sessionid,服務(wù)器拿到sessionid之后,在內(nèi)存找到與之對(duì)應(yīng)的
session這樣就可以正常工作了。
66.如果客戶端禁止cookie能實(shí)現(xiàn)session還能用嗎?
可以用,session只是依賴cookie存儲(chǔ)sessionid,如果cookie
被禁用了,可以使用url中添加sessionid的方式保證session
能正常使用。
67.springmvc和struts的區(qū)別是什么?
攔截級(jí)別:struts2是類級(jí)別的攔截;springmvc是方法級(jí)別的攔
截。
數(shù)據(jù)獨(dú)立性:springmvc的方法之間基本上獨(dú)立的,獨(dú)享request
和response數(shù)據(jù),請(qǐng)求數(shù)據(jù)通過(guò)參數(shù)獲取,處理結(jié)果通過(guò)ModelMap
交回給框架,方法之間不共享變量;而struts2雖然方法之間也是
獨(dú)立的,但其所有action變量是共享的,這不會(huì)影響程序運(yùn)行,卻
給我們編碼和讀程序時(shí)帶來(lái)了一定的麻煩。
攔截機(jī)制:struts2有以自己的interceptor機(jī)制,springmvc用
的是獨(dú)立的aop方式,這樣導(dǎo)致struts2的配置文件量比spring
mvc大。
對(duì)ajax的支持:springmvc集成了ajax,所有ajax使用很方便,
只需要一個(gè)注解@ResponseBody就可以實(shí)現(xiàn)了;而struts2一般需
要安裝插件或者自己寫(xiě)代碼才行。
68.如何避免SQL注入?
使用預(yù)處理PreparedStatemento
使用正則表達(dá)式過(guò)濾掉字符中的特殊字符。
69.什么是XSS攻擊,如何避免?
XSS攻擊:即跨站腳本攻擊,它是Web程序中常見(jiàn)的漏洞。原理是
攻擊者往Web頁(yè)面里插入惡意的腳本代碼(css代碼、Javascript
代碼等),當(dāng)用戶瀏覽該頁(yè)面時(shí),嵌入其中的腳本代碼會(huì)被執(zhí)行,從
而達(dá)到惡意攻擊用戶的目的,如盜取用戶cookie、破壞頁(yè)面結(jié)構(gòu)、
重定向到其他網(wǎng)站等。
預(yù)防XSS的核心是必須對(duì)輸入的數(shù)據(jù)做過(guò)濾處理。
70.什么是CSRF攻擊,如何避免?
CSRF:Cross-SiteRequestForgery(中文:跨站請(qǐng)求偽造),可以
理解為攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求,比如:以
你名義發(fā)送郵件、發(fā)消息、購(gòu)買(mǎi)商品,虛擬貨幣轉(zhuǎn)賬等。
防御手段:
驗(yàn)證請(qǐng)求來(lái)源地址;
關(guān)鍵操作添加驗(yàn)證碼;
在請(qǐng)求地址添加token并驗(yàn)證。
71.throw和throws的區(qū)別?
throw:是真實(shí)拋出一個(gè)異常。
throws:是聲明可能會(huì)拋出一個(gè)異常。
72.final、finally,finalize有什么區(qū)別?
final:是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和
變量,則表示此方法和此變量不能在被改變,只能使用。
finally:是try{}catch{}finally{}最后一部分,表示不論發(fā)生
任何情況都會(huì)執(zhí)行,finally部分可以省略,但如果finally部分
存在,則一定會(huì)執(zhí)行finally里面的代碼。
finalize:是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)
用被回收對(duì)象的此方法。
73.try-catch-finally中哪個(gè)部分可以省略?
try-catch-finally其中catch和finally都可以被省略,但是不
能同時(shí)省略,也就是說(shuō)有try的時(shí)候,必須后面跟一個(gè)catch或者
finally。
74.try-catch-finally中,如果catch中return了,finally還
會(huì)執(zhí)行嗎?
finally一定會(huì)執(zhí)行,即使是catch中return了,catch中的
return會(huì)等f(wàn)inally中的代碼執(zhí)行完之后,才會(huì)執(zhí)行。
75.常見(jiàn)的異常類有哪些?
NullPointerException空指針異常
ClassNotFoundException指定類不存在
NumberFormatException字符串轉(zhuǎn)換為數(shù)字異常
IndexOutOfBoundsException數(shù)組下標(biāo)越界異常
ClassCastException數(shù)據(jù)類型轉(zhuǎn)換異常
FileNotFoundException文件未找到異常
NoSuchMethodException方法不存在異常
lOException10異常
SocketExceptionSocket異常
76.響應(yīng)碼301和302代表的是什么?有什么區(qū)別?
301:永久重定向。
302:暫時(shí)重定向。
它們的區(qū)別是,301對(duì)搜索引擎優(yōu)化(SE0)更加有利;302有被提
示為網(wǎng)絡(luò)攔截的風(fēng)險(xiǎn)。
77.forward和redirect的區(qū)別?
forward是轉(zhuǎn)發(fā)和redirect是重定向:
地址欄url顯示:fowardurl不會(huì)發(fā)生改變,redirecturl會(huì)發(fā)
生改變;
數(shù)據(jù)共享:forward可以共享request里的數(shù)據(jù),redirect不能共
享;
效率:forward比redirect效率高。
78.簡(jiǎn)述tcp和udp的區(qū)別?
tcp和udp是0SI模型中的運(yùn)輸層中的協(xié)議。tcp提供可靠的通信
傳輸,而udp則常被用于讓廣播和細(xì)節(jié)控制交給應(yīng)用的通信傳輸。
兩者的區(qū)別大致如下:
tcp面向連接,udp面向非連接即發(fā)送數(shù)據(jù)前不需要建立鏈接;
tcp提供可靠的服務(wù)(數(shù)據(jù)傳輸),udp無(wú)法保證;
tcp面向字節(jié)流,udp面向報(bào)文;
tcp數(shù)據(jù)傳輸慢,udp數(shù)據(jù)傳輸快;
79.tcp為什么要三次握手,兩次不行嗎?為什么?
如果采用兩次握手,那么只要服務(wù)器發(fā)出確認(rèn)數(shù)據(jù)包就會(huì)建立連接,
但由于客戶端此時(shí)并未響應(yīng)服務(wù)器端的請(qǐng)求,那此時(shí)服務(wù)器端就會(huì)一
直在等待客戶端,這樣服務(wù)器端就白白浪費(fèi)了一定的資源。若采用三
次握手,服務(wù)器端沒(méi)有收到來(lái)自客戶端的再此確認(rèn),則就會(huì)知道客戶
端并沒(méi)有要求建立請(qǐng)求,就不會(huì)浪費(fèi)服務(wù)器的資源。
80.說(shuō)一下tcp粘包是怎么產(chǎn)生的?
tcp粘包可能發(fā)生在發(fā)送端或者接收端,分別來(lái)看兩端各種產(chǎn)生粘包
的原因:
發(fā)送端粘包:發(fā)送端需要等緩沖區(qū)滿才發(fā)送出去,造成粘包;
接收方粘包:接收方不及時(shí)接收緩沖區(qū)的包,造成多個(gè)包接收。
81.OSI的七層模型都有哪些?
物理層:利用傳輸介質(zhì)為數(shù)據(jù)鏈路層提供物理連接,實(shí)現(xiàn)比特流的透
明傳輸。
數(shù)據(jù)鏈路層:負(fù)責(zé)建立和管理節(jié)點(diǎn)間的鏈路。
網(wǎng)絡(luò)層:通過(guò)路由選擇算法,為報(bào)文或分組通過(guò)通信子網(wǎng)選擇最適當(dāng)
的路徑。
傳輸層:向用戶提供可靠的端到端的差錯(cuò)和流量控制,保證報(bào)文的正
確傳輸。
會(huì)話層:向兩個(gè)實(shí)體的表示層提供建立和使用連接的方法。
表示層:處理用戶信息的表示問(wèn)題,如編碼、數(shù)據(jù)格式轉(zhuǎn)換和加密解
密等。
應(yīng)用層:直接向用戶提供服務(wù),完成用戶希望在網(wǎng)絡(luò)上完成的各種工
作。
82.get和post請(qǐng)求有哪些區(qū)別?
get請(qǐng)求會(huì)被瀏覽器主動(dòng)緩存,而post不會(huì)。
get傳遞參數(shù)有大小限制,而post沒(méi)有。
post參數(shù)傳輸更安全,get的參數(shù)會(huì)明文限制在url上,post不
會(huì)。
83.如何實(shí)現(xiàn)跨域?
實(shí)現(xiàn)跨域有以下幾種方案:
服務(wù)器端運(yùn)行跨域設(shè)置C0RS等于*;
在單個(gè)接口使用注解@CrossOrigin運(yùn)行跨域;
使用jsonp跨域;
84.說(shuō)一下JS0NP實(shí)現(xiàn)原理?
jsonp:JSONwithPadding,它是利用script標(biāo)簽的src連接可以
訪問(wèn)不同源的特性,加載遠(yuǎn)程返回的“JS函數(shù)”來(lái)執(zhí)行的。
85.說(shuō)一下你熟悉的設(shè)計(jì)模式?
單例模式:保證被創(chuàng)建一次,節(jié)省系統(tǒng)開(kāi)銷。
工廠模式(簡(jiǎn)單工廠、抽象工廠):解耦代碼。
觀察者模式:定義了對(duì)象之間的一對(duì)多的依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)
象改變時(shí),它的所有的依賴者都會(huì)收到通知并自動(dòng)更新。
外觀模式:提供一個(gè)統(tǒng)一的接口,用來(lái)訪問(wèn)子系統(tǒng)中的一群接口,外
觀定義了一個(gè)高層的接口,讓子系統(tǒng)更容易使用。
模版方法模式:定義了一個(gè)算法的骨架,而將一些步驟延遲到子類中,
模版方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的
步驟。
狀態(tài)模式:允許對(duì)象在內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)好
像修改了它的類。
86.簡(jiǎn)單工廠和抽象工廠有什么區(qū)別?
簡(jiǎn)單工廠:用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品,對(duì)于增加新的產(chǎn)品,
無(wú)能為力。
工廠方法:用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定產(chǎn)品,支持增加任意產(chǎn)品。
抽象工廠:用來(lái)生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品,對(duì)于增加新的產(chǎn)品,無(wú)
能為力;支持增加產(chǎn)品族。
87.為什么要使用spring?
spring提供ioc技術(shù),容器會(huì)幫你管理依賴的對(duì)象,從而不需要自
己創(chuàng)建和管理依賴對(duì)象了,更輕松的實(shí)現(xiàn)了程序的解耦。
spring提供了事務(wù)支持,使得事務(wù)操作變的更加方便。
spring提供了面向切片編程,這樣可以更方便的處理某一類的問(wèn)題。
更方便的框架集成,spring可以很方便的集成其他框架,比如
MyBatis、hibernate等。
88.解釋一下什么是aop?
aop是面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功
能的統(tǒng)一維護(hù)的一種技術(shù)。
簡(jiǎn)單來(lái)說(shuō)就是統(tǒng)一處理某一“切面”(類)的問(wèn)題的編程思想,比如
統(tǒng)一處理日志、異常等。
89.解釋一下什么是ioc?
ioc:InversionofControl(中文:控制反轉(zhuǎn))是spring的核心,
對(duì)于spring框架來(lái)說(shuō),就是由spring來(lái)負(fù)責(zé)控制對(duì)象的生命周期
和對(duì)象間的關(guān)系。
簡(jiǎn)單來(lái)說(shuō),控制指的是當(dāng)前對(duì)象對(duì)內(nèi)部成員的控制權(quán);控制反轉(zhuǎn)指的
是,這種控制權(quán)不由當(dāng)前對(duì)象管理了,由其他(類,第三方容器)來(lái)
管理。
90.spring有哪些主要模塊?
springcore:框架的最基礎(chǔ)部分,提供ioc和依賴注入特性。
springcontext:構(gòu)建于core封裝包基礎(chǔ)上的context封裝包,
提供了一種框架式的對(duì)象訪問(wèn)方法。
springdao:DataAccessObject提供了JDBC的抽象層。
springaop:提供了面向切面的編程實(shí)現(xiàn),讓你可以自定義攔截器、
切點(diǎn)等。
springWeb:提供了針對(duì)Web開(kāi)發(fā)的集成特性,例如文件上傳,利
用servletlisteners進(jìn)行ioc容器初始化和針對(duì)Web的
ApplicationContext0
springWebmvc:spring中的mvc封裝包提供了Web應(yīng)用的
Model-View-Controller(MVC)的實(shí)現(xiàn)。
91.spring常用的注入方式有哪些?
setter屬性注入
構(gòu)造方法注入
注解方式注入
92.spring中的bean是線程安全的嗎?
spring中的bean默認(rèn)是單例模式,spring框架并沒(méi)有對(duì)單例
bean進(jìn)行多線程的封裝處理。
實(shí)際上大部分時(shí)候springbean無(wú)狀態(tài)的(比如dao類),所有某
種程度上來(lái)說(shuō)bean也是安全的,但如果bean有狀態(tài)的話(比如
viewmodel對(duì)象),那就要開(kāi)發(fā)者自己去保證線程安全了,最簡(jiǎn)單
的就是改變bean的作用域,把“singleton"變更為"prototype”,
這樣請(qǐng)求bean相當(dāng)于newBean()T,所以就可以保證線程安全了。
有狀態(tài)就是有數(shù)據(jù)存儲(chǔ)功能。
無(wú)狀態(tài)就是不會(huì)保存數(shù)據(jù)。
93.spring支持幾種bean的作用域?
spring支持5種作用域,如下:
singleton:springioc容器中只存在一個(gè)bean實(shí)例,bean以單
例模式存在,是系統(tǒng)默認(rèn)值;
prototype:每次從容器調(diào)用bean時(shí)都會(huì)創(chuàng)建一個(gè)新的示例,既每
次getBean()相當(dāng)于執(zhí)行newBean()操作;
Web環(huán)境下的作用域:
request:每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)bean;
session:同一個(gè)session共享一個(gè)bean實(shí)例;
global-session:用于portlet容器,因?yàn)槊總€(gè)portlet有單獨(dú)的
session,globalsession提供一個(gè)全局性的session。
「注意:」使用prototype作用域需要慎重的思考,因?yàn)轭l繁創(chuàng)建
和銷毀bean會(huì)帶來(lái)很大的性能開(kāi)銷。
94.spring自動(dòng)裝配bean有哪些方式?
no:默認(rèn)值,表示沒(méi)有自動(dòng)裝配,應(yīng)使用顯式bean引用進(jìn)行裝配。
byName:它根據(jù)bean的名稱注入對(duì)象依賴項(xiàng)。
byType:它根據(jù)類型注入對(duì)象依賴項(xiàng)。
構(gòu)造函數(shù):通過(guò)構(gòu)造函數(shù)來(lái)注入依賴項(xiàng),需要設(shè)置大量的參數(shù)。
autodetect:容器首先通過(guò)構(gòu)造函數(shù)使用autowire裝配,如果不能,
則通過(guò)byType自動(dòng)裝配。
95.spring事務(wù)實(shí)現(xiàn)方式有哪些?
聲明式事務(wù):聲明式事務(wù)也有兩種實(shí)現(xiàn)方式,基于xml配置文件的
方式和注解方式(在類上添加?Transaction注解)。
編碼方式:提供編碼的形式管理和維護(hù)事務(wù)。
96.說(shuō)一下spring的事務(wù)隔離?
spring有五大隔離級(jí)別,默認(rèn)值為ISOLATION_DEFAULT(使用數(shù)據(jù)
庫(kù)的設(shè)置),其他四個(gè)隔離級(jí)別和數(shù)據(jù)庫(kù)的隔離級(jí)別一致:
ISOLATION_DEFAULT:用底層數(shù)據(jù)庫(kù)的設(shè)置隔離級(jí)別,數(shù)據(jù)庫(kù)設(shè)置的
是什么我就用什么;
ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級(jí)別、事務(wù)未提交
前,就可被其他事務(wù)讀?。〞?huì)出現(xiàn)幻讀、臟讀、不可重復(fù)讀);
ISOLATIONREADCOMMITTED:提交讀,一個(gè)事務(wù)提交后才能被其他事務(wù)
讀取到(會(huì)造成幻讀、不可重復(fù)讀),SQLserver的默認(rèn)級(jí)別;
ISOLATIONREPEATABLEREAD:可重復(fù)讀,保證多次讀取同一個(gè)數(shù)據(jù)時(shí),
其值都和事務(wù)開(kāi)始時(shí)候的內(nèi)容是一致,禁止讀取到別的事務(wù)未提交的
數(shù)據(jù)(會(huì)造成幻讀),MySQL的默認(rèn)級(jí)別;
ISOLATION_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)生了幻覺(jué)。發(fā)生幻讀的原因也是另
外一個(gè)事務(wù)新增或者刪除或者修改了第一個(gè)事務(wù)結(jié)果集里面的數(shù)據(jù),
同一個(gè)記錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少
To
97.說(shuō)一下springmvc運(yùn)行流程?
springmvc先將請(qǐng)求發(fā)送給DispatcherServleto
DispatcherServlet查詢一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)
求的Controllero
DispatcherServlet再把請(qǐng)求提交到對(duì)應(yīng)的Controllero
Controller進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndView。
Dispathcher查詢一個(gè)或多個(gè)ViewResolver視圖解析器,找到
ModelAndView對(duì)象指定的視圖對(duì)象。
視圖對(duì)象負(fù)責(zé)渲染返回給客戶端。
98.springmvc有哪些組件?
前置控制器DispatcherServleto
映射控制器Hand1erMappingo
處理器Controllero
模型和視圖ModelAndVieWo
視圖解析器ViewResolvero
99.@RequestMapping的作用是什么?
將請(qǐng)求映射到相應(yīng)的類/方法上。
100.@Autowired的作用是什么?
@Autowired它可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成
自動(dòng)裝配的工作,通過(guò)@Autowired的使用來(lái)消除set/get方法。
SpringBoot/SpringCloud
101.什么是springboot?
springboot是為spring服務(wù)的,是用來(lái)簡(jiǎn)化新spring應(yīng)用的初
始搭建以及開(kāi)發(fā)過(guò)程的。
102.為什么要用springboot?
配置簡(jiǎn)單
獨(dú)立運(yùn)行
自動(dòng)裝配
無(wú)代碼生成和xml配置
提供應(yīng)用監(jiān)控
易上手
提升開(kāi)發(fā)效率
103.springboot核心配置文件是什么?
springboot核心的兩個(gè)配置文件:
bootstrap(.yml或者.properties):boostrap由父
App1icationContext加載的,比applicaton優(yōu)先加載,且
boostrap里面的屬性不能被覆蓋;
application(.yml或者.properties):用于springboot項(xiàng)目
的自動(dòng)化配置。
104.springboot有哪些方式可以實(shí)現(xiàn)熱部署?
使用devtools啟動(dòng)熱部署,添加devtools庫(kù),在配置文件中把
spring,devtools.restart,enabled設(shè)置為true;
使用IntellijIdea編輯器,勾上自動(dòng)編譯或手動(dòng)重新編譯。
105.jpa和hibernate有什么區(qū)別?
jpa全稱JavaPersistenceAPI,是Java持久化接口規(guī)范,
hibernate屬于jpa的具體實(shí)現(xiàn)。
106.什么是springcloud?
springcloud是一系列框架的有序集合。它利用springboot的開(kāi)
發(fā)便利性巧妙地簡(jiǎn)化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開(kāi)發(fā),如服務(wù)發(fā)現(xiàn)注冊(cè)、
配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用
springboot的開(kāi)發(fā)風(fēng)格做到一鍵啟動(dòng)和部署。
107.springcloud斷路器的作用是什么?
在分布式架構(gòu)中,斷路器模式的作用也是類似的,當(dāng)某個(gè)服務(wù)單元發(fā)
生故障(類似用電器發(fā)生短路)之后,通過(guò)斷路器的故障監(jiān)控(類似
熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)錯(cuò)誤響應(yīng),而不是長(zhǎng)時(shí)間的等待。
這樣就不會(huì)使得線程因調(diào)用故障服務(wù)被長(zhǎng)時(shí)間占用不釋放,避免了故
障在分布式系統(tǒng)中的蔓延。
108.springcloud的核心組件有哪些?
Eureka:服務(wù)注冊(cè)于發(fā)現(xiàn)。
Feign:基于動(dòng)態(tài)代理機(jī)制,根據(jù)注解和選擇的機(jī)器,拼接請(qǐng)求url地
址,發(fā)起請(qǐng)求。
Ribbon:實(shí)現(xiàn)負(fù)載均衡,從一個(gè)服務(wù)的多臺(tái)機(jī)器中選擇一臺(tái)。
Hystrix:提供線程池,不同的服務(wù)走不同的線程池,實(shí)現(xiàn)了不同服
務(wù)調(diào)用的隔離,避免了服務(wù)雪崩的問(wèn)題。
Zuul:網(wǎng)關(guān)管理,由Zuul網(wǎng)關(guān)轉(zhuǎn)發(fā)請(qǐng)求給對(duì)應(yīng)的服務(wù)。
Hibernate
109.為什么要使用hibernate?
hibernate是對(duì)jdbc的封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層的繁瑣的重復(fù)
性代碼。
hibernate是一個(gè)優(yōu)秀的0RM實(shí)現(xiàn),很多程度上簡(jiǎn)化了DA0層的編
碼功能。
可以很方便的進(jìn)行數(shù)據(jù)庫(kù)的移植工作。
提供了緩存機(jī)制,是程序執(zhí)行更改的高效。
110.什么是ORM框架?
ORM(ObjectRelationMapping)對(duì)象關(guān)系映射,是把數(shù)據(jù)庫(kù)中的關(guān)
系數(shù)據(jù)映射成為程序中的對(duì)象。
使用0RM的優(yōu)點(diǎn):提高了開(kāi)發(fā)效率降低了開(kāi)發(fā)成本、開(kāi)發(fā)更簡(jiǎn)單更
對(duì)象化、可移植更強(qiáng)。
111.hibernate中如何在控制臺(tái)查看打印的SQL語(yǔ)句?
在Config里面把hibernate.show_SQL設(shè)置為true就可以。但
不建議開(kāi)啟,開(kāi)啟之后會(huì)降低程序的運(yùn)行效率。
112.hibernate有幾種查詢方式?
三種:hql、原生SQL、條件查詢Criteriao
113.hibernate實(shí)體類可以被定義為final嗎?
實(shí)體類可以定義為final類,但這樣的話就不能使用hibernate代
理模式下的延遲關(guān)聯(lián)提供性能了,所以不建議定義實(shí)體類為finale
114.在hibernate中使用Integer和int做映射有什么區(qū)別?
Integer類型為對(duì)象,它的值允許為null,而int屬于基礎(chǔ)數(shù)據(jù)類
型,值不能為nulE
115.hibernate是如何工作的?
讀取并解析配置文件。
讀取并解析映射文件,創(chuàng)建SessionFactoryo
打開(kāi)Sessiono
創(chuàng)建事務(wù)。
進(jìn)行持久化操作。
提交事務(wù)。
關(guān)閉Sessiono
關(guān)閉SessionFactoryo
116.get()和load()的區(qū)別?
數(shù)據(jù)查詢時(shí),沒(méi)有0ID指定的對(duì)象,get()返回null;load()返
回一個(gè)代理對(duì)象。
load。支持延遲加載;get()不支持延遲加載。
117.說(shuō)一下hibernate的緩存機(jī)制?
hibernate常用的緩存有一級(jí)緩存和二級(jí)緩存:
一級(jí)緩存:也叫Session緩存,只在Session作用范圍內(nèi)有效,不
需要用戶干涉,由hibernate自身維護(hù),可以通過(guò):evict(object)
清除object的緩存;clear。清除一級(jí)緩存中的所有緩存;flush。
刷出緩存;
二級(jí)緩存:應(yīng)用級(jí)別的緩存,在所有Session中都有效,支持配置
第三方的緩存,如:EhCache。
118.hibernate對(duì)象有哪些狀態(tài)?
臨時(shí)/瞬時(shí)狀態(tài):直接new出來(lái)的對(duì)象,該對(duì)象還沒(méi)被持久化(沒(méi)保
存在數(shù)據(jù)庫(kù)中),不受Session管理。
持久化狀態(tài):當(dāng)調(diào)用Session的
save/saveOrupdate/get/load/list等方法的時(shí)候,對(duì)象就是持久化
狀態(tài)。
游離狀態(tài):Session關(guān)閉之后對(duì)象就是游離狀態(tài)。
119.在hibernate中g(shù)etCurrentSession和openSession的區(qū)
別是什么?
getCurrentSession會(huì)綁定當(dāng)前線程,而openSession則不會(huì)。
getCurrentSession事務(wù)是Spring控制的,并且不需要手動(dòng)關(guān)閉,
而openSession需要我們自己手動(dòng)開(kāi)啟和提交事務(wù)。
120.hibernate實(shí)體類必須要有無(wú)參構(gòu)造函數(shù)嗎?為什么?
hibernate中每個(gè)實(shí)體類必須提供一個(gè)無(wú)參構(gòu)造函數(shù),因?yàn)?/p>
hibernate框架要使用reflectionapi,通過(guò)調(diào)用
Classnewlnstance()來(lái)創(chuàng)建實(shí)體類的實(shí)例,如果沒(méi)有無(wú)參的構(gòu)造函
數(shù)就會(huì)拋出異常。
121.MyBatis中#{}和${}的區(qū)別是什么?
#{}是預(yù)編譯處理,${}是字符替換。在使用#{}時(shí),MyBatis會(huì)將SQL
中的#{}替換成"?",配合PreparedStatement的set方法賦值,
這樣可以有效的防止SQL注入,保證程序的運(yùn)行安全。
122.MyBatis有幾種分頁(yè)方式?
分頁(yè)方式:邏輯分頁(yè)和物理分頁(yè)。
「邏輯分頁(yè):」使用MyBatis自帶的RowBounds進(jìn)行分頁(yè),它是
一次性查詢很多數(shù)據(jù),然后在數(shù)據(jù)中再進(jìn)行檢索。
「物理分頁(yè):」自己手寫(xiě)SQL分頁(yè)或使用分頁(yè)插件PageHelper,
去數(shù)據(jù)庫(kù)查詢指定條數(shù)的分頁(yè)數(shù)據(jù)的形式。
123.RowBounds是一次性查詢?nèi)拷Y(jié)果嗎?為什么?
RowBounds表面是在“所有”數(shù)據(jù)中檢索數(shù)據(jù),其實(shí)并非是一次性查
詢出所有數(shù)據(jù),因?yàn)镸yBatis是對(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ī)取10000元,但取款機(jī)每次
最多能取2500元,所以你要取4次才能把錢(qián)取完。只是對(duì)于jdbc
來(lái)說(shuō),當(dāng)你調(diào)用next。的時(shí)候會(huì)自動(dòng)幫你完成查詢工作
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 批量購(gòu)車(chē)協(xié)議模板
- 架子工勞務(wù)分包合同
- 房屋買(mǎi)賣(mài)合同范本官方版
- 分期付款購(gòu)房的流程及條件
- 公共衛(wèi)生潔具招標(biāo)采購(gòu)指南
- 改過(guò)自新我承諾不再勒索
- 定金協(xié)議合同范例分析
- 專項(xiàng)法律咨詢
- 實(shí)驗(yàn)室大型設(shè)備采購(gòu)合同
- 油漆工程施工合同書(shū)
- 校園安全教育(完美版)ppt
- 電纜槽橋架安裝檢查記錄
- 游戲王統(tǒng)一規(guī)則
- 小學(xué)語(yǔ)文人教一年級(jí)上冊(cè)(統(tǒng)編)-富全學(xué)校語(yǔ)文教案丁代英
- 水庫(kù)建設(shè)項(xiàng)目施工組織設(shè)計(jì)
- 系統(tǒng)集成類項(xiàng)目施工組織計(jì)劃方案
- 國(guó)家開(kāi)放大學(xué)實(shí)驗(yàn)學(xué)院生活中的法律第三單元測(cè)驗(yàn)答案
- 詩(shī)朗誦社團(tuán)活動(dòng)記錄
- 第3章 細(xì)胞命運(yùn)的決定(章節(jié)課程)
- 《積極心理學(xué)》課程教學(xué)大綱.docx
- 2014年吉林省長(zhǎng)春市中考模擬數(shù)學(xué)
評(píng)論
0/150
提交評(píng)論