一. Java SE基礎(chǔ)知識(shí)點(diǎn)總結(jié)
1. Java的8種基本數(shù)據(jù)相關(guān)的知識(shí)點(diǎn)跟畅。
數(shù)據(jù)類(lèi)型位數(shù)默認(rèn)值包裝類(lèi)
long640LLong
int320Integer
short16(short)0Short
byte8(byte)0Byte
char16\u0000Character
float320.0fFloat
double640.0dDouble
boolean—falseBoolean
解析:需要說(shuō)明的是\u開(kāi)頭的是一個(gè)Unicode碼的字符考榨,每一個(gè)\u0000都代表了一個(gè)空格''艺玲。
2. switch能否用string做參數(shù)?
解析:switch的參數(shù)不可以是string煮仇。switch是用"="進(jìn)行比較苦银,而string沒(méi)有"="的概念,只有strcmp名船。
3. equals與==的區(qū)別。
解析:簡(jiǎn)單理解旨怠,基本數(shù)據(jù)類(lèi)型之間的比較渠驼,應(yīng)該使用==,因?yàn)樗鼈儽容^的是值鉴腻。引用數(shù)據(jù)類(lèi)型在用==進(jìn)行比較的時(shí)候迷扇,比較的是它們?cè)诙褍?nèi)存中的存放地址,而equals比較的是堆內(nèi)存中存放的內(nèi)容爽哎。[Object類(lèi)中提供的equals()默認(rèn)是比較地址的]
4. Object有哪些公用方法蜓席?
方法名稱類(lèi)型描述
public Object()構(gòu)造方法構(gòu)造方法
public boolean equals(Object obj)普通方法對(duì)象比較
public int hashCode()普通方法取得Hash碼
public String toString()普通方法對(duì)象打印時(shí)調(diào)用
解析:Object類(lèi)提供的hashCode()默認(rèn)實(shí)現(xiàn)確實(shí)保證每個(gè)對(duì)象的hash碼不同(在對(duì)象的內(nèi)存地址基礎(chǔ)上經(jīng)過(guò)特定算法返回一個(gè)hash碼)。
5. Java的四種引用"強(qiáng)軟弱虛"以及用到的場(chǎng)景 [7][8][9][10]课锌。
解析:現(xiàn)在首先思考一個(gè)問(wèn)題厨内,為什么引用還要分類(lèi)呢?答案:合理的使用引用可以幫助垃圾回收器更好的管理Java內(nèi)存渺贤。
強(qiáng)引用(Strong Reference):如果一個(gè)對(duì)象具有強(qiáng)引用雏胃,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足志鞍,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤瞭亮,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題固棚。[使用最普遍的引用]
軟引用(Soft Reference):如果一個(gè)對(duì)象只具有軟引用街州,則內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它玻孟;如果內(nèi)存空間不足了唆缴,就會(huì)回收這些對(duì)象的內(nèi)存。[通常用來(lái)實(shí)現(xiàn)內(nèi)存敏感的高速緩存]
弱引用(Weak Reference):只具有弱引用的對(duì)象擁有更短暫的生命周期黍翎。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中面徽,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否匣掸,都會(huì)回收它的內(nèi)存趟紊。[通常用于Debug、內(nèi)存監(jiān)視工具等程序中]
虛引用(Phantom Reference):如果一個(gè)對(duì)象僅持有虛引用碰酝,那么它就和沒(méi)有任何引用一樣霎匈,在任何時(shí)候都可能被垃圾回收器回收。[通常用來(lái)跟蹤對(duì)象被垃圾回收的活動(dòng)]
6. hashCode的作用 [11]送爸。
解析:Java中的集合有2類(lèi)铛嘱,分別是List暖释,Set。現(xiàn)在我們考慮Set墨吓,即元素不能重復(fù)球匕。但是,如何判斷元素是否重復(fù)呢帖烘?容易想到的方法就是Object.equals()×敛埽現(xiàn)在會(huì)遇到一個(gè)問(wèn)題,那就是當(dāng)元素很多時(shí)秘症,后添加到集合中的元素比較的次數(shù)就非常多照卦。這樣hashCode就派上用場(chǎng)了,它返回一個(gè)對(duì)象存儲(chǔ)的物理地址(實(shí)際可能并不是這樣的乡摹,總之是對(duì)象唯一的標(biāo)識(shí)符)窄瘟。當(dāng)Set要添加新元素時(shí),首先調(diào)用這個(gè)元素的hashCode()趟卸,就能定位到它應(yīng)該放置的位置蹄葱。如果這個(gè)位置上沒(méi)有元素,它就可以直接存儲(chǔ)在這個(gè)位置上锄列;如果這個(gè)位置上已經(jīng)有元素了图云,
就調(diào)用它的equals()與新元素進(jìn)行比較,如果相同就不存儲(chǔ)了邻邮,否則就散列其它的地址存儲(chǔ)竣况。這樣一來(lái)實(shí)際調(diào)用equals()的次數(shù)就大大降低了,幾乎只需要一兩次筒严。因此丹泉,如果兩個(gè)對(duì)象相同,那么它們的hashCode值一定要相同鸭蛙;如果兩個(gè)對(duì)象的hashCode相同摹恨,那么它們并不一定相同。
7. ArrayList娶视、LinkedList晒哄、Vector的區(qū)別 [12]。
解析:
ArrayList和Vector可以看作數(shù)組肪获,而LinkedList可以看作鏈表寝凌;
ArrayList屬于新的操作類(lèi),異步處理孝赫,非線程安全较木,只能使用Iterator,foreach輸出青柄;
Vector屬于舊的操作類(lèi)伐债,同步處理预侯,線程安全,只能使用Iterator泳赋,foreach,Enumeration輸出喇喉。
8. String祖今、StringBuffer與StringBuilder的區(qū)別 [13]。
解析:
String:字符串常量拣技;
StringBuffer:字符串變量千诬,線程安全的操作類(lèi);
StringBuilder:字符串變量膏斤,非線程安全的操作類(lèi)徐绑。
9. Map、Set莫辨、List傲茄、Queue、Stack等的相關(guān)知識(shí)點(diǎn)沮榜。
解析:類(lèi)集對(duì)于Java開(kāi)發(fā)極其重要,務(wù)必精通類(lèi)集。Java中的類(lèi)集相當(dāng)于C++中的STL和Boost等類(lèi)庫(kù)坏快。
接口或類(lèi)描述
Collection是存放一組單值的最大父接口属铁,在新的開(kāi)發(fā)標(biāo)準(zhǔn)中已經(jīng)很少直接使用此接口進(jìn)行操作了。
List是Collection接口的子接口型酥,對(duì)其進(jìn)行了大量的擴(kuò)充山憨,里面的內(nèi)容是允許重復(fù)的。
Set是Collection接口的子接口弥喉,沒(méi)有對(duì)其進(jìn)行擴(kuò)充郁竟,里面的內(nèi)容是不允許重復(fù)的。
Map是存放一對(duì)值的最大父接口由境,即接口中的每個(gè)元素都是一對(duì)的枪孩,以key—>value的形式保存。
Iterator集合的輸出接口藻肄,用于輸出集合中的內(nèi)容蔑舞,只能進(jìn)行從前到后的單向輸出。
ListIterator是Iterator的子接口嘹屯,可以進(jìn)行由前向后或由后向前的雙向輸出攻询。
Enumeration是最早的輸出接口,用于輸出指定集合中的內(nèi)容州弟。
SortedSet單指的排序接口钧栖,實(shí)現(xiàn)此接口的集合類(lèi)低零,里面的內(nèi)容可以使用比較器排序。
SortedMap存放一對(duì)值的排序接口拯杠,實(shí)現(xiàn)此接口的集合類(lèi)掏婶,里面的內(nèi)容按照key排序,使用比較器排序潭陪。
Queue隊(duì)列接口雄妥,此接口的子類(lèi)可以實(shí)現(xiàn)隊(duì)列操作。
Map.EntryMap的內(nèi)部接口依溯,每個(gè)Map.Entry對(duì)象都保存著一對(duì)key->value的內(nèi)容老厌,每個(gè)Map接口中都保存有多個(gè)Map.Entry接口實(shí)例。
HashMap無(wú)序存放的黎炉,是新的操作類(lèi)枝秤,key不允許重復(fù)。
Hashtable無(wú)序存放的慷嗜,是舊的操作類(lèi)淀弹,key不允許重復(fù)。
TreeMap可以排序的Map集合庆械,按集合中的key排序垦页,key不允許重復(fù)。
WeakHashMap若引用的Map集合干奢,當(dāng)集合中的某些內(nèi)容不再使用時(shí)清除掉無(wú)用的數(shù)據(jù)痊焊,使用gc進(jìn)行回收。
IdentityHashMapkey可以重復(fù)的Map集合忿峻。
Stackk可以完成先進(jìn)后出的操作薄啥。
10. HashMap和Hashtable的區(qū)別。
解析:
比較點(diǎn)HashMapHashtable
推出時(shí)間JDK 1.2之后推出逛尚,屬于新的操作類(lèi)JDK 1.0時(shí)推出垄惧,屬于舊的操作類(lèi)
性能采用異步處理方式,性能更高使用同步處理方式绰寞,性能較低
線程安全屬于非線程安全的操作類(lèi)屬于線程安全的操作類(lèi)
空鍵允許將key設(shè)置為null
不允許將key設(shè)置為null到逊,否則將出現(xiàn)Null Pointer Exception
11. HashMap和ConcurrentHashMap的區(qū)別及源碼分析。
解析:
HashMap因?yàn)椴捎玫氖钱惒教幚矸绞铰饲允欠前踩牟僮黝?lèi)觉壶。
ConcurrentHashMap在多線程中是安全的操作類(lèi),那與Hashtable的區(qū)別是什么呢件缸?Hashtable采用的是單個(gè)鎖铜靶,而它采用的是多個(gè)鎖,在并發(fā)控制方面比Hashtable更加的優(yōu)化和高效他炊。
至于HashMap和ConcurrentHashMap的源碼分析争剿,推薦博客 [14][15]已艰。
12. TreeMap、HashMap蚕苇、LinkedHashMap的區(qū)別 [16]哩掺。
解析:java.util.Map接口有四個(gè)實(shí)現(xiàn)類(lèi),分別是HashMap涩笤,Hashtable嚼吞,LinkedHashMap和TreeMap。
TreeMap:可以按照自然順序或自定義順序都key進(jìn)行排序辆它。
HashMap:在Map中插入誊薄、刪除和定位元素履恩,它是最好的選擇锰茉。
LinkedHashMap:它是HashMap的一個(gè)子類(lèi),如果需要輸出的順序和輸入的相同切心,那么用LinkedHashMap可以實(shí)現(xiàn)飒筑。
13. Collection與Collections的區(qū)別。
解析:
Collection是個(gè)java.util下的接口绽昏,它是各種集合結(jié)構(gòu)(Set协屡,List,Map等)的父接口全谤。
Collections是個(gè)java.util下的類(lèi)肤晓,它包含有各種有關(guān)集合操作的靜態(tài)方法。
14. 在try catch finally中认然,如果try里有return补憾,那么finally還會(huì)執(zhí)行么 [17]?
解析:
任何執(zhí)行try或者catch中的return語(yǔ)句之前卷员,都會(huì)先執(zhí)行finally語(yǔ)句盈匾;
如果finally中有return語(yǔ)句,那么程序就return了毕骡。因此削饵,finally中的return是一定會(huì)被return的;
在finally中最好不要包含return未巫,否則程序會(huì)提前退出窿撬,返回值不是try或catch中的返回值。
15. Excption與Error等相關(guān)的知識(shí)點(diǎn)叙凡。Out Of Memory(OOM)你遇到過(guò)哪些情況尤仍,Stack Over Flow(SOF)你遇到過(guò)哪些情況。
解析:
異常的最大父類(lèi)是Throwable狭姨,它包含2個(gè)子類(lèi)宰啦,分別是Exception苏遥,Error。Exception表示程序處理的異常赡模,而Error表示JVM錯(cuò)誤田炭,一般不由程序開(kāi)發(fā)人員處理;
Out Of Memory(OOM):引起OOM主要有2個(gè)原因漓柑,分別是內(nèi)存泄漏和內(nèi)存溢出(即堆溢出和棧溢出) [19][20]教硫。
Stack Over Flow(SOF):(堆)棧溢出主要發(fā)生在遞歸的調(diào)用中 [21]。
OOM和SOF:遞歸調(diào)用可以導(dǎo)致棧溢出辆布,不斷創(chuàng)建對(duì)象可以導(dǎo)致堆溢出瞬矩。
16. Java面向?qū)ο蟮娜齻€(gè)特征與含義。
解析:
封裝性:它是將類(lèi)的一些敏感信息隱藏在類(lèi)的類(lèi)部锋玲,不讓外界直接訪問(wèn)到景用,但是可以通過(guò)getter()和setter()間接訪問(wèn)。
繼承性:子類(lèi)通過(guò)一種方式來(lái)接受父類(lèi)所有的公有的惭蹂,受保護(hù)的成員變量和成員方法伞插。
多態(tài)性:程序在運(yùn)行的過(guò)程中,同一種類(lèi)型在不同的條件下表現(xiàn)不同的結(jié)果盾碗,這種不定狀態(tài)的表現(xiàn)形式稱為多態(tài)性媚污。
17. Override和Overload的含義和區(qū)別 [22]。
解析:方法的重寫(xiě)(Override)和重載(Overload)是Java多態(tài)性的不同表現(xiàn)廷雅。
區(qū)別:重寫(xiě)(Override)是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現(xiàn)耗美,而重載(Overload)是一個(gè)類(lèi)中多態(tài)性的一種表現(xiàn)。如果在子類(lèi)中定義某方法與其
重寫(xiě)(Override):父類(lèi)有相同的名稱和參數(shù)航缀,我們說(shuō)該方法被重寫(xiě) (Override)商架。子類(lèi)的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類(lèi)中的定義谬盐,而父類(lèi)中的定義如同被屏蔽了甸私。
重載(Overload):如果在一個(gè)類(lèi)中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類(lèi)型或有不同的參數(shù)次序飞傀,則稱為方法的重載(Overload)皇型。
18. interface與abstract類(lèi)的區(qū)別。
解析:
區(qū)別點(diǎn)抽象類(lèi)接口
定義包含一個(gè)抽象方法的類(lèi)抽象方法和全局常量的集合
組成構(gòu)造方法砸烦,抽象方法弃鸦,普通方法,常量幢痘,變量常量唬格,抽象方法
使用子類(lèi)繼承抽象類(lèi)(extends)子類(lèi)實(shí)現(xiàn)接口(implements)
關(guān)系抽象類(lèi)可以實(shí)現(xiàn)多個(gè)接口接口不能繼承抽象類(lèi),但是允許繼承多個(gè)接口
常見(jiàn)設(shè)計(jì)模型模板設(shè)計(jì)工廠設(shè)計(jì),代理設(shè)計(jì)
對(duì)象都通過(guò)對(duì)象的多態(tài)性產(chǎn)生實(shí)例化對(duì)象
局限抽象類(lèi)有單繼承的局限接口沒(méi)有此局限
實(shí)際作為一個(gè)模板作為一個(gè)標(biāo)準(zhǔn)或表示一種能力
選擇如果抽象類(lèi)和接口都可以使用购岗,則優(yōu)先使用接口汰聋,避免單繼承的局限
特殊一個(gè)抽象類(lèi)中可以包含多個(gè)接口,一個(gè)接口中可以包含多個(gè)抽象類(lèi)
19. Static class 與non static class的區(qū)別 [23]喊积。
解析:在Java中可以有靜態(tài)實(shí)例變量烹困、靜態(tài)方法、靜態(tài)塊乾吻,當(dāng)然也可以有靜態(tài)類(lèi)髓梅,但是用static不能修飾頂級(jí)類(lèi),只能修飾內(nèi)部類(lèi)绎签。
靜態(tài)內(nèi)部類(lèi)和非靜態(tài)內(nèi)部類(lèi)究竟有什么區(qū)別呢枯饿?
內(nèi)部靜態(tài)類(lèi)不需要有指向外部類(lèi)的引用,因?yàn)橛胹tatic聲明的靜態(tài)內(nèi)部類(lèi)變成了外部類(lèi)诡必,但是非靜態(tài)內(nèi)部類(lèi)需要持有對(duì)外部類(lèi)的引用奢方;
非靜態(tài)內(nèi)部類(lèi)能夠訪問(wèn)外部類(lèi)的靜態(tài)和非靜態(tài)成員(數(shù)據(jù)成員和成員函數(shù)),但是靜態(tài)內(nèi)部類(lèi)只能訪問(wèn)外部類(lèi)的靜態(tài)成員(數(shù)據(jù)成員和成員函數(shù))擒权;
非靜態(tài)內(nèi)部類(lèi)不能脫離外部類(lèi)實(shí)體被創(chuàng)建袱巨,但是非靜態(tài)內(nèi)部類(lèi)可以訪問(wèn)外部類(lèi)的數(shù)據(jù)和函數(shù)阁谆,因?yàn)樗驮谕獠款?lèi)里面碳抄;
如果在方法中定義的內(nèi)部類(lèi)要想訪問(wèn)方法中的參數(shù),那么必須在參數(shù)前加上final關(guān)鍵字场绿。
20. Java多態(tài)的實(shí)現(xiàn)原理 [24]剖效。
解析:
靠的是父類(lèi)或接口定義的引用變量可以指向子類(lèi)或具體實(shí)現(xiàn)類(lèi)的實(shí)例對(duì)象,而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定焰盗,就是引用變量所指向的具體實(shí)例對(duì)象的方法璧尸,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法,而不是引用變量的類(lèi)型中定義的方法熬拒。
21. 實(shí)現(xiàn)多線程的兩種方法:Thread與Runable爷光。
解析:
Thread類(lèi):它是在java.lang包中定義的,一個(gè)類(lèi)只要繼承了Thread類(lèi)澎粟,此類(lèi)就稱為多線程實(shí)現(xiàn)類(lèi)蛀序。在Thread子類(lèi)中,必須明確地覆寫(xiě)Thread類(lèi)中的run()活烙,因?yàn)榇朔椒榫€程的主體徐裸。
Runable接口:在Java中也可以通過(guò)實(shí)現(xiàn)Runnable接口的方式實(shí)現(xiàn)多線程,Runnable接口中只定義了一個(gè)抽象方法:public void run()啸盏。
區(qū)別:通過(guò)public class Thread extends Object implements Runnable發(fā)現(xiàn)重贺,Thread類(lèi)也是Runnable接口的子類(lèi),但是在Thread類(lèi)中并沒(méi)有完全地實(shí)現(xiàn)Runnable接口中的run(),而是調(diào)用的Runnable接口中的run()气笙。因此次企,如果通過(guò)繼承Thread類(lèi)實(shí)現(xiàn)多線程,那么必須覆寫(xiě)run()潜圃。實(shí)際上抒巢,Runnable接口相對(duì)于Thread類(lèi)來(lái)說(shuō)更適合多個(gè)相同程序代碼的線程去處理同一資源的情況。
22. 線程同步的方法:sychronized秉犹、lock蛉谜、reentrantLock、Atomic等 [25][26]崇堵。
解析:synchronized是jvm虛擬機(jī)的關(guān)鍵字型诚,在java.util.concurrent.locks命名空間中還有一個(gè)Lock接口,和Lock接口的實(shí)現(xiàn)類(lèi)ReentrantLock(可重入鎖)鸳劳。
如果資源競(jìng)爭(zhēng)不是很激烈狰贯,偶爾會(huì)有同步的情形,那么synchronized是非常合適的選擇赏廓;
ReentrantLock提供了多樣化的同步涵紊,比如有可以被Interrupt的同步(synchronized的同步是不能被Interrupt的)等。如果資源競(jìng)爭(zhēng)不是很激烈幔摸,那么它的性能稍微比synchronized差點(diǎn)兒摸柄。但是,當(dāng)資源競(jìng)爭(zhēng)很激烈的時(shí)候既忆,synchronized是非常合適的選擇驱负;
與ReentrantLock的情況類(lèi)似,如果資源競(jìng)爭(zhēng)不是很激烈患雇,那么它的性能稍微比synchronized差點(diǎn)兒跃脊。但是,當(dāng)資源競(jìng)爭(zhēng)很激烈的時(shí)候苛吱,Atomic的性能會(huì)優(yōu)于ReentrantLock一倍左右酪术。但是,它也有一個(gè)缺點(diǎn)翠储,那就是只能同步一個(gè)值绘雁。
23. 鎖的等級(jí):對(duì)象鎖(方法鎖)、類(lèi)鎖等相關(guān)知識(shí)點(diǎn) [27]彰亥。
解析:簡(jiǎn)單來(lái)說(shuō)咧七,就是兩個(gè)鎖的粒度不同。對(duì)象鎖的粒度是對(duì)象任斋,而類(lèi)鎖的對(duì)象是類(lèi)继阻。
對(duì)象鎖就是在一個(gè)類(lèi)的方法前面加synchronized關(guān)鍵字(對(duì)象的方法)耻涛;
類(lèi)鎖就是在一個(gè)類(lèi)的方法前面加synchronized static關(guān)鍵字(類(lèi)的方法)。
24. 寫(xiě)出生產(chǎn)者和消費(fèi)者模式 [28]瘟檩。
解析:
問(wèn)題過(guò)程:生產(chǎn)者用于將消息放入緩沖區(qū)抹缕,而消費(fèi)者用于從緩沖區(qū)中取出消息。問(wèn)題出現(xiàn)在當(dāng)緩沖區(qū)已經(jīng)滿了墨辛,而此時(shí)生產(chǎn)者還想向其中放入一個(gè)新的數(shù)據(jù)項(xiàng)的情形卓研,其解決方法是讓生產(chǎn)者此時(shí)進(jìn)行休眠,等待消費(fèi)者從緩沖區(qū)中取走了一個(gè)或者多個(gè)數(shù)據(jù)項(xiàng)后再去喚醒它睹簇。同樣地奏赘,當(dāng)緩沖區(qū)已經(jīng)空了,而消費(fèi)者還想去取數(shù)據(jù)項(xiàng)太惠,此時(shí)可以讓消費(fèi)者進(jìn)行休眠磨淌,等待生產(chǎn)者放入一個(gè)或者多個(gè)數(shù)據(jù)項(xiàng)時(shí)再喚醒它。問(wèn)題本質(zhì):生產(chǎn)者和消費(fèi)者模式考察的知識(shí)點(diǎn)是Java中的多線程凿渊,解決的問(wèn)題是兩個(gè)進(jìn)程如何共享同一個(gè)資源(緩沖區(qū))梁只。
(1)PublicResource.java如下所示:
1/**
2? * 生產(chǎn)者線程,功能是向緩沖區(qū)中放入數(shù)據(jù)項(xiàng)
3? */4publicclassProducerThreadimplementsRunnable{5privatePublicResource resource;67publicProducerThread(PublicResource resource) {8this.resource = resource;9}1011@Override12publicvoidrun() {13for(inti =0; i <10; i++) {14try{15Thread.sleep((long) (Math.random() *1000));16}catch(InterruptedException e) {17e.printStackTrace();18}19resource.increase();20}21}22}View Code
(2)ProducerThread.java如下所示:
1/**
2? * 生產(chǎn)者線程埃脏,功能是向緩沖區(qū)中放入數(shù)據(jù)項(xiàng)
3? */4publicclassProducerThreadimplementsRunnable{5privatePublicResource resource;67publicProducerThread(PublicResource resource) {8this.resource = resource;9}1011@Override12publicvoidrun() {13for(inti =0; i <10; i++) {14try{15Thread.sleep((long) (Math.random() *1000));16}catch(InterruptedException e) {17e.printStackTrace();18}19resource.increase();20}21}22}View Code
(3)ConsumerThread.java如下所示:
1publicclassConsumerThreadimplementsRunnable{2publicPublicResource resource;34publicConsumerThread (PublicResource resource) {5this.resource = resource;6}78@Override9publicvoidrun() {10for(inti =0; i <10; i++) {11try{12Thread.sleep((long) (Math.random() *1000));13}catch(InterruptedException e) {14e.printStackTrace();15}16resource.decrease();17}18}19}View Code
(4)ProducerConsumerTest如下所示:
1publicclassProducerConsumerTest{2publicstaticvoidmain(String[] args) {3PublicResource resource =newPublicResource();45newThread(newProducerThread(resource)).start();6newThread(newConsumerThread(resource)).start();7newThread(newProducerThread(resource)).start();8newThread(newConsumerThread(resource)).start();9newThread(newProducerThread(resource)).start();10newThread(newConsumerThread(resource)).start();11}12}View Code
25. ThreadLocal的作用 []搪锣。
解析:
ThreadLocal并不是一個(gè)Thread,而是一個(gè)Thread的局部變量彩掐。它的作用是為每個(gè)使用該變量的線程都提供一個(gè)變量的副本构舟,每個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)和其它線程的副本沖突佩谷。從線程的角度看旁壮,就好像每個(gè)線程都完全擁有該變量一樣监嗜。[public class java.lang.ThreadLocal extends Object]
26. ThreadPool的作用 [29]谐檀。
解析:
ThreadPool顧名思義就是線程的容器,和數(shù)據(jù)庫(kù)中連接池的概念類(lèi)似裁奇。它的作用是減少創(chuàng)建和銷(xiāo)毀線程的額外開(kāi)銷(xiāo)桐猬,并且最大程度地利用線程。Java中自帶的線程池類(lèi):public class java.util.concurrent.ThreadPoolExecutor extends AbstractExecutorService刽肠。
27. Concurrent中的ArrayBlockingQueue溃肪、CountDownLatch等 [31]。
解析:
ArrayBlockingQueue:阻塞隊(duì)列是指一個(gè)指定長(zhǎng)度的隊(duì)列音五,如果隊(duì)列滿了惫撰,那么添加新元素的操作會(huì)被阻塞等待,直到有空位為止躺涝。同樣厨钻,當(dāng)隊(duì)列為空的時(shí)候,請(qǐng)求隊(duì)列元素的操作同樣會(huì)被阻塞等待,直到有可用元素為止夯膀。[public class java.util.concurrent.ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, Serializable]
CountDownLatch:可以看作是一個(gè)倒數(shù)計(jì)數(shù)的鎖诗充,當(dāng)計(jì)數(shù)為0時(shí)觸發(fā)特定的事件,這樣我們就可以讓主線程等待子線程的結(jié)束诱建。[public class java.util.concurrent.CountDownLatch extends Object]
28. wait()和sleep()的區(qū)別蝴蜓。
解析:
sleep()來(lái)自Thread類(lèi),而wait()來(lái)自O(shè)bject類(lèi)俺猿;
sleep()必須捕獲異常茎匠,而wait()不需要捕獲異常;
sleep()不釋放同步鎖押袍,而wait()釋放同步鎖汽抚。
29. Java NIO與IO的區(qū)別 [32]。
解析:
Java NIO是面向塊的伯病,而Java IO是面向流的造烁;
Java NIO是非阻塞的I/O,而Java IO是阻塞的I/O午笛。
30. 反射機(jī)制相關(guān)的知識(shí)點(diǎn)惭蟋。
解析:通過(guò)反射機(jī)制可以取得一個(gè)類(lèi)所繼承的父類(lèi),實(shí)現(xiàn)的接口药磺,類(lèi)中的全部構(gòu)造方法告组,全部的普通方法和全部的屬性。
31. List類(lèi)型的變量能否直接賦值給List類(lèi)型的變量 [33]癌佩。
解析:不能木缝。因?yàn)榉盒椭胁淮嬖诶^承關(guān)系。
32. Java 1.8的新特性 [34]围辙。
33. 23種設(shè)計(jì)模式我碟。
34. JNI的使用。
二. JVM基礎(chǔ)知識(shí)點(diǎn)總結(jié)
1. 內(nèi)存模型以及分區(qū)姚建,需要詳細(xì)到每個(gè)區(qū)放什么矫俺。
2. 堆里面的分區(qū):Eden,survival from to掸冤,老年代厘托,各自的特點(diǎn)。
3. 對(duì)象創(chuàng)建方法稿湿,對(duì)象的內(nèi)存分配铅匹,對(duì)象的訪問(wèn)定位。
4. GC的兩種判定方法:引用計(jì)數(shù)與引用鏈饺藤。
5. GC的三種收集方法:標(biāo)記清除包斑、標(biāo)記整理考杉、復(fù)制算法的原理與特點(diǎn),分別用在什么地方舰始,如果讓你優(yōu)化收集方法崇棠,有什么思路?
6. GC收集器有哪些丸卷?CMS收集器與G1收集器的特點(diǎn)枕稀。
7. Minor GC與Full GC分別在什么時(shí)候發(fā)生?
8. 幾種常用的內(nèi)存調(diào)試工具:jmap谜嫉、jstack萎坷、jconsole。
9. 類(lèi)加載的五個(gè)過(guò)程:加載沐兰、驗(yàn)證哆档、準(zhǔn)備、解析住闯、初始化瓜浸。
10. 雙親委派模型:Bootstrap ClassLoader、Extension ClassLoader比原、ApplicationClassLoader插佛。
11. 分派:靜態(tài)分派與動(dòng)態(tài)分派。
三. 操作系統(tǒng)總結(jié)
1. 進(jìn)程和線程的區(qū)別量窘。
2. 死鎖的必要條件雇寇,怎么處理死鎖。
3. Window內(nèi)存管理方式:段存儲(chǔ)蚌铜,頁(yè)存儲(chǔ)锨侯,段頁(yè)存儲(chǔ)。
4. 進(jìn)程的幾種狀態(tài)冬殃。
5. IPC幾種通信方式囚痴。
6. 什么是虛擬內(nèi)存。
7. 虛擬地址造壮、邏輯地址渡讼、線性地址、物理地址的區(qū)別耳璧。
四. 計(jì)算機(jī)網(wǎng)絡(luò)總結(jié)
1. OSI與TCP/IP各層的結(jié)構(gòu)與功能,都有哪些協(xié)議展箱。
2. TCP與UDP的區(qū)別旨枯。
3. TCP報(bào)文結(jié)構(gòu)。
4. TCP的三次握手與四次揮手過(guò)程混驰,各個(gè)狀態(tài)名稱與含義攀隔,TIMEWAIT的作用皂贩。
5. TCP擁塞控制。
6. TCP滑動(dòng)窗口與回退N針協(xié)議昆汹。
7. Http的報(bào)文結(jié)構(gòu)明刷。
8. Http的狀態(tài)碼含義。
9. Http request的幾種類(lèi)型满粗。
10. Http1.1和Http1.0的區(qū)別辈末。
11. Http怎么處理長(zhǎng)連接。
12. Cookie與Session的作用于原理映皆。
13. 電腦上訪問(wèn)一個(gè)網(wǎng)頁(yè)挤聘,整個(gè)過(guò)程是怎么樣的:DNS、HTTP捅彻、TCP组去、OSPF、IP步淹、ARP从隆。
14. Ping的整個(gè)過(guò)程。ICMP報(bào)文是什么缭裆。
15. C/S模式下使用socket通信广料,幾個(gè)關(guān)鍵函數(shù)。
16. IP地址分類(lèi)幼驶。
17. 路由器與交換機(jī)區(qū)別艾杏。
五. 數(shù)據(jù)結(jié)構(gòu)和算法
1. 鏈表與數(shù)組。
2. 隊(duì)列和棧盅藻,出棧與入棧购桑。
3. 鏈表的刪除、插入氏淑、反向勃蜘。
4. 字符串操作。
5. Hash表的hash函數(shù)假残,沖突解決方法有哪些缭贡。
6. 各種排序:冒泡、選擇辉懒、插入阳惹、希爾、歸并眶俩、快排莹汤、堆排、桶排颠印、基數(shù)的原理纲岭、平均時(shí)間復(fù)雜度抹竹、最壞時(shí)間復(fù)雜度、空間復(fù)雜度止潮、是否穩(wěn)定窃判。
7. 快排的partition函數(shù)與歸并的Merge函數(shù)。
8. 對(duì)冒泡與快排的改進(jìn)喇闸。
9. 二分查找袄琳,與變種二分查找。
10. 二叉樹(shù)仅偎、B+樹(shù)跨蟹、AVL樹(shù)、紅黑樹(shù)橘沥、哈夫曼樹(shù)窗轩。
11. 二叉樹(shù)的前中后續(xù)遍歷:遞歸與非遞歸寫(xiě)法,層序遍歷算法座咆。
12. 圖的BFS與DFS算法痢艺,最小生成樹(shù)prim算法與最短路徑Dijkstra算法。
13. KMP算法介陶。
14. 排列組合問(wèn)題堤舒。
15. 動(dòng)態(tài)規(guī)劃、貪心算法哺呜、分治算法舌缤。
16. 大數(shù)據(jù)處理:類(lèi)似10億條數(shù)據(jù)找出最大的1000個(gè)數(shù)等。
六. 計(jì)算機(jī)組成原理總結(jié)
七. 數(shù)據(jù)庫(kù)原理總結(jié)
參考文獻(xiàn):
[1] 面試心得與總結(jié):http://www.nowcoder.com/discuss/3043
[2] 《Java開(kāi)發(fā)實(shí)戰(zhàn)經(jīng)典》
[3] 《Java編程思想》
[4] 《Java核心技術(shù)》(第8版)
[5] 《Java編程思想》
[6] 常見(jiàn)的數(shù)據(jù)庫(kù)基礎(chǔ)面試題大全:http://www.it165.net/database/html/201111/1146.html
[7] Java的四種引用:http://www.cnblogs.com/ymind/archive/2012/05/04/2483590.html
[8] Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹:http://www.jb51.net/article/49085.htm
[9] Java中四種引用(強(qiáng)某残、軟国撵、弱、虛):http://www.xuebuyuan.com/1772186.html
[10] 強(qiáng)引用玻墅、弱引用介牙、軟引用、虛引用:http://my.oschina.net/ydsakyclguozi/blog/404389
[11] 關(guān)于hashCode()的作用:http://my.oschina.net/91jason/blog/306996
[12] ArrayList澳厢、LinkedList环础、Vector區(qū)別與用法:http://www.cnblogs.com/mgod/archive/2007/08/05/.html
[13] StringBuffer與StringBuilder區(qū)別:http://zhidao.baidu.com/link?url=OgV7TUaFr8h4wGP1uI7xA0Z2nB6S9ZdEw5rPFFFFtF-VX3Q_WEWchmISKeowomV2R5YQiMqW4Zb1astS-at5R_
[14] ConcurrentHashMap:http://www.cnblogs.com/yydcdut/p/3959815.html
[15] HashMap與ConcurrentHashMap的區(qū)別:http://blog.csdn.net/xuefeng0707/article/details/40834595
[16] HashMap,LinkedMap剩拢,TreeMap的區(qū)別:http://blog.sina.com.cn/s/blog_5ded2e5b01011pn5.html
[17] 有return的情況下try catch finally的執(zhí)行順序:http://blog.csdn.net/kavensu/article/details/8067850
[18] 深入理解java異常處理機(jī)制:http://blog.csdn.net/hguisu/article/details/6155636
[19] 關(guān)于OOM的那些事兒:http://www.cnblogs.com/gaojing/archive/2012/10/30/2844938.html
[20] Java常見(jiàn)內(nèi)存溢出(OOM)解決方案:http://www.tuicool.com/articles/myuQ7b
[21] Java內(nèi)存溢出示例(堆溢出线得、棧溢出):http://www.jb51.net/article/49485.htm
[22] Overload與Override的區(qū)別:http://www.cnblogs.com/whgw/archive/2011/10/01/2197083.html