什么是線程局部變量?
線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有,不在多個(gè)線程間共享。Java提供ThreadLocal類來(lái)支持線程局部變量,是一種實(shí)現(xiàn)線程安全的方式。但是在管理環(huán)境下(如web服務(wù)器)使用線程局部變量的時(shí)候要特別小心,在這種情況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長(zhǎng)。任何線程局部變量一旦在工作完成后沒(méi)有釋放,Java應(yīng)用就存在內(nèi)存泄露的風(fēng)險(xiǎn)。
用wait-notify寫一段代碼來(lái)解決生產(chǎn)者-消費(fèi)者問(wèn)題?
請(qǐng)參考答案中的示例代碼。只要記住在同步塊中調(diào)用wait()和notify()方法,如果阻塞,通過(guò)循環(huán)來(lái)測(cè)試等待條件。
用Java寫一個(gè)線程安全的單例模式(Singleton)?
請(qǐng)參考答案中的示例代碼,這里面一步一步教你創(chuàng)建一個(gè)線程安全的Java單例類。當(dāng)我們說(shuō)線程安全時(shí),意思是即使初始化是在多線程環(huán)境中,仍然能保證單個(gè)實(shí)例。Java中,使用枚舉作為單例類是最簡(jiǎn)單的方式來(lái)創(chuàng)建線程安全單例模式的方式。
Java中sleep方法和wait方法的區(qū)別?
雖然兩者都是用來(lái)暫停當(dāng)前運(yùn)行的線程,但是sleep()實(shí)際上只是短暫停頓,因?yàn)樗粫?huì)釋放鎖,而wait()意味著條件等待,這就是為什么該方法要釋放鎖,因?yàn)橹挥羞@樣,其他等待的線程才能在滿足條件時(shí)獲取到該鎖。
什么是不可變對(duì)象(immutableobject)?Java中怎么創(chuàng)建一個(gè)不可變對(duì)象?
不可變對(duì)象指對(duì)象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會(huì)創(chuàng)建一個(gè)新的對(duì)象,如String、Integer及其它包裝類。詳情參見(jiàn)答案,一步一步指導(dǎo)你在Java中創(chuàng)建一個(gè)不可變的類。
我們能創(chuàng)建一個(gè)包含可變對(duì)象的不可變對(duì)象嗎?
是的,我們是可以創(chuàng)建一個(gè)包含可變對(duì)象的不可變對(duì)象的,你只需要謹(jǐn)慎一點(diǎn),不要共享可變對(duì)象的引用就可以了,如果需要變化時(shí),就返回原對(duì)象的一個(gè)拷貝。最常見(jiàn)的例子就是對(duì)象中包含一個(gè)日期對(duì)象的引用。
數(shù)據(jù)類型和Java基礎(chǔ)面試問(wèn)題
Java中應(yīng)該使用什么數(shù)據(jù)類型來(lái)代表價(jià)格?
如果不是特別關(guān)心內(nèi)存和性能的話,使用BigDecimal,否則使用預(yù)定義精度的double類型。
怎么將byte轉(zhuǎn)換為String?
可以使用String接收byte[]參數(shù)的構(gòu)造器來(lái)進(jìn)行轉(zhuǎn)換,需要注意的點(diǎn)是要使用的正確的編碼,否則會(huì)使用平臺(tái)默認(rèn)編碼,這個(gè)編碼可能跟原來(lái)的編碼相同,也可能不同。
Java中怎樣將bytes轉(zhuǎn)換為long類型?
這個(gè)問(wèn)題你來(lái)回答:-)
我們能將int強(qiáng)制轉(zhuǎn)換為byte類型的變量嗎?如果該值大于byte類型的范圍,將會(huì)出現(xiàn)什么現(xiàn)象?
是的,我們可以做強(qiáng)制轉(zhuǎn)換,但是Java中int是32位的,而byte是8位的,所以,如果強(qiáng)制轉(zhuǎn)化是,int類型的高24位將會(huì)被丟棄,byte類型的范圍是從-128到128。
以上就是深圳達(dá)內(nèi)教育Java培訓(xùn)機(jī)構(gòu)小編介紹的“不得不會(huì)的Java程序員面試題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。