1览妖、Java
里的傳引用和傳值的區(qū)別是什么?
答案:傳引用是指傳遞的是地址而不是值本身揽祥,傳值則是傳遞值的一份拷貝讽膏。
2、為什么Java
里沒有全局變量?
答案:全局變量是全局可見的拄丰,Java
不支持全局可見的變量府树,因?yàn)椋喝肿兞科茐牧艘猛该餍栽瓌t。全局變量導(dǎo)致了命名空間的沖突愈案。
3挺尾、如何將String
類型轉(zhuǎn)化成Number
類型?
答案:Integer
類的valueOf
方法可以將String
轉(zhuǎn)成Number
站绪。
4、面向?qū)ο缶幊痰脑瓌t是什么?
答案:主要有三點(diǎn)丽柿,多態(tài)恢准,繼承和封裝。
5甫题、所有類的父類是什么馁筐?
答案:object
6、Java
的基本類型有哪些?
答案:byte,char, short, int, long, float, double, boolean
坠非。
7敏沉、怎么判斷數(shù)組是null
還是為空?
答案:輸出array.length
的值,如果是0炎码,說明數(shù)組為空盟迟。如果是null
的話,會(huì)拋出空指針異常潦闲。
8攒菠、JDK
和JRE
的區(qū)別是什么?
答案:Java
運(yùn)行時(shí)環(huán)境(JRE
)是將要執(zhí)行Java
程序的Java
虛擬機(jī)歉闰。它同時(shí)也包含了執(zhí)行applet
需要的瀏覽器插件辖众。Java
開發(fā)工具包(JDK
)是完整的Java
軟件開發(fā)包卓起,包含了JRE
,編譯器和其他的工具(比如:JavaDoc
凹炸,Java
調(diào)試器)戏阅,可以讓開發(fā)者開發(fā)、編譯啤它、執(zhí)行Java
應(yīng)用程序奕筐。
9、Java
中的方法覆蓋(Overriding
)和方法重載(Overloading
)是什么意思蚕键?
答案:Java
的方法重載救欧,就是在類中可以創(chuàng)建多個(gè)方法,它們具有相同的名字锣光,Java
中的方法重載發(fā)生在同一個(gè)類里面兩個(gè)或者是多個(gè)方法的方法名相同但是參數(shù)不同的情況笆怠。與此相對(duì),方法覆蓋是說子類重新定義了父類的方法誊爹。方法覆蓋必須有相同的方法名蹬刷,參數(shù)列表和返回類型。覆蓋者可能不會(huì)限制它所覆蓋的方法的訪問频丘。
10办成、Java
支持多繼承么?
答案:不支持搂漠,Java
不支持多繼承迂卢。每個(gè)類都只能繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口桐汤。
11而克、進(jìn)程和線程的區(qū)別是什么?
答案:進(jìn)程是執(zhí)行著的應(yīng)用程序怔毛,而線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行序列员萍。一個(gè)進(jìn)程可以有多個(gè)線程。線程又叫做輕量級(jí)進(jìn)程拣度。
12碎绎、創(chuàng)建線程有幾種不同的方式?你喜歡哪一種抗果?為什么筋帖?
答案:有三種方式可以用來創(chuàng)建線程:
繼承Thread
類
實(shí)現(xiàn)Runnable
接口
實(shí)現(xiàn)Callable
接口
應(yīng)用程序可以使用Executor
框架來創(chuàng)建線程池
實(shí)現(xiàn)Runnable
接口這種方式更受歡迎,因?yàn)檫@不需要繼承Thread
類窖张。在應(yīng)用設(shè)計(jì)中已經(jīng)繼承了別的對(duì)象的情況下幕随,這需要多繼承(而Java
不支持多繼承),只能實(shí)現(xiàn)接口宿接。同時(shí)赘淮,線程池也是非常高效的辕录,很容易實(shí)現(xiàn)和使用。
13梢卸、什么是死鎖(deadlock
)走诞?
答案:兩個(gè)進(jìn)程都在等待對(duì)方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時(shí)候就發(fā)生了死鎖。結(jié)果就是兩個(gè)進(jìn)程都陷入了無限的等待中蛤高。
14蚣旱、簡單的說下HashMap
和TreeMap
的區(qū)別?
答案:HashMap
:適用于在Map
中插入戴陡、刪除和定位元素塞绿。TreeMap
:適用于按自然順序或自定義順序遍歷鍵(key
)。HashMap
通常比TreeMap
快一點(diǎn)(樹和哈希表的數(shù)據(jù)結(jié)構(gòu)使然)恤批,建議多使用HashMap
异吻,在需要排序的Map
時(shí)候才用TreeMap
。
15喜庞、自定義標(biāo)簽要繼承哪個(gè)類诀浪?
答案:這個(gè)類可以繼承TagSupport
或者BodyTagSupport
,兩者的差別是前者適用于沒有主體的標(biāo)簽延都,而后者適用于有主體的標(biāo)簽雷猪。如果選擇繼承TagSupport
,可以實(shí)現(xiàn)doStartTag
和doEndTag
兩個(gè)方法實(shí)現(xiàn)Tag
的功能晰房,如果選擇繼承BodyTagSupport
求摇,可以實(shí)現(xiàn)doAfterBody
這個(gè)方法。
16殊者、jsp
頁面是在服務(wù)器端運(yùn)行還是在客戶端運(yùn)行月帝?
答案:服務(wù)器端。JSP
與Java Servlet
一樣
17幽污、JSP
與SERVLET
的區(qū)別。
答案:JSP
先編譯成SERVLET
然后再編譯成CLASS
文件簿姨。JSP-----SERVLET-----JAVA文件---CLASS
距误,jsp
主要做視圖層,servlet
主要做控制層
**18扁位、try {}
里有一個(gè)return
語句准潭,那么緊跟在這個(gè)try
后的finally {}
里的code
會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行域仇,在return
前還是后? **
答案:會(huì)執(zhí)行刑然,在return
前執(zhí)行。
19暇务、在JAVA
中泼掠,如何跳出當(dāng)前的循環(huán)怔软?
答案:用break; return
方法。
**20择镇、在Java
中挡逼,如何跳出當(dāng)前的多重嵌套循環(huán)? **
答案:在最外層循環(huán)前加一個(gè)標(biāo)記如A
腻豌,然后用break A;
可以跳出多重循環(huán)家坎。
21、在書寫代碼記錄操作日志時(shí)吝梅,是先寫日志 還是后寫日志虱疏?哪個(gè)會(huì)好些?
答案:先寫日志苏携。 先寫日志-->處理業(yè)務(wù)-->更新日志狀態(tài)做瞪。
22、什么是ORM
框架兜叨?
答案:ORM(Object Relational Mapping)
框架采用元數(shù)據(jù)來描述對(duì)象一關(guān)系映射細(xì)節(jié)穿扳,元數(shù)據(jù)一般采用XML
格式,并且存放在專門的對(duì)象一映射文件中国旷。通過某種關(guān)系來維持實(shí)體對(duì)象和數(shù)據(jù)庫之間的關(guān)系矛物,然后通過實(shí)體對(duì)象的操作來實(shí)現(xiàn)數(shù)據(jù)庫的操作。也就是對(duì)象關(guān)系映射跪但。
23履羞、你了解哪幾種orm
框架?
答案:Hibernate/myBatis
等屡久。myBatis
不完全是orm
忆首,需要手動(dòng)寫sql
。
24被环、你用過哪幾個(gè)版本控制工具糙及?
答案:GIT
等。
25筛欢、說出幾種java中的修飾符浸锨?
答案:public、protect版姑、default柱搜、private
26、MyEclipse
中java
文件中快速查找方法名的快捷鍵是剥险?
答案:ctrl+o
27聪蘸、當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized
方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?
答案:當(dāng)一個(gè)線程訪問“某對(duì)象”的“synchronized方法”
或者“synchronized代碼塊”
時(shí),其他線程仍然可以訪問“該對(duì)象”的非同步代碼塊;當(dāng)一個(gè)線程訪問“某對(duì)象”的“synchronized方法”
或者“synchronized代碼塊”
時(shí)健爬,其他線程對(duì)“該對(duì)象”的其他的“synchronized方法”
或者“synchronized代碼塊”
的訪問將被阻塞控乾。
28、Collection
和 Collections
的區(qū)別浑劳?
答案:Collection
是集合類的上級(jí)接口阱持,繼承與他的接口主要有Set
和List
。Collections
是針對(duì)集合類的一個(gè)幫助類魔熏,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索衷咽、排序、線程安全化等操作蒜绽。
29镶骗、在java
中一個(gè)類被聲明為final
類型,表示了什么意思躲雅?
答案:表示該類不能被繼承鼎姊,是頂級(jí)類。
30相赁、存在使i + 1 < i
的數(shù)嗎相寇?
答案:存在,解析:如果i
為int
型钮科,那么當(dāng)i
為int
能表示的最大整數(shù)時(shí)唤衫,i+1
就溢出變成負(fù)數(shù)了,此時(shí)不就<i
了嗎绵脯。
31佳励、Java接口的修飾符可以為(D)
A private B protected C final D abstract
32、不通過構(gòu)造函數(shù)也能創(chuàng)建對(duì)象嗎(A)
A 是 B 否
- (1)用
new
語句創(chuàng)建對(duì)象蛆挫,這是最常見的創(chuàng)建對(duì)象的方法赃承。 - (2) 運(yùn)用反射手段,調(diào)用
java.lang.Class
或者java.lang.reflect.Constructor
類的newInstance()
實(shí)例方法。 - (3) 調(diào)用對(duì)象的
clone()
方法悴侵。 - (4) 運(yùn)用反序列化手段瞧剖,調(diào)用
java.io.ObjectInputStream
對(duì)象的readObject()
方法。
33可免、swtich
是否能作用在byte
上筒繁,是否能作用在long
上,是否能作用在String
上?
答:早期的JDK
中巴元,switch(expr)
中,expr
可以是byte驮宴、short逮刨、char、int
。從1.5版開始修己,Java
中引入了枚舉 類型(enum
)恢总,expr
也可以是枚舉,從JDK 1.7
版開始睬愤,還可以是字符串(String
)片仿。長整型(long
)是不可以的。
34尤辱、是否可以繼承String
類?
答:String
類是final
類砂豌,不可以被繼承。
35光督、當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后阳距,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果结借,那么這里到底是值傳遞還是引用傳遞?
答:是值傳遞筐摘。Java
編程語言只有值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí)船老,參數(shù)的值就是對(duì)該對(duì)象的引用咖熟。對(duì)象的屬性可以在被調(diào)用過程中被改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的柳畔。
36馍管、String
和StringBuilder、StringBuffer
的區(qū)別?
答:Java
平臺(tái)提供了兩種類型的字符串:String
和StringBuffer / StringBuilder
荸镊,它們可以儲(chǔ)存和操作字符串咽斧。其中String
是只讀字符串,也就意味著String
引用的字符串內(nèi)容是不能被改變的躬存。而 StringBuffer
和StringBuilder
類表示的字符串對(duì)象可以直接進(jìn)行修改张惹。StringBuilder
是JDK 1.5
中引入的,它和StringBuffer
的方法完全相同岭洲,區(qū)別在于它是在單線程環(huán)境下使用的宛逗,因?yàn)樗乃蟹矫娑紱]有被synchronized
修飾,因此它的效率也比StringBuffer
略高盾剩。
37雷激、char
型變量中能不能存貯一個(gè)中文漢字?為什么?
答:char
類型可以存儲(chǔ)一個(gè)中文漢字,因?yàn)?code>Java中使用的編碼是Unicode
(不選擇任何特定的編碼告私,直接使用字符在字符集中的編號(hào)屎暇,這是統(tǒng)一的唯一方法),一個(gè)char
類型占2
個(gè)字節(jié)(16bit
)驻粟,所以放一個(gè)中文是沒問題的根悼。
補(bǔ)充:使用Unicode
意味著字符在JVM
內(nèi)部和外部有不同的表現(xiàn)形式,在JVM
內(nèi)部都是Unicode
,當(dāng)這個(gè)字符被從JVM
內(nèi)部轉(zhuǎn)移到外部時(shí) (例如存入文件系統(tǒng)中)挤巡,需要進(jìn)行編碼轉(zhuǎn)換剩彬。所以Java
中有字節(jié)流和字符流,以及在字符流和字節(jié)流之間進(jìn)行轉(zhuǎn)換的轉(zhuǎn)換流矿卑,如 InputStreamReader
和OutputStreamReader
喉恋,這兩個(gè)類是字節(jié)流和字符流之間的適配器類,承擔(dān)了編碼轉(zhuǎn)換的任務(wù)母廷;
38轻黑、抽象類(abstract class
)和接口(interface
)有什么異同?
答:抽象類和接口都不能夠?qū)嵗梢远x抽象類和接口類型的引用徘意。一個(gè)類如果繼承了某個(gè)抽象類或者實(shí)現(xiàn)了某個(gè)接口都需要對(duì)其中的抽象方法全部進(jìn)行實(shí)現(xiàn)苔悦,否則該類仍然需要被聲明為抽象類。接口比抽象類更加抽象椎咧,因?yàn)槌橄箢愔锌梢远x構(gòu)造器玖详,可以有抽象方法和具體方法,而接口中不能定義構(gòu)造器而且其 中的方法全部都是抽象方法勤讽。抽象類中的成員可以是private蟋座、默認(rèn)、protected脚牍、public
的向臀,而接口中的成員全都是public
的。抽象 類中可以定義成員變量诸狭,而接口中定義的成員變量實(shí)際上都是常量券膀。有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法驯遇。
39芹彬、靜態(tài)變量和實(shí)例變量的區(qū)別?
答:靜態(tài)變量是被static
修飾符修飾的變量叉庐,也稱為類變量舒帮,它屬于類,不屬于類的任何一個(gè)對(duì)象陡叠,一個(gè)類不管創(chuàng)建多少個(gè)對(duì)象玩郊,靜態(tài)變量在內(nèi)存中有 且僅有一個(gè)拷貝;實(shí)例變量必須依存于某一實(shí)例枉阵,需要先創(chuàng)建對(duì)象然后通過對(duì)象才能訪問到它译红。靜態(tài)變量可以實(shí)現(xiàn)讓多個(gè)對(duì)象共享內(nèi)存。在Java
開發(fā)中兴溜,上下文 類和工具類中通常會(huì)有大量的靜態(tài)成員临庇。
40反璃、是否可以從一個(gè)靜態(tài)(static
)方法內(nèi)部發(fā)出對(duì)非靜態(tài)(non-static
)方法的調(diào)用?
答:不可以假夺,靜態(tài)方法只能訪問靜態(tài)成員,因?yàn)榉庆o態(tài)方法的調(diào)用要先創(chuàng)建對(duì)象斋攀,因此在調(diào)用靜態(tài)方法時(shí)可能對(duì)象并沒有被初始化已卷。
41、如何實(shí)現(xiàn)對(duì)象克麓景侧蘸?
答:有兩種方式:
- 1.實(shí)現(xiàn)
Cloneable
接口并重寫Object
類中的clone()
方法; - 2.實(shí)現(xiàn)
Serializable
接口鹉梨,通過對(duì)象的序列化和反序列化實(shí)現(xiàn)克隆讳癌,可以實(shí)現(xiàn)真正的深度克隆。
42存皂、GC
是什么晌坤?為什么要有GC
?
答:GC
是垃圾收集的意思旦袋,內(nèi)存處理是編程人員容易出現(xiàn)問題的地方骤菠,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java
提供的GC
功能可以自動(dòng)監(jiān)測對(duì)象是否超過作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的疤孕,Java
語言沒有提供釋放已分配內(nèi)存的顯示操作方法商乎。Java
程序員不用擔(dān)心內(nèi)存管理, 因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理祭阀。要請求垃圾收集鹉戚,可以調(diào)用下面的方法之一:System.gc()
或Runtime.getRuntime().gc()
,但JVM
可以屏蔽掉顯示的垃圾回收調(diào)用专控。
43抹凳、String s=new String(“xyz”);
創(chuàng)建了幾個(gè)字符串對(duì)象?
答:兩個(gè)對(duì)象踩官,一個(gè)是靜態(tài)存儲(chǔ)區(qū)的"xyz"
却桶,一個(gè)是用new
創(chuàng)建在堆上的對(duì)象。
44蔗牡、接口是否可繼承(extends
)接口? 抽象類是否可實(shí)現(xiàn)(implements
)接口? 抽象類是否可繼承具體類(concrete class
)?
答:接口可以繼承接口档泽。抽象類可以實(shí)現(xiàn)(implements
)接口烦粒,抽象類可繼承具體類,但前提是具體類必須有明確的構(gòu)造函數(shù)。
45树灶、什么時(shí)候用assert
?
答:assertion
(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式旨巷,很多開發(fā)語言中都支持這種機(jī)制。一般來說强缘,assertion
用于保證程序最基本、關(guān)鍵的正確性不傅。assertion
檢查通常在開發(fā)和測試時(shí)開啟旅掂。為了提高性能,在軟件發(fā)布后访娶,assertion
檢查通常是關(guān)閉的商虐。在實(shí)現(xiàn)中,斷言是一個(gè)包含布爾表達(dá)式的語句崖疤,在執(zhí)行這個(gè)語句時(shí)假定該表達(dá)式為true
秘车;如果表達(dá)式計(jì)算為false
,那么系統(tǒng)會(huì)報(bào)告一個(gè)AssertionError
劫哼。
46叮趴、Error
和Exception
有什么區(qū)別?
答:Error
表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,是恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題权烧;比如內(nèi)存溢出眯亦,不可能指望程序能處理這樣的情 況;Exception
表示需要捕捉或者需要程序進(jìn)行處理的異常豪嚎,是一種設(shè)計(jì)或?qū)崿F(xiàn)問題搔驼;也就是說,它表示如果程序運(yùn)行正常侈询,從不會(huì)發(fā)生的情況舌涨。
47、sleep()
和wait()
有什么區(qū)別?
答:sleep()
方法是線程類(Thread
)的靜態(tài)方法扔字,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間囊嘉,將執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持革为,到時(shí)后會(huì) 自動(dòng)恢復(fù)(線程回到就緒(ready
)狀態(tài))扭粱,因?yàn)檎{(diào)用sleep
不會(huì)釋放對(duì)象鎖。wait()
是Object
類的方法震檩,對(duì)此對(duì)象調(diào)用wait()
方法導(dǎo)致本線程放棄對(duì)象鎖(線程暫停執(zhí)行)琢蛤,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify
方法(或notifyAll
)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入就緒狀態(tài)抛虏。
48博其、sleep()
和yield()
有什么區(qū)別?
答:sleep()
方法給其他線程運(yùn)行機(jī)會(huì)時(shí)不考慮線程的優(yōu)先級(jí),因此會(huì)給低優(yōu)先級(jí)的線程以運(yùn)行的機(jī)會(huì)迂猴;yield()
方法只會(huì)給相同優(yōu)先級(jí)或更高優(yōu)先級(jí)的線程以運(yùn)行的機(jī)會(huì)慕淡;線程執(zhí)行sleep()
方法后轉(zhuǎn)入阻塞(blocked
)狀態(tài),而執(zhí)行yield()
方法后轉(zhuǎn)入就緒(ready
)狀態(tài)沸毁;sleep()
方法聲明拋出InterruptedException
峰髓,而yield()
方法沒有聲明任何異常傻寂;sleep()
方法比yield()
方法(跟操作系統(tǒng)相關(guān))具有更好的可移植性。
49携兵、請說出與線程同步相關(guān)的方法疾掰。
答:
- 1.
wait():
使一個(gè)線程處于等待(阻塞)狀態(tài),并且釋放所持有的對(duì)象的鎖徐紧; - 2.
sleep():
使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài)个绍,是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException
異常浪汪,不會(huì)釋放鎖; - 3.
notify():
喚醒一個(gè)處于等待狀態(tài)的線程凛虽,當(dāng)然在調(diào)用此方法的時(shí)候死遭,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM
確定喚醒哪個(gè)線程凯旋,而且與優(yōu)先級(jí)無關(guān)呀潭; - 4.
notityAll():
喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖至非,而是讓它們競爭钠署; - 5.
JDK 1.5
通過Lock
接口提供了顯式(explicit
)的鎖機(jī)制,增強(qiáng)了靈活性以及對(duì)線程的協(xié)調(diào)荒椭。Lock
接口中定義了加鎖(lock()
)和解鎖 (unlock()
)的方法谐鼎,同時(shí)還提供了newCondition()
方法來產(chǎn)生用于線程之間通信的Condition
對(duì)象; - 6.
JDK 1.5
還提供了信號(hào)量(semaphore
)機(jī)制趣惠,信號(hào)量可以用來限制對(duì)某個(gè)共享資源進(jìn)行訪問的線程的數(shù)量狸棍。在對(duì)資源進(jìn)行訪問之前,線程必須得到信號(hào)量的 許可(調(diào)用Semaphore
對(duì)象的acquire()
方法)味悄;在完成對(duì)資源的訪問后草戈,線程必須向信號(hào)量歸還許可(調(diào)用Semaphore
對(duì)象的release()
方法)。
50侍瑟、什么是線程池(thread pool
)唐片?
答:
- 在面向?qū)ο缶幊讨校瑒?chuàng)建和銷毀對(duì)象是很費(fèi)時(shí)間的涨颜,因?yàn)閯?chuàng)建一個(gè)對(duì)象要獲取內(nèi)存資源或者其它更多資源费韭。在
Java
中更是如此,虛擬機(jī)將試圖跟蹤每 一個(gè)對(duì)象咐低,以便能夠在對(duì)象銷毀后進(jìn)行垃圾回收揽思。所以提高服務(wù)程序效率的一個(gè)手段就是盡可能減少創(chuàng)建和銷毀對(duì)象的次數(shù),特別是一些很耗資源的對(duì)象創(chuàng)建和銷 毀见擦,這就是"池化資源"技術(shù)產(chǎn)生的原因钉汗。線程池顧名思義就是事先創(chuàng)建若干個(gè)可執(zhí)行的線程放入一個(gè)池(容器)中羹令,需要的時(shí)候從池中獲取線程不用自行創(chuàng)建,使用完畢不需要銷毀線程而是放回池中损痰,從而減少創(chuàng)建和銷毀線程對(duì)象的開銷福侈。 - 在
Java 5+
中的Executor
接口定義一個(gè)執(zhí)行線程的工具。它的子類型即線程池接口是ExecutorService
卢未。要配置一個(gè)線程池是比較復(fù)雜的肪凛,尤其是對(duì)于線程池的原理不是很清楚的情況下,因此在工具類Executors
面提供了一些靜態(tài)工廠方法辽社,生成一些常用的線程池伟墙,如下所示:
newSingleThreadExecutor
:創(chuàng)建一個(gè)單線程的線程池。這個(gè)線程池只有一個(gè)線程在工作滴铅,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)戳葵。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線程來替代它汉匙。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行拱烁。
newFixedThreadPool
:創(chuàng)建固定大小的線程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程噩翠,直到線程達(dá)到線程池的最大大小戏自。線程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束伤锚,那么線程池會(huì)補(bǔ)充一個(gè)新線程擅笔。
newCachedThreadPool
: 創(chuàng)建一個(gè)可緩存的線程池。如果線程池的大小超過了處理任務(wù)所需要的線程见芹,那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線程剂娄,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可 以智能的添加新線程來處理任務(wù)玄呛。此線程池不會(huì)對(duì)線程池大小做限制阅懦,線程池大小完全依賴于操作系統(tǒng)(或者說JVM
)能夠創(chuàng)建的最大線程大小。
newScheduledThreadPool
:創(chuàng)建一個(gè)大小無限的線程池徘铝。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求耳胎。
newSingleThreadExecutor
:創(chuàng)建一個(gè)單線程的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求惕它。
如果希望在服務(wù)器上使用線程池怕午,強(qiáng)烈建議使用newFixedThreadPool
方法來創(chuàng)建線程池,這樣能獲得更好的性能淹魄。
82郁惜、簡述synchronized
和java.util.concurrent.locks.Lock
的異同?
答:Lock
是Java 5
以后引入的新的API
甲锡,和關(guān)鍵字synchronized
相比主要相同點(diǎn):Lock
能完成synchronized
所實(shí)現(xiàn)的所有功能兆蕉;主要不同點(diǎn):Lock
有比synchronized
更精確的線程語義和更好的性能羽戒。synchronized
會(huì)自動(dòng)釋放鎖,而Lock
一定要求程序員手工釋放虎韵,并且必須在finally
塊中釋放(這是釋放外部資源的最好的地方)易稠。
83、Java
中如何實(shí)現(xiàn)序列化包蓝,有什么意義驶社?
答:序列化就是一種用來處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化测萎⊥龅纾可以對(duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間硅瞧。序列化是為了解決對(duì)象流讀寫操作時(shí)可能引發(fā)的問題(如果不進(jìn)行序列化可能會(huì)存在數(shù)據(jù)亂序的問題)逊抡。要實(shí)現(xiàn)序列化,需要讓一個(gè)類實(shí)現(xiàn)Serializable
接口零酪,該接口是一個(gè)標(biāo)識(shí)性接口,標(biāo)注該類對(duì)象是可被序列化的拇勃,然后使用一個(gè)輸出流來四苇。構(gòu)造一個(gè)對(duì)象輸出流并通過writeObject(Object obj)
方法就可以將實(shí)現(xiàn)對(duì)象寫出(即保存其狀態(tài));如果需要反序列化則可以用一個(gè)輸入流建立對(duì)象輸入流方咆,然后通過readObject
方法從流中讀取對(duì) 象月腋。序列化除了能夠?qū)崿F(xiàn)對(duì)象的持久化之外,還能夠用于對(duì)象的深度克隆瓣赂。
84榆骚、heap
和stack
有什么區(qū)別。
答:java
的內(nèi)存分為兩類煌集,一類是棧內(nèi)存妓肢,一類是堆內(nèi)存。棧內(nèi)存是指程序進(jìn)入一個(gè)方法時(shí)苫纤,會(huì)為這個(gè)方法單獨(dú)分配一塊私屬存儲(chǔ)空間碉钠,用于存儲(chǔ)這個(gè)方法內(nèi)部的局部變量,當(dāng)這個(gè)方法結(jié)束時(shí)卷拘,分配給這個(gè)方法的棧會(huì)釋放喊废,這個(gè)棧中的變量也將隨之釋放。堆是與棧作用不同的內(nèi)存栗弟,一般用于存放不放在當(dāng)前方法棧中的那些數(shù)據(jù)污筷,例如,使用new
創(chuàng)建的對(duì)象都放在堆里乍赫,所以瓣蛀,它不會(huì)隨方法的結(jié)束而消失陆蟆。方法中的局部變量使用final
修飾后,放在堆中揪惦,而不是棧中遍搞。