版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java崗位面試前準(zhǔn)備與面試題集錦
感謝您參加我們的面試:
以下是我們總結(jié)一些面試前準(zhǔn)備和技術(shù)參考題,希望對你有所幫助。
首先,你需要先準(zhǔn)備下工作相關(guān)的自我介紹,包括以下內(nèi)容:
1.幾年Java開發(fā)經(jīng)驗(yàn),大概概括下做過什么類型的項(xiàng)目,分別多久經(jīng)驗(yàn)(如互聯(lián)網(wǎng)金融,
互聯(lián)網(wǎng)電商,傳統(tǒng)后臺等)
2.選擇1?2個近期關(guān)鍵項(xiàng)目具體介紹;
?主要擔(dān)任什么崗位,工作內(nèi)容是什么,也可以簡單介紹下團(tuán)隊(duì)人員組成,你在其中是屬于
什么角色(如架構(gòu)搭建,核心代碼編寫,主要做接口開發(fā)等。。。)
?項(xiàng)目的技術(shù)是什么(請具體到開發(fā)環(huán)境,框架,開發(fā)工具,數(shù)據(jù)庫等),如有一些比較
創(chuàng)新的技術(shù)可以具體說明
?項(xiàng)目成果怎么樣(是否上線,用戶使用效果如何等)
?個人技術(shù)總結(jié)/自己成就突出(如你們怎么處理技術(shù)難題;你自己有什么建設(shè)性意見改進(jìn)
項(xiàng)目;項(xiàng)目技術(shù)是否有不足,你覺得要是你會怎么去做)
其次,你需要看下您的簡歷,把你簡歷里面寫的技術(shù)點(diǎn)(尤其寫了精通,熟悉的)再過一下。
?很多時候技術(shù)面試官會根據(jù)你簡歷里面寫的技術(shù)點(diǎn),有淺到深地提問。
最后,以下是我們給你提供的一些Java基礎(chǔ)技術(shù)參考題,沒有答案,需要你自己去準(zhǔn)備哦?
祝面試成功,加油!
?數(shù)據(jù)庫相關(guān):求平均成績大于60分的學(xué)生名字和他們個人的平均分。
?值傳遞與引用傳遞的區(qū)別;
?重載和重寫的區(qū)別
?spring框架的IOC,AOP個人的理解
?strutsstruts2springmvc框架底層實(shí)現(xiàn)和他們的區(qū)別;
?hibernate框架的一級緩存和二級緩存
?java類加載器是什么,http協(xié)議
?java的內(nèi)存機(jī)制
?java的數(shù)據(jù)結(jié)構(gòu)
?redis基本數(shù)據(jù)類型
?spring事務(wù)的傳播機(jī)制
?bean的作用
?用過什么設(shè)計(jì)模式
?單例模式多例的區(qū)別
?什么是工廠模式,工廠模式都有哪幾種,什么情況下用
?java的反射機(jī)制是什么
?什么是動態(tài)代理
?http的7層實(shí)現(xiàn)(或者叫3次握手是什么)
?防止sql注入用哪幾種方式
?高并發(fā)如何處理
?什么是同步鎖
?什么是樂觀鎖
?什么是悲觀鎖
?sql如何優(yōu)化;sql的執(zhí)行方式是什么樣的;如何知道sql是怎么執(zhí)行的?
?spring的配置文件
?數(shù)據(jù)交互的加密方式
?內(nèi)存分配
1.說出數(shù)據(jù)連接池的工作機(jī)制是什么?
J2EE服務(wù)器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻舳顺绦?/p>
需要連接時,池驅(qū)動程序會返回一個未使用的池連接并將其表記為忙。如果當(dāng)前沒有空閑連接,
池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成
后,池驅(qū)動程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個連接。
實(shí)現(xiàn)方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真
正關(guān)連接,而是把它代理的Connection對象還回到連接池中。
2.接口和抽象類的區(qū)別是什么?
Java提供和支持創(chuàng)建抽象類和接口。它們的實(shí)現(xiàn)有共同點(diǎn),不同點(diǎn)在于:
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實(shí)現(xiàn)很多個接口,但是只能繼承一個抽象類
類如果要實(shí)現(xiàn)一個接口,它必須要實(shí)現(xiàn)接口聲明的所有方法。但是,類可以不實(shí)現(xiàn)
抽象類聲明的所有方法,當(dāng)然,在這種情況下,類也必須得聲明成是抽象的。
抽象類可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。
Java接口中聲明的變量默認(rèn)都是final的。抽象類可以包含非final的變量。口
Java接口中的成員函數(shù)默認(rèn)是public的。抽象類的成員函數(shù)可以是private,
protected或者是public。
接口是絕對抽象的,不可以被實(shí)例化。抽象類也不可以被實(shí)例化,但是,如果它包
含main方法的話是可以被調(diào)用的。
3.概括的解釋下線程的幾種可用狀態(tài)?
線程在執(zhí)行過程中,可以處于下面幾種狀態(tài):
?就緒(Runnable):線程準(zhǔn)備運(yùn)行,不一定立馬就能開始執(zhí)行。
?運(yùn)行中(Running):進(jìn)程正在執(zhí)行線程的代碼。
?等待中(Waging):線程處于阻塞的狀態(tài),等待外部的處理結(jié)束。
?睡眠中(Sleeping):線程被強(qiáng)制睡眠。
?I/O阻塞(BlockedonI/O):等待I/O操作完成。
?同步阻塞(BlockedonSynchronization):等待獲取鎖。
?死亡(Dead):線程完成了執(zhí)行。
4.HashMap和Hashtable有什么區(qū)別?
HashMap和Hashtable都實(shí)現(xiàn)了Map接口,因此很多特性非常相似。但是,他們
有以下不同點(diǎn):
?HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
?Hashtable是同步的,而HashMap不是。因此,HashMap更適合于單線程環(huán)境,
?而Hashtable適合于多線程環(huán)境。
?HashMap提供了可供應(yīng)用迭代的鍵的集合,因此,HashMap是快速失敗的。另一
?方面'Hashtable提供了對鍵的歹U舉(Enumeration)。
?一般認(rèn)為Hashtable是一個遺留的類
5.jsp九大內(nèi)置對象?
□application□page□request□response□session□exception□out□config□
pageContext
Java面試題集錦
Java基礎(chǔ)
1.JDK和JRE有什么區(qū)別?
?JDK:JavaDevelopmentKit的簡稱,Java開發(fā)工具包,提供了
Java的開發(fā)環(huán)境和運(yùn)行環(huán)境。
?JRE:JavaRuntimeEnvironment的簡稱,Java運(yùn)行環(huán)境,為
Java的運(yùn)行提供了所需環(huán)境。
具體來說JDK其實(shí)包含了JRE,同時還包含了編譯Java源碼的編譯器
Javac,還包含了很多Java程序調(diào)試和分析的工具。簡單來說:如果你需
要運(yùn)行Java程序,只需安裝JRE就可以了,如果你需要編寫Java程序,
需要安裝JDK。
2.二二和equals的區(qū)別是什么?
==解讀
對于基本類型和引用類型==的作用效果是不同的,如下所示:
?基本類型:比較的是值是否相同;
?引用類型:比較的是引用是否相同;
代碼示例:
Stirlingx="string";
Stringy="string";
Stringz=newStn'八g("string");
SgsteiM.out.p力八七伍//true
System.out.prmt(r1(x==z);〃false
SgstenA.out.pnivt/八(x.equals(g));//true
Sgstek.out.p力八,伍(x.equals(z));//true
代碼解讀:因?yàn)閄和y指向的是同一個引用,所以==也是true,而
newString。方法則重寫開辟了內(nèi)存空間,所以==結(jié)果為false,而
equals比較的一直是值,所以結(jié)果都為true。
equals解讀
equals本質(zhì)上就是==,只不過String和Integer等重寫了equals方
法,把它變成了值比較??聪旅娴拇a就明白了。
首先來看默認(rèn)情況下equals比較一個有相同值的對象,代碼如下:
classCat{
publicCat(Stringname){
this.八nn/ve=八4HAC;
1
privateString八a/e;
publicStringgetName(){
return
)
publicvoidsetName(Stringname){
this.rvame=
)
)
CatcX=new王磊)
Catc2-=newC〃始王磊");
System.outprmt^fcX.equalsfc^.));//false
輸出結(jié)果出乎我們的意料,竟然是false?這是怎么回事,看了equals
源碼就知道了,源碼如下:
publicbooleanequals(Objectobj){
return(this==obj);
原來equals本質(zhì)上就是==o
那問題來了,兩個相同值的String對象,為什么返回的是true?代碼如
下:
StringsX=newString。老王”);
Strings2=newString("老王)
Sgste3.otxt.pn認(rèn)廿八(sLeq〃ak(s2));//true
同樣的,當(dāng)我們進(jìn)入String的equals方法,找到了答案,代碼如下:
publicbooleanequals(ObjectanObject){
if(this==a^Objcct){
returntrue;
)
if(anObject泗tMeeofString){
String〃八。協(xié)erSt力八g=(StH八g)a八Ogect;
int八=value.
if(八==〃八otkeKStnhg.value./ehgtk){
charvl?口=value;
charv2口=aiaotherStriiag.value;
inti=0;
while(八一!=0){
if/=v2[i])
returnfalse;
if
)
returntrue;
)
)
returnfalse;
1
原來是String重寫了Object的equals方法,把引用比較改成了值比
較。
總結(jié):==對于基本類型來說是值比較,對于引用類型來說是比較的是引
用;而equals默認(rèn)情況下是引用比較,只是很多類重新了equals方法,
比如String,Integer等把它變成了值比較,所以一般情況下equals比
較的是值是否相等。
3.兩個對象的hashCode()相同,則equals()也一定為true,
對嗎?
不對,兩個對象的hashCode()相同,equals()不一定true。
代碼示例:
Stringstrl="通話";
Strings%2="重地”;
System,out.pniat/ia(String.form^tf'strl:%d|str2:%d\strl.ha^CodeQ^tr
2.koskCodcO));
System.out.4八乜八⑼丫工.4k⑼匕2));
執(zhí)行的結(jié)果:
stri:1179395|str2.:1179395
false
代碼解讀:很顯然"通話"和"重地"的hashCodeO相同,然而
equals()則為false,因?yàn)樵谏⒘斜碇校琱ashCodeQ相等即兩個鍵值對
的哈希值相等,然而哈希值相等,并不一定能得出鍵值對相等。
4.final在Java中有什么作用?
?final修飾的類叫最終類,該類不能被繼承。
?final修飾的方法不能被重寫。
?final修飾的變量叫常量,常量必須初始化,初始化之后值就不能被
修改。
5.Java中的Math.round(-1.5)等于多少?
等于-1,因?yàn)樵跀?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屬于對象。
7.Java中操作字符串都有哪些類?它們之間有什么區(qū)別?
操作字符串的類有:
String.StringBuffer.StringBuildero
String和StringBuffer、StringBuilder的區(qū)別在于String聲明的是不
可變的對象,每次操作都會生成新的String對象,然后將指針指向新的
String對象,而StringBuffer、StringBuilder可以在原有對象的基礎(chǔ)
上進(jìn)行操作,所以在經(jīng)常改變字符串內(nèi)容的情況下最好不要使用String。
StringBuffer和StringBuilder最大的區(qū)別在于,StringBuffer是線程
安全的,而StringBuilder是非線程安全的,但StringBuilder的性能
卻高于StringBuffer,所以在單線程環(huán)境下推薦使用StringBuilder,多
線程環(huán)境下推薦使用StringBuffer。
8.Stringstr="i"與Stringstr=newString("i")一樣嗎?
不一樣,因?yàn)閮?nèi)存的分配方式不一樣。Stringstr="i"的方式,Java虛擬
機(jī)會將其分配到常量池中;而Stringstr=newStringC'i")則會被分到堆
內(nèi)存中。
9.如何將字符串反轉(zhuǎn)?
使用StringBuilder或者stringBuffer的reverse()方法。
示例代碼:
//StringBufferreverse
Stri八=newSfri八gBuffer。;
允力八gBcxffcc叫平ehd(”abcdefg");
System.outp力八土仇(st/八gB〃ffccrwerseO);//gfedcba
//StringBuilderreverse
StringBuildersWMgBbiilder=newString13uilder();
stHngBb(i(4cc叩pe八d("abcdefg");
System.outpriiatl^(stri^gI3uilder.rev^rseQ);//gfedcba
10.String類的常用方法都有那些?
?indexOf():返回指定字符的索引。
?charAt():返回指定索引處的字符。
?replace():字符串替換。
?trim():去除字符串兩端空白。
?split():分割字符串,返回一個分割后的字符串?dāng)?shù)組。
?getBytes():返回字符串的byte類型數(shù)組。
?length():返回字符串長度。
?toLowerCase():將字符串轉(zhuǎn)成小寫字母。
?toUpperCase。:將字符串轉(zhuǎn)成大寫字符。
?substringO:截取字符串。
?equals():字符串比較。
11.抽象類必須要有抽象方法嗎?
不需要,抽象類不一定非要有抽象方法。
示例代碼:
abstractclassCat{
publicstaticvoidsayHi(){
System,outpn'八七伉
)
上面代碼,抽象類并沒有抽象方法但完全可以正常運(yùn)行。
12.普通類和抽象類有哪些區(qū)別?
?普通類不能包含抽象方法,抽象類可以包含抽象方法。
?抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化。
13.抽象類能使用final修飾嗎?
不能,定義抽象類就是讓其他類繼承的,如果定義為final該類就不能被
繼承,這樣彼此就會產(chǎn)生矛盾,所以final不能修飾抽象類,如下圖所示,
編輯器也會提示錯誤信息:
14.接口和抽象類有什么區(qū)別?
?實(shí)現(xiàn):抽象類的子類使用extends來繼承;接口必須使用
implements來實(shí)現(xiàn)接口。
?構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有。
?實(shí)現(xiàn)數(shù)量:類可以實(shí)現(xiàn)很多個接口;但是只能繼承一個抽象類。
.訪問修飾符:接口中的方法默認(rèn)使用public修飾;抽象類中的方法
可以是任意訪問修飾符。
15.Java中10流分為幾種?
按功能來分:輸入流(input)、輸出流(output)o
按類型來分:字節(jié)流和字符流。
字節(jié)流和字符流的區(qū)別是:字節(jié)流按8位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù),
字符流按16位傳輸以字符為單位輸入輸出數(shù)據(jù)。
16.BI0、NIO、AI0有什么區(qū)別?
?BIO:BlockI0同步阻塞式I。,就是我們平常使用的傳統(tǒng)I0,它
的特點(diǎn)是模式簡單使用方便,并發(fā)處理能力低。
?NIO:NonI0同步非阻塞I。,是傳統(tǒng)I。的升級,客戶端和服務(wù)
器端通過Channel(通道)通訊,實(shí)現(xiàn)了多路復(fù)用。
?AIO:AsynchronousI0是NI0的升級,也叫NI02,實(shí)現(xiàn)了異
步非堵塞I0,異步I0的操作基于事件和回調(diào)機(jī)制。
17.Files的常用方法都有哪些?
?Files,exists。:檢測文件路徑是否存在。
?Files.createFile():創(chuàng)建文件。
?Files.createDirectoryO:創(chuàng)建文件夾。
?Files.delete():刪除一個文件或目錄。
?Files.copy():復(fù)制文件。
?Files.move():移動文件。
?Files.size。:杳看文件個數(shù)。
?Files.read():讀取文件。
?Files.write():寫入文件。
02:容器
容器
18.Java容器都有哪些?
Java容器分為Collection和Map兩大類,其下又有很多子類,如下所
示:
?Collection
?List
?ArrayList
?LinkedList
?Vector
?Stack
?Set
?HashSet
?LinkedHashSet
?TreeSet
?Map
?HashMap
?LinkedHashMap
?TreeMap
?ConcurrentHashMap
?Hashtable
19.Collection和Collections有什么區(qū)別?
?Collection是一個集合接口,它提供了對集合對象進(jìn)行基本操作的
通用接口方法,所有集合都是它的子類,比如List、Set等。
?Collections是一個包裝類,包含了很多靜態(tài)方法,不能被實(shí)例化,
就像一個工具類,比如提供的排序方法:
Collections.sort(list)o
20.List、Set.Map之間的區(qū)別是什么?
List、Set、Map的區(qū)別主要體現(xiàn)在兩個方面:元素是否有序、是否允許
元素重復(fù)。
三者之間的區(qū)別,如下表:
元素有序允許元素重復(fù)
List是是
AbstractSet
否
SetHashSet否
TreeSet是(用二叉樹排序〉
MapAbstractMapKey值必須惟一,
否
HashMap
TreeMap是(用二叉樹排序)
21.HashMap和Hashtable有什么區(qū)別?
?存儲:HashMap運(yùn)行key和value為null,而Hashtable不允
許。
?線程安全:Hashtable是線程安全的,而HashMap是非線程安全
的。
?推薦使用:在Hashtable的類注釋可以看到,Hashtable是保留類
不建議使用,推薦在單線程環(huán)境下使用HashMap替代,如果需要
多線程使用則用ConcurrentHashMap替代。
22.如何決定使用HashMap還是TreeMap?
對于在Map中插入、刪除、定位一個元素這類操作,HashMap是最好
的選擇,因?yàn)橄鄬Χ訦ashMap的插入會更快,但如果你要對一個key
集合進(jìn)行有序的遍歷,那TreeMap是更好的選擇。
23.說一下HashM叩的實(shí)現(xiàn)原理?
HashMap基于Hash算法實(shí)現(xiàn)的,我們通過put(key,value)存儲,
get(key)來獲取。當(dāng)傳入key時,HashMap會根據(jù)key.hashCode()
計(jì)算出hash值,根據(jù)hash值將value保存在bucket里。當(dāng)計(jì)算出的
hash值相同時,我們稱之為hash沖突,HashMap的做法是用鏈表和
紅黑樹存儲相同hash值的value。當(dāng)hash沖突的個數(shù)比較少時,使用
鏈表否則使用紅黑樹。
24.說一下HashSet的實(shí)現(xiàn)原理?
HashSet是基于HashMap實(shí)現(xiàn)的,HashSet底層使用HashM叩來
保存所有元素,因此HashSet的實(shí)現(xiàn)比較簡單,相關(guān)HashSet的操作,
基本上都是直接調(diào)用底層HashMap的相關(guān)方法來完成,HashSet不允
許重復(fù)的值。
25.ArrayList和LinkedList的區(qū)別是什么?
?數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn):ArrayList是動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),而
LinkedList是雙向鏈表的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。
?隨機(jī)訪問效率:ArrayList比LinkedList在隨機(jī)訪問的時候效率要
高,因?yàn)長inkedList是線性的數(shù)據(jù)存儲方式,所以需要移動指針從
前往后依次查找。
?增加和刪除效率:在非首尾的增加和刪除操作,LinkedList要比
ArrayList效率要高,因?yàn)锳rrayList增刪操作要影響數(shù)組內(nèi)的其他
數(shù)據(jù)的下標(biāo)。
綜合來說,在需要頻繁讀取集合中的元素時,更推薦使用ArrayList,而
在插入和刪除操作較多時,更推薦使用LinkedList。
26.如何實(shí)現(xiàn)數(shù)組和List之間的轉(zhuǎn)換?
?數(shù)組轉(zhuǎn)List:使用Arrays.asList(array)進(jìn)行轉(zhuǎn)換。
?List轉(zhuǎn)數(shù)組:使用List自帶的toArrayO方法。
代碼示例:
//listtoarray
List<Strm^>list=newArrayList<Stri>0>
listadd。王磊)
list的博客)
listtoArrayO;
〃arraytolist
SWMg口array=newString口{”王磊,”的博客?
Arrays.asList(array);
27.ArrayList和Vector的區(qū)別是什么?
?線程安全:Vector使用了Synchronized來實(shí)現(xiàn)線程同步,是線程
安全的,而ArrayList是非線程安全的。
?性能:ArrayList在性能方面要優(yōu)于Vector。
?擴(kuò)容:ArrayList和Vector都會根據(jù)實(shí)際的需要動態(tài)的調(diào)整容量,
只不過在Vector擴(kuò)容每次會增加1倍,而ArrayList只會增加
50%。
28.Array和ArrayList有何區(qū)別?
?Array可以存儲基本數(shù)據(jù)類型和對象,ArrayList只能存儲對象。
?Array是指定固定大小的,而ArrayList大小是自動擴(kuò)展的。
?Array內(nèi)置方法沒有ArrayList多,比如addAlLremoveAlL
iteration等方法只有ArrayList有。
29.在Queue中poll。和remove。有什么區(qū)別?
?相同點(diǎn):都是返回第一個元素,并在隊(duì)列中刪除返回的對象。
?不同點(diǎn):如果沒有元素poll。會返回null,而remove。會直接拋出
NoSuchElemeritException異常。
代碼示例:
八g>queue=newLi八kedList<StrMg〉。;
queue.offer。string”);//add
System.out.pn認(rèn)土伉(queue.pollQ);
System.out.田Mqueue.%HAOMC。);
SystenA.out.由八t%queue.size。);
30.哪些集合類是線程安全的?
Vector.Hashtable.Stack都是線程安全的,而像HashMap則是非
線程安全的,不過在JDK1.5之后隨著Java.util.concurrent并發(fā)包
的出現(xiàn),它們也有了自己對應(yīng)的線程安全類,比如HashMap對應(yīng)的線程
安全類就是
ConcurrentHashMapo
31.迭代器Iterator是什么?
Iterator接口提供遍歷任何Collection的接口。我們可以從一個
Collection中使用迭代器方法來獲取迭代器實(shí)例。迭代器取代了Java集
合框架中的Enumeration,迭代器允許調(diào)用者在迭代過程中移除元素。
32.Iterator怎么使用?有什么特點(diǎn)?
Iterator使用代碼如下:
Ust<String>list=newArrayListoQ;
lterator<String>it=list.iterator0;
whilef/t.
Stringobj=it.八ext。;
System.out.pn?八方伍(o句);
)
Iterator的特點(diǎn)是更加安全,因?yàn)樗梢源_保,在當(dāng)前遍歷的集合元素被
更改的時候,就會拋出ConcurrentModificationException異常。
33.Iterator和Listiterator有什么區(qū)別?
?Iterator可以遍歷Set和List集合,而Listiterator只能遍歷List。
?Iterator只能單向遍歷,而Listiterator可以雙向遍歷(向前/后遍
歷)。
?Listiterator從Iterator接口繼承,然后添加了一些額外的功能,
比如添加一個元素、替換一個元素、獲取前面或后面元素的索引位置。
34.怎么確保一個集合不能被修改?
可以使用Collections,unmodifiableCollection(Collectionc)方法來
創(chuàng)建一個只讀集合,這樣改變集合的任何操作都會拋出Java.lang.
UnsupportedOperationException異常。
示例代碼如下:
LiskSt力八g〉list=newArrayL/stoQ;
listadd(nxn);
Co(lectioi^<Stirii^g>clist=Collection.〃八出。力'行。"八(list);
clist.add(nyy〃運(yùn)行時此行報錯
System.out.size。);
03:多線程
多線程
35.并行和并發(fā)有什么區(qū)別?
?并行:多個處理器或多核處理器同時處理多個任務(wù)。
?并發(fā):多個任務(wù)在同一個CPU核上,按細(xì)分的時間片輪流(交替)執(zhí)
行,從邏輯上來看那些任務(wù)是同時執(zhí)行。
如下圖:
Concur「〃盤=QsaUbAS。2”。人,、
6
RaMUI=--("UJOQ(3oU
蟲/我>昌
。。*?aa???Q
火次次大頭m大去去大
0A**^^A*y233
并發(fā)二兩個隊(duì)列和一臺咖啡機(jī)。
并行=兩個隊(duì)列和兩臺咖啡機(jī)。
36.線程和進(jìn)程的區(qū)別?
一個程序下至少有一個進(jìn)程,一個進(jìn)程下至少有一個線程,一個進(jìn)程下也
可以有多個線程來增加程序的執(zhí)行速度。
37.守護(hù)線程是什么?
守護(hù)線程是運(yùn)行在后臺的一種特殊進(jìn)程。它獨(dú)立于控制終端并且周期性地
執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。在Java中垃圾回收線程就是
特殊的守護(hù)線程。
38.創(chuàng)建線程有哪幾種方式?
創(chuàng)建線程有三種方式:
?繼承Thread重寫run方法;
?實(shí)現(xiàn)Runnable接口;
?實(shí)現(xiàn)Callable接口。
39.說一下runnable和callable有什么區(qū)別?
runnable沒有返回值,callable可以拿到有返回值,callable可以看作
是runnable的補(bǔ)充。
40.線程有哪些狀態(tài)?
線程的狀態(tài):
?NEW尚未啟動
?RUNNABLE正在執(zhí)彳亍中
?BLOCKED阻塞的(被同步鎖或者10鎖阻塞)
?WAITING永久等待狀態(tài)
?TIMEDWAITING等待指定的時間重新被喚醒的狀態(tài)
?TERMINATED執(zhí)行完成
41.sleep()和wait()有什么區(qū)別?
?類的不同:sleep。來自Thread,wait。來自O(shè)bject。
?釋放鎖:sleep。不釋放鎖;wait。釋放鎖。
?用法不同:sleep()時間到會自動恢復(fù);wait()可以使用
notify()/notifyAII()直接喚醒。
42.notify。和notifyAII。有什么區(qū)另(J?
notifyAIIO會喚醒所有的線程,notify。之后喚醒一個線程。notifyAII()
調(diào)用后,會將全部線程由等待池移到鎖池,然后參與鎖的競爭,競爭成功
則繼續(xù)執(zhí)行,如果不成功則留在鎖池等待鎖被釋放后再次參與競爭。而
notify。只會喚醒一個線程,具體喚醒哪一個線程由虛擬機(jī)控制。
43.線程的run()和start()有什么區(qū)別?
start()方法用于啟動線程,run()方法用于執(zhí)行線程的運(yùn)行時代碼。run()
可以重復(fù)調(diào)用,而start。只能調(diào)用一次。
44.創(chuàng)建線程池有哪幾種方式?
線程池創(chuàng)建有七種方式,最核心的是最后一種:
?newSingleThreadExecutor():它的特點(diǎn)在于工作線程數(shù)目被限制
為1,操作一個無界的工作隊(duì)列,所以它保證了所有任務(wù)的都是被順
序執(zhí)行,最多會有一個任務(wù)處于活動狀態(tài),并且不允許使用者改動線
程池實(shí)例,因此可以避免其改變線程數(shù)目;
?newCachedThreadPool():它是一種用來處理大量短時間工作任務(wù)
的線程池,具有幾個鮮明特點(diǎn):它會試圖緩存線程并重用,當(dāng)無緩存
線程可用時,就會創(chuàng)建新的工作線程;如果線程閑置的時間超過60
秒,則被終止并移出緩存;長時間閑置時,這種線程池,不會消耗什
么資源。其內(nèi)部使用SynchronousQueue作為工作隊(duì)歹U;
?newFixedThreadPool(intnThreads):重用指定數(shù)目(nThreads)
的線程,其背后使用的是無界的工作隊(duì)列,任何時候最多有
nThreads個工作線程是活動的。這意味著,如果任務(wù)數(shù)量超過了活
動隊(duì)列數(shù)目,將在工作隊(duì)列中等待空閑線程出現(xiàn);如果有工作線程退
出,將會有新的工作線程被創(chuàng)建,以補(bǔ)足指定的數(shù)目nThreads;
?newSingleThreadScheduledExecutor():創(chuàng)建單線程池,返回
ScheduledExecutorService,可以進(jìn)行定時或周期性的工作調(diào)度;
?newScheduledThreadPool(intcorePoolSize):和
newSingleThreadScheduledExecutor()類似,創(chuàng)建的是個
ScheduledExecutorService,可以進(jìn)行定時或周期性的工作調(diào)度,
區(qū)別在于單一工作線程還是多個工作線程;
?newWorkStealingPool(intparallelism):這是一個經(jīng)常被人忽略
的線程池,Java8才加入這個創(chuàng)建方法,其內(nèi)部會構(gòu)建
ForkJoinPool,利用Work-Stealing算法,并行地處理任務(wù),不
保證處理順序;
?ThreadPoolExecutor():是最原始的線程池創(chuàng)建,上面1-3創(chuàng)建方
式都是對ThreadPoolExecutor的封裝。
45.線程池都有哪些狀態(tài)?
?RUNNING:這是最正常的狀態(tài),接受新的任務(wù),處理等待隊(duì)列中的
任務(wù)。
?SHUTDOWN:不接受新的任務(wù)提交,但是會繼續(xù)處理等待隊(duì)列中的
任務(wù)。
?STOP:不接受新的任務(wù)提交,不再處理等待隊(duì)列中的任務(wù),中斷正
在執(zhí)行任務(wù)的線程。
?TIDYING:所有的任務(wù)都銷毀了,workCount為0,線程池的狀態(tài)
在轉(zhuǎn)換為TIDYING狀態(tài)時,會執(zhí)行鉤子方法terminated。。
?TERMINATED:terminated。方法結(jié)束后,線程池的狀態(tài)就會變成
這個。
46.線程池中submit()和execute()方法有什么區(qū)別?
?execute():只能執(zhí)行Runnable類型的任務(wù)。
?submit():可以執(zhí)行Runnable和Callable類型的任務(wù)。
Callable類型的任務(wù)可以獲取執(zhí)行的返回值,而Runnable執(zhí)行無返回
值。
47.在Java程序中怎么保證多線程的運(yùn)行安全?
?方法一:使用安全類,比如Java.util,concurrent下的類。
?方法二:使用自動鎖synchronized.,
?方法三:使用手動鎖Lock。
手動鎖Java示例代碼如下:
Locklock=newRee八
lock.lockQ;
try{
System,outprint伍("獲得鎖)
}catch(Exceptione){
〃TODO:handleexception
}finally{
System.out.p%八七伉("釋放鎖”);
lock.ui^lockQ;
)
48.多線程中synchronized鎖升級的原理是什么?
synchronized鎖升級原理:在鎖對象的對象頭里面有一個threadid字
段,在第一次訪問的時候threadid為空,jvm讓其持有偏向鎖,并將
threadid設(shè)置為其線程id,再次進(jìn)入的時候會先判斷threadid是否與
其線程id一致,如果一致則可以直接使用此對象,如果不一致,則升級
偏向鎖為輕量級鎖,通過自旋循環(huán)一定次數(shù)來獲取鎖,執(zhí)行一定次數(shù)之后,
如果還沒有正常獲取到要使用的對象,此時就會把鎖從輕量級升級為重量
級鎖,此過程就構(gòu)成了synchronized鎖的升級。
鎖的升級的目的:鎖升級是為了減低了鎖帶來的性能消耗。在Java6之
后優(yōu)化synchronized的實(shí)現(xiàn)方式,使用了偏向鎖升級為輕量級鎖再升級
到重量級鎖的方式,從而減低了鎖帶來的性能消耗。
49.什么是死鎖?
當(dāng)線程A持有獨(dú)占鎖a,并嘗試去獲取獨(dú)占鎖b的同時,線程B持有獨(dú)
占鎖b,并嘗試獲取獨(dú)占鎖a的情況下,就會發(fā)生AB兩個線程由于互相
持有對方需要的鎖,而發(fā)生的阻塞現(xiàn)象,我們稱為死鎖。
50.怎么防止死鎖?
?盡量使用tryLock(longtimeout,Timellnitunit)的方法
(ReentrantLock,ReentrantReadWriteLock),設(shè)置超時時間,
超時可以退出防止死鎖。
?盡量使用Java.util,concurrent并發(fā)類代替自己手寫鎖。
?盡量降低鎖的使用粒度,盡量不要幾個功能用同一把鎖。
?盡量減少同步的代碼塊。
51.ThreadLocal是什么?有哪些使用場景?
ThreadLocal為每個使用該變量的線程提供獨(dú)立的變量副本,所以每一個
線程都可以獨(dú)立地改變自己的副本,而不會影響其它線程所對應(yīng)的副本。
ThreadLocal的經(jīng)典使用場景是數(shù)據(jù)庫連接和session管理等。
52.說一下synchronized底層實(shí)現(xiàn)原理?
synchronized是由一對monitorenter/monitorexit指令實(shí)現(xiàn)的,
monitor對象是同步的基本實(shí)現(xiàn)單元。在Java6之前,monitor的實(shí)現(xiàn)
完全是依靠操作系統(tǒng)內(nèi)部的互斥鎖,因?yàn)樾枰M(jìn)行用戶態(tài)到內(nèi)核態(tài)的切換,
所以同步操作是一個無差別的重量級操作,性能也很低。但在Java6的
時候,Java虛擬機(jī)對此進(jìn)行了大刀闊斧地改進(jìn),提供了三種不同的
monitor實(shí)現(xiàn),也就是常說的三種不同的鎖:偏向鎖(Biased
Locking),輕量級鎖和重量級鎖,大大改進(jìn)了其性能。
53.synchronized和volatile的區(qū)別是什么?
?volatile是變量修飾符;synchronized是修飾類、方法、代碼段。
?volatile僅能實(shí)現(xiàn)變量的修改可見性,不能保證原子性;而
synchronized則可以保證變量的修改可見性和原子性。
?volatile不會造成線程的阻塞;synchronized可能會造成線程的阻
塞。
54.synchronized和Lock有什么區(qū)別?
?synchronized可以給類、方法、代碼塊加鎖;而lock只能給代碼
塊加鎖。
?synchronized不需要手動獲取鎖和釋放鎖,使用簡單,發(fā)生異常會
自動釋放鎖,不會造成死鎖;而lock需要自己加鎖和釋放鎖,如果
使用不當(dāng)沒有unLock()去釋放鎖就會造成死鎖。
?通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法
辦到。
55.synchronized和ReentrantLock區(qū)別是什么?
synchronized早期的實(shí)現(xiàn)比較低效,對比ReentrantLock,大多數(shù)場
景性能都相差較大,但是在Java6中對synchronized進(jìn)行了非常多的
改進(jìn)。
主要區(qū)別如下:
?ReentrantLock使用起來比較靈活,但是必須有釋放鎖的配合動作;
?ReentrantLock必須手動獲取與釋放鎖,而synchronized不需要
手動釋放和開啟鎖;
?ReentrantLock只適用于代碼塊鎖,而synchronized可用于修飾
方法、代碼塊等。
?volatile標(biāo)記的變量不會被編譯器優(yōu)化;synchronized標(biāo)記的變量
可以被編譯器優(yōu)化。
56.說一下atomic的原理?
atomic主要利用CAS(CompareAndWwap)和volatile和native
方法來保證原子操作,從而避免synchronized的高開銷,執(zhí)行效率大為
提升。
04:反射
反射
57.什么是反射?
反射是在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和
方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動
態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為Java語言的反射機(jī)制。
58.什么是Java序列化?什么情況下需要序列化?
Java序列化是為了保存各種對象在內(nèi)存中的狀態(tài),并且可以把保存的對象
狀態(tài)再讀出來。
以下情況需要使用Java序列化:
?想把的內(nèi)存中的對象狀態(tài)保存到一個文件中或者數(shù)據(jù)庫中時候;
?想用套接字在網(wǎng)絡(luò)上傳送對象的時候;
?想通過RMI(遠(yuǎn)程方法調(diào)用)傳輸對象的時候。
59.動態(tài)代理是什么?有哪些應(yīng)用?
動態(tài)代理是運(yùn)行時動態(tài)生成代理類。
動態(tài)代理的應(yīng)用有springaop、hibernate數(shù)據(jù)查詢、測試框架的后端
mock、rpc,Java注解對象獲取等。
60.怎么實(shí)現(xiàn)動態(tài)代理?
JDK原生動態(tài)代理和cglib動態(tài)代理。JDK原生動態(tài)代理是基于接口實(shí)現(xiàn)
的,而cglib是基于繼承當(dāng)前類的子類實(shí)現(xiàn)的。
對象拷貝
61.為什么要使用克???
克隆的對象可能包含一些已經(jīng)修改過的屬性,而new出來的對象的屬性
都還是初始化時候的值,所以當(dāng)需要一個新的對象來保存當(dāng)前對象的“狀
態(tài)"就靠克隆方法了。
62.如何實(shí)現(xiàn)對象克隆?
?實(shí)現(xiàn)Cloneable接口并重寫Object類中的clone()方法。
?實(shí)現(xiàn)Serializable接口,通過對象的序列化和反序列化實(shí)現(xiàn)克隆,
可以實(shí)現(xiàn)真正的深度克隆。
63.深拷貝和淺拷貝區(qū)別是什么?
?淺克?。寒?dāng)對象被復(fù)制時只復(fù)制它本身和其中包含的值類型的成員變
量,而引用類型的成員對象并沒有復(fù)制。
?深克?。撼藢ο蟊旧肀粡?fù)制外,對象所包含的所有成員變量也將復(fù)
制。
JavaWeb
64.JSP和servlet有什么區(qū)別?
JSP是servlet技術(shù)的擴(kuò)展,本質(zhì)上就是servlet的簡易方式。servlet
和JSP最主要的不同點(diǎn)在于,servlet的應(yīng)用邏輯是在Java文件中,并
且完全從表示層中的html里分離開來,而JSP的情況是Java和html
可以組合成一個擴(kuò)展名為JSP的文件。JSP側(cè)重于視圖,servlet主要用
于控制邏輯。
65.JSP有哪些內(nèi)置對象?作用分別是什么?
JSP有9大內(nèi)置對象:
?request:封裝客戶端的請求,其中包含來自get或post請求的參
數(shù);
?response:封裝服務(wù)器對客戶端的響應(yīng);
?pageContext:通過該對象可以獲取其他對象;
?session:封裝用戶會話的對象;
?application:封裝服務(wù)器運(yùn)行環(huán)境的對象;
?out:輸出服務(wù)器響應(yīng)的輸出流對象;
?config:Web應(yīng)用的配置對象;
?page:JSP頁面本身(相當(dāng)于Java程序中的this);
?exception:封裝頁面拋出異常的對象。
66.說一下JSP的4種作用域?
?page:代表與一個頁面相關(guān)的對象和屬性。
?request:代表與客戶端發(fā)出的一個請求相關(guān)的對象和屬性。一個請
求可能跨越多個頁面,涉及多個Web組件;需要在頁面顯示的臨時
數(shù)據(jù)可以置于此作用域。
?session:代表與某個用戶與服務(wù)器建立的一次會話相關(guān)的對象和屬
性。跟某個用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中。
?application:代表與整個Web應(yīng)用程序相關(guān)的對象和屬性,它實(shí)
質(zhì)上是跨越整個Web應(yīng)用程序,包括多個頁面、請求和會話的一個
全局作用域。
67.session和cookie有什么區(qū)別?
?存儲位置不同:session存儲在服務(wù)器端;cookie存儲在瀏覽器端。
?安全性不同:cookie安全性一般,在瀏覽器存儲,可以被偽造和修
改。
?容量和個數(shù)限制:cookie有容量限制,每個站點(diǎn)下的cookie也有
個數(shù)限制。
?存儲的多樣性:session可以存儲在Redis中、數(shù)據(jù)庫中、應(yīng)用程
序中;而cookie只能存儲在瀏覽器中。
68.說一下session的工作原理?
session的工作原理是客戶端登錄完成之后,服務(wù)器會創(chuàng)建對應(yīng)的
session,session創(chuàng)建完之后,會把session的id發(fā)送給客戶端,客
戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務(wù)器時,都會帶著
sessionid,服務(wù)器拿到sessionid之后,在內(nèi)存找到與之對應(yīng)的
session這樣就可以正常工作了。
69.如果客戶端禁止cookie能實(shí)現(xiàn)session還能用嗎?
可以用,session只是依賴cookie存儲sessionid,如果cookie被禁
用了,可以使用url中添加sessionid的方式保證session能正常使用。
70.springmvc和struts的區(qū)別是什么?
?攔截級別:struts2是類級別的攔截;springmvc是方法級別的攔
截。
?數(shù)據(jù)獨(dú)立性:springmvc的方法之間基本上獨(dú)立的,獨(dú)享request
和response數(shù)據(jù),請求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過
ModelMap交回給框架,方法之間不共享變量;而struts2雖然方
法之間也是獨(dú)立的,但其所有action變量是共享的,這不會影響程
序運(yùn)行,卻給我們編碼和讀程序時帶來了一定的麻煩。
?攔截機(jī)制:struts2有以自己的interceptor機(jī)制,springmvc用
的是獨(dú)立的aop方式,這樣導(dǎo)致struts2的配置文件量比spring
mvc大。
?對ajax的支持:springmvc集成了ajax,所有ajax使用很方便,
只需要一個注解@ResponseBody就可以實(shí)現(xiàn)了;而struts2一般
需要安裝插件或者自己寫代碼才行。
71.如何避免SQL注入?
?使用預(yù)處理
PreparedStatemento
?使用正則表達(dá)式過濾掉字符中的特殊字符。
72.什么是XSS攻擊,如何避免?
XSS攻擊:即跨站腳本攻擊,它是Web程序中常見的漏洞。原理是攻擊
者往Web頁面里插入惡意的腳本代碼(css代碼、Javascript代碼等),
當(dāng)用戶瀏覽該頁面時,嵌入其中的腳本代碼會被執(zhí)行,從而達(dá)到惡意攻擊
用戶的目的,如盜取用戶cookie,破壞頁面結(jié)構(gòu)、重定向到其他網(wǎng)站等。
預(yù)防XSS的核心是必須對輸入的數(shù)據(jù)做過濾處理。
73.什么是CSRF攻擊,如何避免?
CSRF:Cross-SiteRequestForgery(中文:跨站請求偽造),可以理
解為攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求,比如:以你名義
發(fā)送郵件、發(fā)消息、購買商品,虛擬貨幣轉(zhuǎn)賬等。
防御手段:
?驗(yàn)證請求來源地址;
?關(guān)鍵操作添加驗(yàn)證碼;
?在請求地址添加token并驗(yàn)證。
05:異常、網(wǎng)絡(luò)和設(shè)計(jì)模式
異常
74.throw和throws的區(qū)別?
?throw:是真實(shí)拋出一個異常。
?throws:是聲明可能會拋出一個異常。
75.final、finally,finalize有什么區(qū)別?
?final:是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和
變量,則表示此方法和此變量不能在被改變,只能使用。
?finally:是try{}catch{}finally{}最后一部分,表示不論發(fā)生任何
情況都會執(zhí)行,finally部分可以省略,但如果finally部分存在,則
一定會執(zhí)行finally里面的代碼。
?finalize:是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)
用被回收對象的此方法。
76.try-catch-finally中哪個部分可以省略?
try-catch-finally其中catch和finally都可以被省略,但是不能同時省
略,也就是說有try的時候,必須后面跟一個catch或者finally。
77.try-catch-finally中,如果catch中return了,finally還
會執(zhí)行嗎?
finally一定會執(zhí)行,即使是catch中return了,catch中的return會
等finally中的代碼執(zhí)行完之后,才會執(zhí)行。
78.常見的異常類有哪些?
?NullPointerException空指針異常
?ClassNotFoundException指定類不存在
?NumberFormatException字符串轉(zhuǎn)換為數(shù)字異常
?IndexOutOfBoundsException數(shù)組下標(biāo)越界異常
?ClassCastException數(shù)據(jù)類型轉(zhuǎn)換異常
?FileNotFoundException文件未找到異常
?NoSuchMethodException方法不存在異常
?lOException10異常
?SocketExceptionSocket異常
網(wǎng)絡(luò)
79.http響應(yīng)碼301和302代表的是什么?有什么區(qū)別?
301:永久重定向。
302:暫時重定向。
它們的區(qū)別是,301對搜索引擎優(yōu)化(SEO)更加有利;302有被提示為
網(wǎng)絡(luò)攔截的風(fēng)險。
80.forward和redirect的區(qū)別?
forward是轉(zhuǎn)發(fā)和redirect是重定向:
?地址欄u
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度餐飲泔水回收與環(huán)保設(shè)施投資合同3篇
- 二零二五年礦山土地及資源使用權(quán)轉(zhuǎn)讓合同3篇
- 二零二五版白糖進(jìn)口許可證申請代理服務(wù)合同下載2篇
- 二零二五年度駕駛員押運(yùn)員安全責(zé)任及培訓(xùn)合同3篇
- 二零二五版企事業(yè)單位節(jié)能環(huán)保辦公電腦采購合同2篇
- 二零二五版電子商務(wù)平臺借款及庫存商品質(zhì)押合同3篇
- 二零二五年紡織原料市場調(diào)研與分析合同2篇
- 小區(qū)下水管網(wǎng)清理疏通承包合同(2篇)
- 二零二五版房產(chǎn)買賣合同含抵押權(quán)轉(zhuǎn)移及貸款利率協(xié)商協(xié)議0183篇
- 2025年度農(nóng)業(yè)科技推廣財(cái)產(chǎn)贈與合同3篇
- 部編新改版語文一年級下冊《語文園地四》教學(xué)設(shè)計(jì)
- 2025年北京鐵路局集團(tuán)招聘筆試參考題庫含答案解析
- 《藥品招商營銷概論》課件
- 曙光磁盤陣列DS800-G10售前培訓(xùn)資料V1.0
- 寺廟祈?;顒臃桨?共6篇)
- 2025年病案編碼員資格證試題庫(含答案)
- 企業(yè)財(cái)務(wù)三年戰(zhàn)略規(guī)劃
- 2025新譯林版英語七年級下單詞表
- 提高膿毒性休克患者1h集束化措施落實(shí)率
- 山東省濟(jì)南市天橋區(qū)2024-2025學(xué)年八年級數(shù)學(xué)上學(xué)期期中考試試題
- 主播mcn合同模板
評論
0/150
提交評論