更新時(shí)間:2019-08-12 15:14:05 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2957次
java開發(fā)工程師面試題及參考答案分享,java程序員面試過程中少不了專業(yè)上的考試,那么面試過程中面試官會(huì)問些什么問題呢?接下來動(dòng)力節(jié)點(diǎn)java學(xué)院小編帶你一起來進(jìn)入面試環(huán)節(jié):
1、進(jìn)程,線程,協(xié)程之間的區(qū)別是什么?
簡而言之,進(jìn)程是程序運(yùn)行和資源分配的基本單位,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存資源,減少切換次數(shù),從而效率更高。線程是進(jìn)程的一個(gè)實(shí)體,是cpu調(diào)度和分派的基本單位,是比程序更小的能獨(dú)立運(yùn)行的基本單位。同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。
2、你了解守護(hù)線程嗎?它和非守護(hù)線程有什么區(qū)別?
程序運(yùn)行完畢,jvm會(huì)等待非守護(hù)線程完成后關(guān)閉,但是jvm不會(huì)等待守護(hù)線程。守護(hù)線程最典型的例子就是GC線程。
3、什么是多線程上下文切換?
多線程的上下文切換是指CPU控制權(quán)由一個(gè)已經(jīng)正在運(yùn)行的線程切換到另外一個(gè)就緒并等待獲取CPU執(zhí)行權(quán)的線程的過程。
4、創(chuàng)建兩種線程的方式?他們有什么區(qū)別?
通過實(shí)現(xiàn)java.lang.Runnable或者通過擴(kuò)展java.lang.Thread類。相比擴(kuò)展Thread,實(shí)現(xiàn)Runnable接口可能更優(yōu).原因有二:
Java不支持多繼承。因此擴(kuò)展Thread類就代表這個(gè)子類不能擴(kuò)展其他類。而實(shí)現(xiàn)Runnable接口的類還可能擴(kuò)展另一個(gè)類。
類可能只要求可執(zhí)行即可,因此繼承整個(gè)Thread類的開銷過大。
5、Thread類中的start()和run()方法有什么區(qū)別?
start()方法被用來啟動(dòng)新創(chuàng)建的線程,而且start()內(nèi)部調(diào)用了run()方法,這和直接調(diào)用run()方法的效果不一樣。當(dāng)你調(diào)用run()方法的時(shí)候,只會(huì)是在原來的線程中調(diào)用,沒有新的線程啟動(dòng),start()方法才會(huì)啟動(dòng)新線程。
6、怎么檢測(cè)一個(gè)線程是否持有對(duì)象監(jiān)視器?
Thread類提供了一個(gè)holdsLock(Object obj)方法,當(dāng)且僅當(dāng)對(duì)象obj的監(jiān)視器被某條線程持有的時(shí)候才會(huì)返回true,注意這是一個(gè)static方法,這意味著”某條線程”指的是當(dāng)前線程。
7、Runnable和Callable的區(qū)別是什么?
Runnable接口中的run()方法的返回值是void,它做的事情只是純粹地去執(zhí)行run()方法中的代碼而已;Callable接口中的call()方法是有返回值的,是一個(gè)泛型,和Future、FutureTask配合可以用來獲取異步執(zhí)行的結(jié)果。
這其實(shí)是很有用的一個(gè)特性,因?yàn)槎嗑€程相比單線程更難、更復(fù)雜的一個(gè)重要原因就是因?yàn)槎嗑€程充滿著未知性,某條線程是否執(zhí)行了?某條線程執(zhí)行了多久?某條線程執(zhí)行的時(shí)候我們期望的數(shù)據(jù)是否已經(jīng)賦值完畢?無法得知,我們能做的只是等待這條多線程的任務(wù)執(zhí)行完畢而已。而Callable+Future/FutureTask卻可以方便獲取多線程運(yùn)行的結(jié)果,可以在等待時(shí)間太長沒獲取到需要的數(shù)據(jù)的情況下取消該線程的任務(wù)。
8、你知道哪些垃圾回收算法?
垃圾回收從理論上非常容易理解,具體的方法有以下幾種:
1. 標(biāo)記-清除
2. 標(biāo)記-復(fù)制
3. 標(biāo)記-整理
4. 分代回收
8、如何判斷一個(gè)對(duì)象是否應(yīng)該被回收?
這就是所謂的對(duì)象存活性判斷,常用的方法有兩種:1.引用計(jì)數(shù)法; 2.對(duì)象可達(dá)性分析。由于引用計(jì)數(shù)法存在互相引用導(dǎo)致無法進(jìn)行GC的問題,所以目前JVM虛擬機(jī)多使用對(duì)象可達(dá)性分析算法。
10、簡單的解釋一下垃圾回收?
Java 垃圾回收機(jī)制最基本的做法是分代回收。內(nèi)存中的區(qū)域被劃分成不同的世代,對(duì)象根據(jù)其存活的時(shí)間被保存在對(duì)應(yīng)世代的區(qū)域中。一般的實(shí)現(xiàn)是劃分成3個(gè)世代:年輕、年老和永久。內(nèi)存的分配是發(fā)生在年輕世代中的。當(dāng)一個(gè)對(duì)象存活時(shí)間足夠長的時(shí)候,它就會(huì)被復(fù)制到年老世代中。對(duì)于不同的世代可以使用不同的垃圾回收算法。進(jìn)行世代劃分的出發(fā)點(diǎn)是對(duì)應(yīng)用中對(duì)象存活時(shí)間進(jìn)行研究之后得出的統(tǒng)計(jì)規(guī)律。一般來說,一個(gè)應(yīng)用中的大部分對(duì)象的存活時(shí)間都很短。比如局部變量的存活時(shí)間就只在方法的執(zhí)行過程中。基于這一點(diǎn),對(duì)于年輕世代的垃圾回收算法就可以很有針對(duì)性。
11、調(diào)用System.gc()會(huì)發(fā)生什么?
通知GC開始工作,但是GC真正開始的時(shí)間不確定。
12、64位的JVM當(dāng)中,int的長度是多少?
Java 中,int 類型變量的長度是一個(gè)固定值,與平臺(tái)無關(guān),都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛擬機(jī)中,int 類型的長度是相同的。
13、int和Integer的區(qū)別?
Integer是int的包裝類型,在拆箱和裝箱中,二者自動(dòng)轉(zhuǎn)換。int是基本類型,直接存數(shù)值,而integer是對(duì)象,用一個(gè)引用指向這個(gè)對(duì)象。
14、int 和Integer誰占用的內(nèi)存更多?
Integer 對(duì)象會(huì)占用更多的內(nèi)存。Integer是一個(gè)對(duì)象,需要存儲(chǔ)對(duì)象的元數(shù)據(jù)。但是 int 是一個(gè)原始類型的數(shù)據(jù),所以占用的空間更少。
15、String, StringBuffer和StringBuilder區(qū)別?
String是字符串常量,final修飾:StringBuffer字符串變量(線程安全);
StringBuilder 字符串變量(線程不安全)。
16、String和StringBuffer?
String和StringBuffer主要區(qū)別是性能:String是不可變對(duì)象,每次對(duì)String類型進(jìn)行操作都等同于產(chǎn)生了一個(gè)新的String對(duì)象,然后指向新的String對(duì)象。所以盡量不在對(duì)String進(jìn)行大量的拼接操作,否則會(huì)產(chǎn)生很多臨時(shí)對(duì)象,導(dǎo)致GC開始工作,影響系統(tǒng)性能。
StringBuffer是對(duì)對(duì)象本身操作,而不是產(chǎn)生新的對(duì)象,因此在有大量拼接的情況下,我們建議使用StringBuffer。
但是需要注意現(xiàn)在JVM會(huì)對(duì)String拼接做一定的優(yōu)化:
String s=“This is only ”+”simple”+”test”會(huì)被虛擬機(jī)直接優(yōu)化成String s=“This is only simple test”,此時(shí)就不存在拼接過程。
17、StringBuffer和StringBuilder
StringBuffer是線程安全的可變字符串,其內(nèi)部實(shí)現(xiàn)是可變數(shù)組。StringBuilder是jdk 1.5新增的,其功能和StringBuffer類似,但是非線程安全。因此,在沒有多線程問題的前提下,使用StringBuilder會(huì)取得更好的性能。
18、什么是編譯器常量?使用它有什么風(fēng)險(xiǎn)?
公共靜態(tài)不可變(public static final )變量也就是我們所說的編譯期常量,這里的 public 可選的。實(shí)際上這些變量在編譯時(shí)會(huì)被替換掉,因?yàn)榫幾g器知道這些變量的值,并且知道這些變量在運(yùn)行時(shí)不能改變。這種方式存在的一個(gè)問題是你使用了一個(gè)內(nèi)部的或第三方庫中的公有編譯時(shí)常量,但是這個(gè)值后面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經(jīng)部署了一個(gè)新的jar。為了避免這種情況,當(dāng)你在更新依賴 JAR 文件時(shí),確保重新編譯你的程序。
19、java當(dāng)中使用什么類型表示價(jià)格比較好?
如果不是特別關(guān)心內(nèi)存和性能的話,使用BigDecimal,否則使用預(yù)定義精度的 double 類型。
20、如何將byte轉(zhuǎn)為String?
可以使用 String 接收 byte[] 參數(shù)的構(gòu)造器來進(jìn)行轉(zhuǎn)換,需要注意的點(diǎn)是要使用的正確的編碼,否則會(huì)使用平臺(tái)默認(rèn)編碼,這個(gè)編碼可能跟原來的編碼相同,也可能不同。
21、可以將int強(qiáng)轉(zhuǎn)為byte類型么?會(huì)產(chǎn)生什么問題?
我們可以做強(qiáng)制轉(zhuǎn)換,但是Java中int是32位的而byte是8 位的,所以,如果強(qiáng)制轉(zhuǎn)化int類型的高24位將會(huì)被丟棄,byte 類型的范圍是從-128到128
以上就是動(dòng)力節(jié)點(diǎn)java學(xué)院小編整理的“Java開發(fā)實(shí)用的面試題及參考答案分享”內(nèi)容,希望可以幫到您~
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743