黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 程序員Java常見的筆試題總結(jié)

程序員Java常見的筆試題總結(jié)

更新時(shí)間:2020-03-12 10:17:46 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2040次


  1.為什么等待和通知是在Object類而不是Thread中聲明的?


  一個(gè)棘手的Java問題,如果Java編程語言不是你設(shè)計(jì)的,你怎么能回答這個(gè)問題呢。Java編程的常識(shí)和深入了解有助于回答這種棘手的Java核心方面的面試問題。


  為什么wait,notify和notifyAll是在Object類中定義的而不是在Thread類中定義


  這是有名的Java面試問題,招2~4年經(jīng)驗(yàn)的到高級(jí)Java開發(fā)人員面試都可能碰到。


  這個(gè)問題的好在它能反映了面試者對(duì)等待通知機(jī)制的了解,以及他對(duì)此主題的理解是否明確。就像為什么Java中不支持多繼承或者為什么String在Java中是final的問題一樣,這個(gè)問題也可能有多個(gè)答案。


  為什么在Object類中定義wait和notify方法,每個(gè)人都能說出一些理由。從我的面試經(jīng)驗(yàn)來看,wait和nofity仍然是大多數(shù)Java程序員最困惑的,特別是2到3年的開發(fā)人員,如果他們要求使用wait和notify,他們會(huì)很困惑。因此,如果你去參加Java面試,請(qǐng)確保對(duì)wait和notify機(jī)制有充分的了解,并且可以輕松地使用wait來編寫代碼,并通過生產(chǎn)者-消費(fèi)者問題或?qū)崿F(xiàn)阻塞隊(duì)列等了解通知的機(jī)制。


  為什么等待和通知需要從同步塊或方法中調(diào)用,以及Java中的wait,sleep和yield方法之間的差異,如果你還沒有讀過,你會(huì)覺得有趣。為何wait,notify和notifyAll屬于Object類?為什么它們不應(yīng)該在Thread類中?以下是我認(rèn)為有意義的一些想法:


  1)wait和notify不僅僅是普通方法或同步工具,更重要的是它們是Java中兩個(gè)線程之間的通信機(jī)制。對(duì)語言設(shè)計(jì)者而言,如果不能通過Java關(guān)鍵字(例如synchronized)實(shí)現(xiàn)通信此機(jī)制,同時(shí)又要確保這個(gè)機(jī)制對(duì)每個(gè)對(duì)象可用,那么Object類則是的正確聲明位置。記住同步和等待通知是兩個(gè)不同的領(lǐng)域,不要把它們看成是相同的或相關(guān)的。同步是提供互斥并確保Java類的線程安全,而wait和notify是兩個(gè)線程之間的通信機(jī)制。


  2)每個(gè)對(duì)象都可上鎖,這是在Object類而不是Thread類中聲明wait和notify的另一個(gè)原因。


  3)在Java中為了進(jìn)入代碼的臨界區(qū),線程需要鎖定并等待鎖定,他們不知道哪些線程持有鎖,而只是知道鎖被某個(gè)線程持有,并且他們應(yīng)該等待取得鎖,而不是去了解哪個(gè)線程在同步塊內(nèi),并請(qǐng)求它們釋放鎖定。


  4)Java是基于Hoare的監(jiān)視器的思想(http://en.wikipedia.org/wiki/…。在Java中,所有對(duì)象都有一個(gè)監(jiān)視器。


  線程在監(jiān)視器上等待,為執(zhí)行等待,我們需要2個(gè)參數(shù):


  一個(gè)線程


  一個(gè)監(jiān)視器(任何對(duì)象)


  在Java設(shè)計(jì)中,線程不能被指定,它總是運(yùn)行當(dāng)前代碼的線程。但是,我們可以指定監(jiān)視器(這是我們稱之為等待的對(duì)象)。這是一個(gè)很好的設(shè)計(jì),因?yàn)槿绻覀兛梢宰屓魏纹渌€程在所需的監(jiān)視器上等待,這將導(dǎo)致“入侵”,導(dǎo)致在設(shè)計(jì)并發(fā)程序時(shí)會(huì)遇到困難。請(qǐng)記住,在Java中,所有在另一個(gè)線程的執(zhí)行中侵入的操作都被棄用了(例如stop方法)。


  這10道Java面試題!大部分的人回答不出來


  2.為什么Java中不支持多重繼承?


  我發(fā)現(xiàn)這個(gè)Java核心問題很難回答,因?yàn)槟愕拇鸢缚赡懿粫?huì)讓面試官滿意,在大多數(shù)情況下,面試官正在尋找答案中的關(guān)鍵點(diǎn),如果你提到這些關(guān)鍵點(diǎn),面試官會(huì)很高興。在Java中回答這種棘手問題的關(guān)鍵是準(zhǔn)備好相關(guān)主題,以應(yīng)對(duì)后續(xù)的各種可能的問題。


  這是非常經(jīng)典的問題,與為什么String在Java中是不可變的很類似;這兩個(gè)問題之間的相似之處在于它們主要是由Java創(chuàng)作者的設(shè)計(jì)決策使然。


  為什么Java不支持多重繼承,可以考慮以下兩點(diǎn):


  1)第一個(gè)原因是圍繞鉆石形繼承問題產(chǎn)生的歧義,考慮一個(gè)類A有foo()方法,然后B和C派生自A,并且有自己的foo()實(shí)現(xiàn),現(xiàn)在D類使用多個(gè)繼承派生自B和C,如果我們只引用foo(),編譯器將無法決定它應(yīng)該調(diào)用哪個(gè)foo()。這也稱為Diamond問題,因?yàn)檫@個(gè)繼承方案的結(jié)構(gòu)類似于菱形,見下圖:


  Afoo()


  /


  /


  foo()BCfoo()


  /


  /


  Dfoo()


  即使我們刪除鉆石的頂部A類并允許多重繼承,我們也將看到這個(gè)問題含糊性的一面。如果你把這個(gè)理由告訴面試官,他會(huì)問為什么C++可以支持多重繼承而Java不行。嗯,在這種情況下,我會(huì)試著向他解釋我下面給出的第二個(gè)原因,它不是因?yàn)榧夹g(shù)難度,而是更多的可維護(hù)和更清晰的設(shè)計(jì)是驅(qū)動(dòng)因素,雖然這只能由Java言語設(shè)計(jì)師確認(rèn),我們只是推測(cè)。維基百科鏈接有一些很好的解釋,說明在使用多重繼承時(shí),由于鉆石問題,不同的語言地址問題是如何產(chǎn)生的。


  2)對(duì)我來說第二個(gè)也是更有說服力的理由是,多重繼承確實(shí)使設(shè)計(jì)復(fù)雜化并在轉(zhuǎn)換、構(gòu)造函數(shù)鏈接等過程中產(chǎn)生問題。假設(shè)你需要多重繼承的情況并不多,簡(jiǎn)單起見,明智的決定是省略它。此外,Java可以通過使用接口支持單繼承來避免這種歧義。由于接口只有方法聲明而且沒有提供任何實(shí)現(xiàn),因此只有一個(gè)特定方法的實(shí)現(xiàn),因此不會(huì)有任何歧義。


  3.為什么Java不支持運(yùn)算符重載?


  另一個(gè)類似棘手的Java問題。為什么C++支持運(yùn)算符重載而Java不支持?有人可能會(huì)說+運(yùn)算符在Java中已被重載用于字符串連接,不要被這些論據(jù)所欺騙。


  與C++不同,Java不支持運(yùn)算符重載。Java不能為程序員提供自由的標(biāo)準(zhǔn)算術(shù)運(yùn)算符重載,例如+,-,*和/等。如果你以前用過C++,那么Java與C++相比少了很多功能,例如Java不支持多重繼承,Java中沒有指針,Java中沒有引用傳遞。另一個(gè)類似的問題是關(guān)于Java通過引用傳遞,這主要表現(xiàn)為Java是通過值還是引用傳參。雖然我不知道背后的真正原因,但我認(rèn)為以下說法有些道理,為什么Java不支持運(yùn)算符重載。


  1)簡(jiǎn)單性和清晰性。清晰性是Java設(shè)計(jì)者的目標(biāo)之一。設(shè)計(jì)者不是只想復(fù)制語言,而是希望擁有一種清晰,真正面向?qū)ο蟮恼Z言。添加運(yùn)算符重載比沒有它肯定會(huì)使設(shè)計(jì)更復(fù)雜,并且它可能導(dǎo)致更復(fù)雜的編譯器,或減慢JVM,因?yàn)樗枰鲱~外的工作來識(shí)別運(yùn)算符的實(shí)際含義,并減少優(yōu)化的機(jī)會(huì),以保證Java中運(yùn)算符的行為。


  2)避免編程錯(cuò)誤。Java不允許用戶定義的運(yùn)算符重載,因?yàn)槿绻试S程序員進(jìn)行運(yùn)算符重載,將為同一運(yùn)算符賦予多種含義,這將使任何開發(fā)人員的學(xué)習(xí)曲線變得陡峭,事情變得更加混亂。據(jù)觀察,當(dāng)語言支持運(yùn)算符重載時(shí),編程錯(cuò)誤會(huì)增加,從而增加了開發(fā)和交付時(shí)間。由于Java和JVM已經(jīng)承擔(dān)了大多數(shù)開發(fā)人員的責(zé)任,如在通過提供垃圾收集器進(jìn)行內(nèi)存管理時(shí),因?yàn)檫@個(gè)功能增加污染代碼的機(jī)會(huì),成為編程錯(cuò)誤之源,因此沒有多大意義。


  3)JVM復(fù)雜性。從JVM的角度來看,支持運(yùn)算符重載使問題變得更加困難。通過更直觀,更干凈的方式使用方法重載也能實(shí)現(xiàn)同樣的事情,因此不支持Java中的運(yùn)算符重載是有意義的。與相對(duì)簡(jiǎn)單的JVM相比,復(fù)雜的JVM可能導(dǎo)致JVM更慢,并為保證在Java中運(yùn)算符行為的確定性從而減少了優(yōu)化代碼的機(jī)會(huì)。


  4)讓開發(fā)工具處理更容易。這是在Java中不支持運(yùn)算符重載的另一個(gè)好處。省略運(yùn)算符重載使語言更容易處理,這反過來又更容易開發(fā)處理語言的工具,例如IDE或重構(gòu)工具。Java中的重構(gòu)工具遠(yuǎn)勝于C++。


  4.為什么String在Java中是不可變的?


  我最喜歡的Java面試問題,很棘手,但同時(shí)也非常有用。一些面試者也常問這個(gè)問題,為什么String在Java中是final的。


  字符串在Java中是不可變的,因?yàn)镾tring對(duì)象緩存在String池中。由于緩存的字符串在多個(gè)客戶之間共享,因此始終存在風(fēng)險(xiǎn),其中一個(gè)客戶的操作會(huì)影響所有其他客戶。例如,如果一段代碼將String“Test”的值更改為“TEST”,則所有其他客戶也將看到該值。由于String對(duì)象的緩存性能是很重要的一方面,因此通過使String類不可變來避免這種風(fēng)險(xiǎn)。


  同時(shí),String是final的,因此沒有人可以通過擴(kuò)展和覆蓋行為來破壞String類的不變性、緩存、散列值的計(jì)算等。String類不可變的另一個(gè)原因可能是由于HashMap。


  由于把字符串作為HashMap鍵很受歡迎。對(duì)于鍵值來說,重要的是它們是不可變的,以便用它們檢索存儲(chǔ)在HashMap中的值對(duì)象。由于HashMap的工作原理是散列,因此需要具有相同的值才能正常運(yùn)行。如果在插入后修改了String的內(nèi)容,可變的String將在插入和檢索時(shí)生成兩個(gè)不同的哈希碼,可能會(huì)丟失Map中的值對(duì)象。


  如果你是印度板球迷,你可能能夠與我的下一句話聯(lián)系起來。字符串是Java的VVSLaxman,即非常特殊的類。我還沒有看到一個(gè)沒有使用String編寫的Java程序。這就是為什么對(duì)String的充分理解對(duì)于Java開發(fā)人員來說非常重要。


  String作為數(shù)據(jù)類型,傳輸對(duì)象和中間人角色的重要性和流行性也使這個(gè)問題在Java面試中很常見。


  為什么String在Java中是不可變的是Java中最常被問到的字符串訪問問題之一,它首先討論了什么是String,Java中的String如何與C和C++中的String不同,然后轉(zhuǎn)向在Java中什么是不可變對(duì)象,不可變對(duì)象有什么好處,為什么要使用它們以及應(yīng)該使用哪些場(chǎng)景。這個(gè)問題有時(shí)也會(huì)問:“為什么String在Java中是final的”。在類似的說明中,如果你正在準(zhǔn)備Java面試,我建議你看看Java編程面試公開書,這是高級(jí)和中級(jí)Java程序員的優(yōu)秀資源。它包含來自所有重要Java主題的問題,包括多線程,集合,GC,JVM內(nèi)部以及Spring和Hibernate框架等。


  正如我所說,這個(gè)問題可能有很多可能的答案,而String類的唯一設(shè)計(jì)者可以放心地回答它。我在JoshuaBloch的EffectiveJava書中期待一些線索,但他也沒有提到它。我認(rèn)為以下幾點(diǎn)解釋了為什么String類在Java中是不可變的或final的:


  1)想象字符串池沒有使字符串不可變,它根本不可能,因?yàn)樵谧址氐那闆r下,一個(gè)字符串對(duì)象/文字,例如“Test”已被許多參考變量引用,因此如果其中任何一個(gè)更改了值,其他參數(shù)將自動(dòng)受到影響,即假設(shè)


  StringA="Test";


  StringB="Test";


  現(xiàn)在字符串B調(diào)用"Test".toUpperCase(),將同一個(gè)對(duì)象改為“TEST”,所以A也是“TEST”,這不是期望的結(jié)果。


  下圖顯示了如何在堆內(nèi)存和字符串池中創(chuàng)建字符串。


程序員Java常見的筆試題總結(jié)


  2)字符串已被廣泛用作許多Java類的參數(shù),例如,為了打開網(wǎng)絡(luò)連接,你可以將主機(jī)名和端口號(hào)作為字符串傳遞,你可以將數(shù)據(jù)庫URL作為字符串傳遞,以打開數(shù)據(jù)庫連接,你可以通過將文件名作為參數(shù)傳遞給FileI/O類來打開Java中的任何文件。如果String不是不可變的,這將導(dǎo)致嚴(yán)重的安全威脅,我的意思是有人可以訪問他有權(quán)授權(quán)的任何文件,然后可以故意或意外地更改文件名并獲得對(duì)該文件的訪問權(quán)限。由于不變性,你無需擔(dān)心這種威脅。這個(gè)原因也說明了,為什么String在Java中是最終的,通過使java.lang.Stringfinal,Java設(shè)計(jì)者確保沒有人覆蓋String類的任何行為。


  3)由于String是不可變的,它可以安全地共享許多線程,這對(duì)于多線程編程非常重要.并且避免了Java中的同步問題,不變性也使得String實(shí)例在Java中是線程安全的,這意味著你不需要從外部同步String操作。關(guān)于String的另一個(gè)要點(diǎn)是由截取字符串SubString引起的內(nèi)存泄漏,這不是與線程相關(guān)的問題,但也是需要注意的。


  4)為什么String在Java中是不可變的另一個(gè)原因是允許String緩存其哈希碼,Java中的不可變String緩存其哈希碼,并且不會(huì)在每次調(diào)用String的hashcode方法時(shí)重新計(jì)算,這使得它在Java中的HashMap中使用的HashMap鍵非常快。簡(jiǎn)而言之,因?yàn)镾tring是不可變的,所以沒有人可以在創(chuàng)建后更改其內(nèi)容,這保證了String的hashCode在多次調(diào)用時(shí)是相同的。


  5)String不可變的絕對(duì)最重要的原因是它被類加載機(jī)制使用,因此具有深刻和基本的安全考慮。如果String是可變的,加載“java.io.Writer”的請(qǐng)求可能已被更改為加載“mil.vogoon.DiskErasingWriter”.安全性和字符串池是使字符串不可變的主要原因。順便說一句,上面的理由很好回答另一個(gè)Java面試問題:“為什么String在Java中是最終的”。要想是不可變的,你必須是最終的,這樣你的子類不會(huì)破壞不變性。你怎么看?


程序員Java常見的筆試題總結(jié)


    以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“程序員Java常見的筆試題總結(jié)”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。


提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久久国产精品免费 | 97黄色网| 五月天免费在线视频 | 一本大道香蕉高清视频在线 | 精品色视频 | 久久久免费的精品 | 丁香婷婷综合五月综合色啪 | 成人精品视频 成人影院 | 日韩欧美精品在线 | 色播影视| 久久精品九九亚洲精品天堂 | 欧美日韩在线视频播放 | 亚洲国产成人久久综合一区 | 欧美一级爱爱 | 在线观看麻豆国产精品 | 国产成人高清精品免费软件 | 深夜www| 主播蜜汁丝袜 精品自拍 | 成人羞羞视频在线 | 亚洲九九色 | 久青草国产在视频在线观看 | 中文字幕视频在线观看 | 欧美性猛交xxxx免费看蜜桃 | 日韩在线伦理片免费观看 | 欧美在线视频免费 | 天天爽天天射 | 特级黄色一级片 | 国产旗袍丝袜在线观看视频 | 日韩狠狠操 | 免费日韩精品 | 国产亚洲欧美日韩综合另类 | 毛片毛多 | 亚洲三级a | 亚洲视频一区二区三区 | 成人二区 | 国内一级野外a一级毛片 | 一个人看的www视频免费观看 | 殴美在线 | 午夜剧场一级片 | 午夜视频网站在线观看 | 男女激情视频网站 |