一個扎手的Java問題,假如Java編程言語不是你規(guī)劃的,你怎么能答復(fù)這個問題呢。Java編程的常識和深化了解有助于答復(fù)這種扎手的Java核心方面的面試問題。
為什么wait,notify和notifyAll是在Object類中界說的而不是在Thread類中界說
這是有名的Java面試問題,招2~4年經(jīng)歷的到高級Java開發(fā)人員面試都或許碰到。
這個問題的好在它能反映了面試者對等候通知機(jī)制的了解,以及他對此主題的理解是否明確。就像為什么Java中不支撐多承繼或者為什么String在Java中是final的問題相同,這個問題也或許有多個答案。
為什么在Object類中界說wait和notify辦法,每個人都能說出一些理由。從我的面試經(jīng)歷來看,wait和nofity仍然是大多數(shù)Java程序員最困惑的,特別是2到3年的開發(fā)人員,假如他們要求運用wait和notify,他們會很困惑。因而,假如你去參加Java面試,請確保對wait和notify機(jī)制有充沛的了解,而且能夠輕松地運用wait來編寫代碼,并經(jīng)過生產(chǎn)者-消費者問題或完成阻塞行列等了解通知的機(jī)制。
為什么等候和通知需求從同步塊或辦法中調(diào)用,以及Java中的wait,sleep和yield辦法之間的差異,假如你還沒有讀過,你會覺得風(fēng)趣。為何wait,notify和notifyAll屬于Object類?為什么它們不應(yīng)該在Thread類中?以下是我以為有含義的一些主意:
1)wait和notify不僅僅是一般辦法或同步東西,更重要的是它們是Java中兩個線程之間的通訊機(jī)制。對言語規(guī)劃者而言,假如不能經(jīng)過Java關(guān)鍵字(例如synchronized)完成通訊此機(jī)制,同時又要確保這個機(jī)制對每個方針可用,那么Object類則是的正確聲明位置。記住同步和等候通知是兩個不同的范疇,不要把它們看成是相同的或相關(guān)的。同步是供給互斥并確保Java類的線程安全,而wait和notify是兩個線程之間的通訊機(jī)制。
2)每個方針都可上鎖,這是在Object類而不是Thread類中聲明wait和notify的另一個原因。
3)在Java中為了進(jìn)入代碼的臨界區(qū),線程需求確定并等候確定,他們不知道哪些線程持有鎖,而僅僅知道鎖被某個線程持有,而且他們應(yīng)該等候獲得鎖,而不是去了解哪個線程在同步塊內(nèi),并懇求它們開釋確定。
4)Java是根據(jù)Hoare的監(jiān)視器的思想(http://en.wikipedia.org/wiki/…。在Java中,一切方針都有一個監(jiān)視器。
線程在監(jiān)視器上等候,為履行等候,咱們需求2個參數(shù):
一個線程
一個監(jiān)視器(任何方針)
在Java規(guī)劃中,線程不能被指定,它總是運行當(dāng)前代碼的線程。但是,咱們能夠指定監(jiān)視器(這是咱們稱之為等候的方針)。這是一個很好的規(guī)劃,因為假如咱們能夠讓任何其他線程在所需的監(jiān)視器上等候,這將導(dǎo)致“侵略”,導(dǎo)致在規(guī)劃并發(fā)程序時會遇到困難。請記住,在Java中,一切在另一個線程的履行中侵入的操作都被棄用了(例如stop辦法)。
為什么Java不支撐運算符重載?
另一個相似扎手的Java問題。為什么C++支撐運算符重載而Java不支撐?有人或許會說+運算符在Java中已被重載用于字符串連接,不要被這些論據(jù)所欺騙。
與C++不同,Java不支撐運算符重載。Java不能為程序員供給自在的標(biāo)準(zhǔn)算術(shù)運算符重載,例如+,-,*和/等。假如你曾經(jīng)用過C++,那么Java與C++比較少了很多功用,例如Java不支撐多重承繼,Java中沒有指針,Java中沒有引證傳遞。另一個相似的問題是關(guān)于Java經(jīng)過引證傳遞,這首要表現(xiàn)為Java是經(jīng)過值仍是引證傳參。盡管我不知道背后的真實原因,但我以為以下說法有些道理,為什么Java不支撐運算符重載。
1)簡略性和明晰性。明晰性是Java規(guī)劃者的方針之一。規(guī)劃者不是只想復(fù)制言語,而是希望具有一種明晰,真實面向方針的言語。添加運算符重載比沒有它肯定會使規(guī)劃更雜亂,而且它或許導(dǎo)致更雜亂的編譯器,或減慢JVM,因為它需求做額定的工作來辨認(rèn)運算符的實際含義,并削減優(yōu)化的時機(jī),以確保Java中運算符的行為。
2)避免編程錯誤。Java不允許用戶界說的運算符重載,因為假如允許程序員進(jìn)行運算符重載,將為同一運算符賦予多種含義,這將使任何開發(fā)人員的學(xué)習(xí)曲線變得峻峭,工作變得更加混亂。據(jù)觀察,當(dāng)言語支撐運算符重載時,編程錯誤解添加,然后添加了開發(fā)和交付時間。因為Java和JVM已經(jīng)承擔(dān)了大多數(shù)開發(fā)人員的職責(zé),如在經(jīng)過供給廢物收集器進(jìn)行內(nèi)存辦理時,因為這個功用添加污染代碼的時機(jī),成為編程錯誤之源,因而沒有多大含義。
3)JVM雜亂性。從JVM的角度來看,支撐運算符重載使問題變得更加困難。經(jīng)過更直觀,更干凈的辦法運用辦法重載也能完成相同的工作,因而不支撐Java中的運算符重載是有含義的。與相對簡略的JVM比較,雜亂的JVM或許導(dǎo)致JVM更慢,并為確保在Java中運算符行為確實定性然后削減了優(yōu)化代碼的時機(jī)。
4)讓開發(fā)東西處理更簡單。這是在Java中不支撐運算符重載的另一個優(yōu)點。省掉運算符重載使言語更簡單處理,這反過來又更簡單開發(fā)處理言語的東西,例如IDE或重構(gòu)東西。Java中的重構(gòu)東西遠(yuǎn)勝于C++。
為什么char數(shù)組比Java中的String更適合存儲暗碼?
另一個根據(jù)String的扎手Java問題,相信我只有很少的Java程序員能夠正確答復(fù)這個問題。這是一個真實艱難的核心Java面試問題,而且需求對String的扎實知識才干答復(fù)這個問題。
這是最近在Java面試中向我的一位朋友問詢的問題。他正在接受技能主管職位的面試,而且有超越6年的經(jīng)歷。假如你還沒有遇到過這種狀況,那么字符數(shù)組和字符串能夠用來存儲文本數(shù)據(jù),但是挑選一個而不是另一個很難。但正如我的朋友所說,任何與String相關(guān)的問題都必須對字符串的特殊特點有一些線索,比方不變性,他用它來說服訪發(fā)問的人。在這里,咱們將討論為什么你應(yīng)該運用char[]存儲暗碼而不是String的一些原因。
字符串:1)因為字符串在Java中是不可變的,假如你將暗碼存儲為純文本,它將在內(nèi)存中可用,直到廢物收集器清除它.而且為了可重用性,會存在String在字符串池中,它很或許會保留在內(nèi)存中持續(xù)很長時間,然后構(gòu)成安全威脅。
因為任何有權(quán)拜訪內(nèi)存轉(zhuǎn)儲的人都能夠以明文方式找到暗碼,這是另一個原因,你應(yīng)該一直運用加密暗碼而不是純文本。因為字符串是不可變的,所以不能更改字符串的內(nèi)容,因為任何更改都會發(fā)生新的字符串,而假如你運用char[],你就能夠?qū)⒁磺性卦O(shè)置為空白或零。因而,在字符數(shù)組中存儲暗碼能夠顯著下降竊取暗碼的安全危險。
2)Java自身主張運用JPasswordField的getPassword()辦法,該辦法回來一個char[]和不引薦運用的getTex()辦法,該辦法以明文方式回來暗碼,因為安全原因。應(yīng)遵循Java團(tuán)隊的主張,堅持標(biāo)準(zhǔn)而不是反對它。
3)運用String時,總是存在在日志文件或操控臺中打印純文本的危險,但假如運用Array,則不會打印數(shù)組的內(nèi)容而是打印其內(nèi)存位置。盡管不是一個真實的原因,但仍然有道理。
StringstrPassword=“Unknown”;
char[]charPassword=newchar[]{‘U’,’n’,’k’,’w’,’o’,’n’};
System.out.println(“字符暗碼:”+strPassword);
System.out.println(“字符暗碼:”+charPassword);
輸出
字符串暗碼:Unknown
我還主張運用散列或加密的暗碼而不是純文本,并在驗證完成后立即從內(nèi)存中清除它。因而,在Java中,用字符數(shù)組用存儲暗碼比字符串是更好的挑選。盡管僅運用char[]還不行,還你需求擦除內(nèi)容才干更安全。
以上便是小編介紹的“比較難的java經(jīng)典面試題及答案”的內(nèi)容,希望對我們有幫助,關(guān)注動力節(jié)點,想了解更多Java技能知識留言給小編。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號