更新時間:2020-06-09 12:07:01 來源:動力節點 瀏覽2381次
相信有不少小伙伴都想通過學習java進入到知名企業,百度公司就是很多朋友所向往的,當然要去百度也需要參加面試才可以,動力節點java培訓機構的小編就為大家準備了百度java面試題參考,希望對大家能夠有所幫助。
基于 LinkedHashMap 的訪問順序的特點,可構造一個 LRU(Least Recently Used) 最近最少使用簡單緩存。 也有一些開源的緩存產品如 ehcache 的淘汰策略( LRU )就是在 LinkedHashMap 上擴展的。
Cloneable接口是Java開發中常用的一個接口, 它的作用是使一個類的實例能夠將自身拷貝到另一個新的實例中, 注意,這里所說的“拷貝”拷的是對象實例,而不是類的定義,進一步說,拷貝的是一個類的實例中各字段的值。
在開發過程中,拷貝實例是常見的一種操作,如果一個類中的字段較多,而我們又采用在客戶端中逐字段復制的方 法進行拷貝操作的話,將不可避免的造成客戶端代碼繁雜冗長,而且也無法對類中的私有成員進行復制,而如果讓需要 具備拷貝功能的類實現Cloneable接口,并重寫clone()方法,就可以通過調用clone()方法的方式簡潔地實現實例 拷貝功能。
深拷貝(深復制)和淺拷貝(淺復制)是兩個比較通用的概念,尤其在C++語言中,若不弄懂,則會在delete的時候出問題,但是我們在這幸好用的是Java。雖然Java自動管理對象的回收,但對于深拷貝(深復制)和淺拷貝(淺復制),我們 還是要給予足夠的重視,因為有時這兩個概念往往會給我們帶來不小的困惑。
淺拷貝是指拷貝對象時僅僅拷貝對象本身(包括對象中的基本變量),而不拷貝對象包含的引用指向的對象。深拷 貝不僅拷貝對象本身,而且拷貝對象包含的引用指向的所有對象。舉例來說更加清楚:對象 A1 中包含對 B1 的引用, B1 中包含對 C1 的引用。淺拷貝 A1 得到 A2 , A2 中依然包含對 B1 的引用, B1 中依然包含對 C1 的引 用。深拷貝則是對淺拷貝的遞歸,深拷貝 A1 得到 A2 , A2 中包含對 B2 ( B1 的 copy )的引用, B2 中包含 對 C2 ( C1 的 copy )的引用。
若不對clone()方法進行改寫,則調用此方法得到的對象即為淺拷貝
Java標準庫內建了一些通用的異常,這些類以Throwable為頂層父類。
Throwable又派生出Error類和Exception類。
錯誤:Error類以及他的子類的實例,代表了JVM本身的錯誤。錯誤不能被程序員通過代碼處理,Error很少出現。
因此,程序員應該關注Exception為父類的分支下的各種異常類。
異常:Exception以及他的子類,代表程序運行時發送的各種不期望發生的事件。可以被Java異常處理機制使用, 是異常處理的核心。
總體上我們根據 Javac 對異常的處理要求,將異常類分為二類。
非檢查異常( unckecked exception ): Error 和 RuntimeException 以及他們的子類。 javac 在編譯時, 不會提示和發現這樣的異常,不要求在程序處理這些異常。所以如果愿意,我們可以編寫代碼處理(使用 try… catch…finally )這樣的異常,也可以不處理。對于這些異常,我們應該修正代碼,而不是去通過異常處理器處理 。這樣的異常發生的原因多半是代碼寫的有問題。如除0錯誤 ArithmeticException ,錯誤的強制類型轉換錯 誤 ClassCastException ,數組索引越界 ArrayIndexOutOfBoundsException ,使用了空對象 NullPointerException 等等。
檢查異常( checked exception ):除了 Error 和 RuntimeException 的其它異常。 javac 強制要求程序員 為這樣的異常做預備處理工作(使用 try…catch…finally 或者 throws )。在方法中要么用 try-catch 語句捕 獲它并處理,要么用throws子句聲明拋出它,否則編譯不會通過。這樣的異常一般是由程序的運行環境導致的。因 為程序可能被運行在各種未知的環境下,而程序員無法干預用戶如何使用他編寫的程序,于是程序員就應該為這樣 的異常時刻準備著。如 SQLException , IOException , ClassNotFoundException 等。
需要明確的是:檢查和非檢查是對于 javac 來說的,這樣就很好理解和區分了。
源碼如下:
(1) sleep 來自 Thread 類,和 wait 來自 Object 類。
(2)最主要是sleep方法沒有釋放鎖,而wait方法釋放了 鎖,使得其他線程可以使用同步控制塊或者方法。
(3)wait,notify和 notifyAll 只能在同步控制方法或者同步控制塊里面使用,而 sleep 可以在任何地方使用(使 用范圍)
(4)sleep 必須捕獲異常,而 wait , notify 和 notifyAll 不需要捕獲異常
• sleep 方法屬于 Thread 類中方法,表示讓一個線程進入睡眠狀態,等待一定的時間之后,自動醒來進入到可 運行狀態,不會馬上進入運行狀態,因為線程調度機制恢復線程的運行也需要時間,一個線程對象調用了 sleep 方法之后,并不會釋放他所持有的所有對象鎖,所以也就不會影響其他進程對象的運行。但在 sleep 的過程中過 程中有可能被其他對象調用它的 interrupt() ,產生 InterruptedException 異常,如果你的程序不捕獲這個異 常,線程就會異常終止,進入 TERMINATED 狀態,如果你的程序捕獲了這個異常,那么程序就會繼續執行catch語 句塊(可能還有 finally 語句塊)以及以后的代碼。
注意 sleep() 方法是一個靜態方法,也就是說他只對當前對象有效,通過 t.sleep() 讓t對象進入 sleep ,這樣 的做法是錯誤的,它只會是使當前線程被 sleep 而不是 t 線程
• wait 屬于 Object 的成員方法,一旦一個對象調用了wait方法,必須要采用 notify() 和 notifyAll() 方法 喚醒該進程;如果線程擁有某個或某些對象的同步鎖,那么在調用了 wait() 后,這個線程就會釋放它持有的所有 同步資源,而不限于這個被調用了 wait() 方法的對象。 wait() 方法也同樣會在 wait 的過程中有可能被其他對 象調用 interrupt() 方法而產生 。
5.數組在內存中如何分配
對于 Java 數組的初始化,有以下兩種方式,這也是面試中經常考到的經典題目:
靜態初始化:初始化時由程序員顯式指定每個數組元素的初始值,由系統決定數組長度,如:
動態初始化:初始化時由程序員顯示的指定數組的長度,由系統為數據每個元素分配初始值,如:
因為 Java 數組變量是引用類型的變量,所以上述幾行初始化語句執行后,三個數組在內存中的分配情況如下圖所示:
由上圖可知,靜態初始化方式,程序員雖然沒有指定數組長度,但是系統已經自動幫我們給分配了,而動態初始化 方式,程序員雖然沒有顯示的指定初始化值,但是因為 Java 數組是引用類型的變量,所以系統也為每個元素分配 了初始化值 null ,當然不同類型的初始化值也是不一樣的,假設是基本類型int類型,那么為系統分配的初始化值 也是對應的默認值0。
以上就是動力節點java培訓機構的小編針對“百度java面試題參考”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習