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

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 最新java面試題及答案整理

最新java面試題及答案整理

更新時間:2020-02-06 10:25:45 來源:動力節點 瀏覽2806次


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


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


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


  這是有名的Java面試問題,招2~4年經驗的到高級Java開發人員面試都可能碰到。


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


  為什么在Object類中定義wait和notify方法,每個人都能說出一些理由。從我的面試經驗來看,wait和nofity仍然是大多數Java程序員最困惑的,特別是2到3年的開發人員,如果他們要求使用wait和notify,他們會很困惑。因此,如果你去參加Java面試,請確保對wait和notify機制有充分的了解,并且可以輕松地使用wait來編寫代碼,并通過生產者-消費者問題或實現阻塞隊列等了解通知的機制。


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


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


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


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


  4)Java是基于Hoare的監視器的思想。在Java中,所有對象都有一個監視器。


  線程在監視器上等待,為執行等待,我們需要2個參數:


  一個線程


  一個監視器(任何對象)


  在Java設計中,線程不能被指定,它總是運行當前代碼的線程。但是,我們可以指定監視器(這是我們稱之為等待的對象)。這是一個很好的設計,因為如果我們可以讓任何其他線程在所需的監視器上等待,這將導致“入侵”,導致在設計并發程序時會遇到困難。請記住,在Java中,所有在另一個線程的執行中侵入的操作都被棄用了(例如stop方法)。


  如果你的Serializable類包含一個不可序列化的成員,會發生什么?你是如何解決的?


  任何序列化該類的嘗試都會因NotSerializableException而失敗,但這可以通過在Java中為static設置瞬態(trancient)變量來輕松解決。


  Java序列化相關的常見問題


  Java序列化是一個重要概念,但它很少用作持久性解決方案,開發人員大多忽略了Java序列化API。根據我的經驗,Java序列化在任何Java核心內容面試中都是一個相當重要的話題,在幾乎所有的網面試中,我都遇到過一兩個Java序列化問題,我看過一次面試,在問幾個關于序列化的問題之后候選人開始感到不自在,因為缺乏這方面的經驗。


  他們不知道如何在Java中序列化對象,或者他們不熟悉任何Java示例來解釋序列化,忘記了諸如序列化在Java中如何工作,什么是標記接口,標記接口的目的是什么,瞬態變量和可變變量之間的差異,可序列化接口具有多少種方法,在Java中,Serializable和Externalizable有什么區別,或者在引入注解之后,為什么不用@Serializable注解或替換Serializalbe接口。


  最新java面試題及答案整理


  在本文中,我們將從初學者和高級別進行提問,這對新手和具有多年Java開發經驗的高級開發人員同樣有益。


  關于Java序列化的10個面試問題


  大多數商業項目使用數據庫或內存映射文件或只是普通文件,來滿足持久性要求,只有很少的項目依賴于Java中的序列化過程。無論如何,這篇文章不是Java序列化教程或如何序列化在Java的對象,但有關序列化機制和序列化API的面試問題,這是值得去任何Java面試前先看看以免讓一些未知的內容驚到自己。


  對于那些不熟悉Java序列化的人,Java序列化是用來通過將對象的狀態存儲到帶有.ser擴展名的文件來序列化Java中的對象的過程,并且可以通過這個文件恢復重建Java對象狀態,這個逆過程稱為deserialization。


  什么是Java序列化


  序列化是把對象改成可以存到磁盤或通過網絡發送到其他運行中的Java虛擬機的二進制格式的過程,并可以通過反序列化恢復對象狀態.Java序列化API給開發人員提供了一個標準機制,通過java.io.Serializable和java.io.Externalizable接口,ObjectInputStream及ObjectOutputStream處理對象序列化.Java程序員可自由選擇基于類結構的標準序列化或是他們自定義的二進制格式,通常認為后者才是最佳實踐,因為序列化的二進制文件格式成為類輸出API的一部分,可能破壞Java中私有和包可見的屬性的封裝.


  如何序列化


  讓Java中的類可以序列化很簡單.你的Java類只需要實現java.io.Serializable接口,JVM就會把Object對象按默認格式序列化.讓一個類是可序列化的需要有意為之.類可序列會可能為是一個長期代價,可能會因此而限制你修改或改變其實現.當你通過實現添加接口來更改類的結構時,添加或刪除任何字段可能會破壞默認序列化,這可以通過自定義二進制格式使不兼容的可能性最小化,但仍需要大量的努力來確保向后兼容性。序列化如何限制你更改類的能力的一個示例是SerialVersionUID。


  如果不顯式聲明SerialVersionUID,則JVM會根據類結構生成其結構,該結構依賴于類實現接口和可能更改的其他幾個因素。假設你新版本的類文件實現的另一個接口,JVM將生成一個不同的SerialVersionUID的,當你嘗試加載舊版本的程序序列化的舊對象時,你將獲得無效類異常InvalidClassException。


  問題1)Java中的可序列化接口和可外部接口之間的區別是什么?


  這是Java序列化訪談中最常問的問題。下面是我的版本Externalizable給我們提供writeExternal()和readExternal()方法,這讓我們靈活地控制Java序列化機制,而不是依賴于Java的默認序列化。正確實現Externalizable接口可以顯著提高應用程序的性能。


  問題2)可序列化的方法有多少?如果沒有方法,那么可序列化接口的用途是什么?


  可序列化Serializalbe接口存在于java.io包中,構成了Java序列化機制的核心。它沒有任何方法,在Java中也稱為標記接口。當類實現java.io.Serializable接口時,它將在Java中變得可序列化,并指示編譯器使用Java序列化機制序列化此對象。


  問題3)什么是serialVersionUID?如果你不定義這個,會發生什么?


  我最喜歡的關于Java序列化的問題面試問題之一。serialVersionUID是一個privatestaticfinallong型ID,當它被印在對象上時,它通常是對象的哈希碼,你可以使用serialver這個JDK工具來查看序列化對象的serialVersionUID。SerialVerionUID用于對象的版本控制。也可以在類文件中指定serialVersionUID。不指定serialVersionUID的后果是,當你添加或修改類中的任何字段時,則已序列化類將無法恢復,因為為新類和舊序列化對象生成的serialVersionUID將有所不同。Java序列化過程依賴于正確的序列化對象恢復狀態的,,并在序列化對象序列版本不匹配的情況下引發java.io.InvalidClassException無效類異常,了解有關serialVersionUID詳細信息,請參閱這篇文章,需要FQ。


  問題4)序列化時,你希望某些成員不要序列化?你如何實現它?


  另一個經常被問到的序列化面試問題。這也是一些時候也問,如什么是瞬態trasient變量,瞬態和靜態變量會不會得到序列化等,所以,如果你不希望任何字段是對象的狀態的一部分,然后聲明它靜態或瞬態根據你的需要,這樣就不會是在Java序列化過程中被包含在內。


  問題5)如果類中的一個成員未實現可序列化接口,會發生什么情況?


  關于Java序列化過程的一個簡單問題。如果嘗試序列化實現可序列化的類的對象,但該對象包含對不可序列化類的引用,則在運行時將引發不可序列化異常NotSerializableException,這就是為什么我始終將一個可序列化警報(在我的代碼注釋部分中),代碼注釋最佳實踐之一,指示開發人員記住這一事實,在可序列化類中添加新字段時要注意。


  問題6)如果類是可序列化的,但其超類不是,則反序列化后從超級類繼承的實例變量的狀態如何?


  Java序列化過程僅在對象層次都是可序列化結構中繼續,即實現Java中的可序列化接口,并且從超級類繼承的實例變量的值將通過調用構造函數初始化,在反序列化過程中不可序列化的超級類。一旦構造函數鏈接將啟動,就不可能停止,因此,即使層次結構中較高的類實現可序列化接口,也將執行構造函數。正如你從陳述中看到的,這個序列化面試問題看起來非常棘手和有難度,但如果你熟悉關鍵概念,則并不難。


  問題7)是否可以自定義序列化過程,或者是否可以覆蓋Java中的默認序列化過程?


  答案是肯定的,你可以。我們都知道,對于序列化一個對象需調用ObjectOutputStream.writeObject(saveThisObject),并用ObjectInputStream.readObject()讀取對象,但Java虛擬機為你提供的還有一件事,是定義這兩個方法。如果在類中定義這兩種方法,則JVM將調用這兩種方法,而不是應用默認序列化機制。你可以在此處通過執行任何類型的預處理或后處理任務來自定義對象序列化和反序列化的行為。


  需要注意的重要一點是要聲明這些方法為私有方法,以避免被繼承、重寫或重載。由于只有Java虛擬機可以調用類的私有方法,你的類的完整性會得到保留,并且Java序列化將正常工作。在我看來,這是在任何Java序列化面試中可以問的最好問題之一,一個很好的后續問題是,為什么要為你的對象提供自定義序列化表單?


  問題8)假設新類的超級類實現可序列化接口,如何避免新類被序列化?


  在Java序列化中一個棘手的面試問題。如果類的Super類已經在Java中實現了可序列化接口,那么它在Java中已經可以序列化,因為你不能取消接口,它不可能真正使它無法序列化類,但是有一種方法可以避免新類序列化。為了避免Java序列化,你需要在類中實現writeObject()和readObject()方法,并且需要從該方法引發不序列化異常NotSerializableException。這是自定義Java序列化過程的另一個好處,如上述序列化面試問題中所述,并且通常隨著面試進度,它作為后續問題提出。


  問題9)在Java中的序列化和反序列化過程中使用哪些方法?


  這是很常見的面試問題,在序列化基本上面試官試圖知道:你是否熟悉readObject()的用法、writeObject()、readExternal()和writeExternal()。Java序列化由java.io.ObjectOutputStream類完成。該類是一個篩選器流,它封裝在較低級別的字節流中,以處理序列化機制。要通過序列化機制存儲任何對象,我們調用ObjectOutputStream.writeObject(savethisobject),并反序列化該對象,我們稱之為ObjectInputStream.readObject()方法。調用以writeObject()方法在java中觸發序列化過程。關于readObject()方法,需要注意的一點很重要一點是,它用于從持久性讀取字節,并從這些字節創建對象,并返回一個對象,該對象需要類型強制轉換為正確的類型。


  問題10)假設你有一個類,它序列化并存儲在持久性中,然后修改了該類以添加新字段。如果對已序列化的對象進行反序列化,會發生什么情況?


  這取決于類是否具有其自己的serialVersionUID。正如我們從上面的問題知道,如果我們不提供serialVersionUID,則Java編譯器將生成它,通常它等于對象的哈希代碼。通過添加任何新字段,有可能為該類新版本生成的新serialVersionUID與已序列化的對象不同,在這種情況下,Java序列化API將引發java.io.InvalidClassException,因此建議在代碼中擁有自己的serialVersionUID,并確保在單個類中始終保持不變。


  11)Java序列化機制中的兼容更改和不兼容更改是什么?


  真正的挑戰在于通過添加任何字段、方法或刪除任何字段或方法來更改類結構,方法是使用已序列化的對象。根據Java序列化規范,添加任何字段或方法都面臨兼容的更改和更改類層次結構或取消實現的可序列化接口,有些接口在非兼容更改下。對于兼容和非兼容更改的完整列表,我建議閱讀Java序列化規范。


  12)我們可以通過網絡傳輸一個序列化的對象嗎?


  是的,你可以通過網絡傳輸序列化對象,因為Java序列化對象仍以字節的形式保留,字節可以通過網絡發送。你還可以將序列化對象存儲在磁盤或數據庫中作為Blob。


  13)在Java序列化期間,哪些變量未序列化?


  這個問題問得不同,但目的還是一樣的,Java開發人員是否知道靜態和瞬態變量的細節。由于靜態變量屬于類,而不是對象,因此它們不是對象狀態的一部分,因此在Java序列化過程中不會保存它們。由于Java序列化僅保留對象的狀態,而不是對象本身。瞬態變量也不包含在Java序列化過程中,并且不是對象的序列化狀態的一部分。在提出這個問題之后,面試官會詢問后續內容,如果你不存儲這些變量的值,那么一旦對這些對象進行反序列化并重新創建這些變量,這些變量的價值是多少?這是你們要考慮的。


最新java面試題及答案整理


      以上就是動力節點Java培訓機構小編介紹的“最新java面試題及答案整理”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。


相關推薦


最新最全java面試題及答案(初級到高級)


史上最全的中高級JAVA工程師面試題及答案匯總


Java高級開發工程師面試題


2019史上最全java面試題題庫大全800題


哪有資深java工程師面試題


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 西西人体国模欢欢啪啪写真 | 高清欧美不卡一区二区三区 | 一级毛片在线直接观看 | 九九99靖品| 精品一区二区三区影院在线午夜 | 久热爱精品视频在线观看久爱 | 午夜看片影院在线观看 | 欧美日韩午夜 | 成人午夜性a一级毛片美女 成人午夜小视频 | 亚洲妇人成熟性成熟网站 | 亚洲人成黄网在线观看 | 伊人久久天堂 | 日韩伦理片免费在线观看 | 久久看免费 | 阿v天堂2021在线观看 | 青春久久| 国内精品免费一区二区观看 | 日本人亚洲人成人 | 91精品欧美 | 福利片 在线 | 久久综合九色综合97伊人麻豆 | 午夜免费福利影院 | 国产日韩欧美第一页 | 黄色特一级片 | 九九综合 | 一级毛片在线播放免费 | 97人人揉人人捏人人添 | 天天噜噜揉揉狠狠夜夜 | 久久久久国产视频 | 成人自拍网站 | 国产成人精品福利网站在线观看 | 精品伊人网 | 青青青视频自偷自拍视频1 青青青视频免费一区二区 青青青久热国产精品视频 青青青国产在线 | 天天看毛片 | 国产一区亚洲二区 | 欧美在线免费播放 | 天天拍天天操 | 99在线免费观看视频 | 巨胸喷奶水www久久久免费观看 | 成人黄色一级片 | 亚洲an日韩专区在线 |