3年Java工程師面試必問!這些題一定要會!

Java架構解析發表於2019-01-16

前言

要說面試,程式設計師煩,公司也煩,面試官也煩,但沒辦法,魚龍混雜的人太多,理論好寫不了程式碼的程式設計師著實讓公司頭疼,因而面試的題目也越來越刁鑽!

文末有福利~

不過凡事都有兩面性,面試也是激勵程式設計師多看面試題,掌握知識不是嗎?

以下推薦的Java面試題目,希望可以幫大家積累面試經驗溫習技術知識!

3年Java工程師面試必問!這些題一定要會!

1. 先來點開胃菜

1.訪問修飾符public,private,protected以及不寫時的區別?

3年Java工程師面試必問!這些題一定要會!

類的成員不寫訪問修飾符時,預設的是default.

2.Stirng是最基本的資料型別嗎?

答: 不是. java中的基本資料型別就八種: byte, short, int, long, float, double, char,

boolean. 剩下的都是引用型別(reference type).

3.float f = 1.1; 正確嗎?

答: 不正確. 1.1是雙精度, 將雙精度賦值給浮點型,屬於向下轉型,會造成精度的丟失.如果要強制 型別轉換,可以寫成這樣 float f = (float)1.1; 或者 float f=1.1F;

4.short a = 1; a = a + 1 和 short a = 1 ; a += 1 有什麼區別?

答: 對於a = a + 1 因為1是int值型別,所以計算的結果是int,要賦值給short,需要強制型別裝 換才能賦值給short. 對於a += 1; 其相當於 a = (short)(a+1) ;其中已經做了強制型別裝換.

5.下面程式碼列印結果?

Integer a = 100, b = 100, c = 130, d = 130 ; System.out.println(a ==> b); System.out.println(c == d); 第一個是true,第二個是false. 因為a,b,c,d四個變數都是integer物件的引用,所以==比較的不是值,而是引用.如果整型字面 量的值在-128到127之間,那麼不會new新的Integer物件,而是直接引用常量池中的Integer物件.

6.Java中如何跳出多重巢狀迴圈?

答:在最外層迴圈前加標記A,利用break A;可以跳出迴圈

7.String類可以被繼承嗎?

答:不可以. 因為String類是final類.

2. 來點中級的,上菜咯

1.抽象類和介面的相同點和不同點.

答: 1.抽象類和介面都不能例項化物件,但是可以定義抽象類和介面型別的引用. 2.繼承抽象類和實現介面都要對其中的抽象方法全部實現 3.介面比抽象類更加抽象,抽象類中可以定義構造器,可以有抽象方法和具體方法. 4.介面中方法全部都是抽象方法. 5.抽象類中的成員可以是private,protected,public,介面全部都是public 6.抽象類中可以定義成員變數,而介面中定義的成員變數實際上都是常量. 7.有抽象方法的類必須宣告為抽象類,而抽象類未必要有抽象方法.

2.java中會存在記憶體洩露嗎?

答:理論上java不會存在記憶體洩露的問題,應為有垃圾回收機制(GC).然而在實際開發中,可能會存在 無用但可達的物件,這些物件不能被GC回收,因此會導致記憶體洩露. 例如hibernated的Session中 的物件屬於持久態,垃圾回收器不會回收這些物件,這些物件中有可能存在無用的垃圾物件.如果關閉 不及時,一級快取就可能導致記憶體洩露.

3.try{ }裡面return, finally裡的程式碼會不會執行,什麼時候被執行?

答:會執行. 在方法返回給呼叫者前執行.因為如果存在finally程式碼塊, try中的return語句不會 立馬返回撥用者,而是記錄下返回值待finally程式碼塊執行完畢之後在返回.

4.List,Map,Set 三個介面存取元素時,各自有什麼特點?

答:List以特定的索引來存取元素,可以有重複元素 Set不能存放重複元素. Map儲存鍵值對的對映,對映關係可以是一對一或多對一. Set和Map容器都有基於雜湊儲存和排序樹的兩種實現版本,基於雜湊儲存理論存取時間複雜度是O(1).

5.Thread類中的sleep()和物件的wait()有什麼區別?

答:sleep()方法是執行緒類的靜態方法,呼叫此方法會讓當前執行緒暫停執行指定時間.將CPU時間片分 給其他執行緒,但是物件的鎖依然保持, 休眠時間結束會自動回覆到就緒狀態. wait()是Object類的方法,呼叫物件的wait()方法導致當前執行緒放棄物件的鎖,執行緒暫停執行, 進入物件的等待池,只有呼叫物件的notify()方法或notifyAll()方法時,才能喚醒等待池中的 執行緒進入等鎖池,如果執行緒重新獲得物件的鎖就可以進入就緒狀態

6.當一個執行緒進入一個物件的synchronized方法A之後,其它執行緒是否可進入此物件的synchronized方法B?

答:不能。其它執行緒只能訪問該物件的非同步方法,同步方法則不能進入。 因為非靜態方法上的synchronized修飾符要求執行方法時要獲得物件的鎖,如果已經進入A方法說 明物件鎖已經被取走,那麼試圖進入B方法的執行緒就只能在等鎖池(注意不是等待池哦)中等待物件的鎖

7.說說synchronized關鍵字的用法?

答:synchronized關鍵字可以將物件或者方法標記為同步,以實現對物件和方法的互斥訪問,可以用 synchronized(物件) { … }定義同步程式碼塊,或者在宣告方法時將synchronized作為方法的修飾符

8.Java如何實現序列化,有什麼意義?

答:序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化 後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。 序列化是為了解決物件流讀寫操作時可能引發的問題(如果不進行序列化可能會存在資料亂序的問題) 要實現序列化,讓類實現Serializable介面.該介面是一個標識性介面,標註該類物件是可被序列 化的,然後使用一個輸出流來構造一個物件輸出流並通過writeObject(Object)方法就可以將實現物件寫出 如果需要反序列化則可以用一個輸入流建立物件輸入流,然後通過readObject方法從流中讀取對 象。序列化除了能夠實現物件的持久化之外,還能夠用於物件的深度克隆

9.執行緒的sleep()方法和yield()方法有什麼區別?

答:sleep()方法給其他執行緒執行機會時不考慮執行緒的優先順序,因此會給低優先順序的執行緒以執行的機會; yield()方法只會給相同優先順序或更高優先順序的執行緒以執行的機會; 執行緒執行sleep()方法後轉入阻塞(blocked)狀態,而執行yield()方法後轉入就緒(ready)狀態; sleep()方法宣告丟擲InterruptedException,而yield()方法沒有宣告任何異常; sleep()方法比yield()方法(跟作業系統CPU排程相關)具有更好的可移植性。

10.說說你對同步和非同步的理解.

答:如果系統中存在臨界資源(資源數量少於競爭資源的執行緒數量的資源),例如正在寫的資料以後可能被另一個執行緒讀到,或者正在讀的資料可能已經被另一個執行緒寫過了,那麼這些資料就必須進行同步存取(資料庫操作中的排他鎖就是最好的例子) 當應用程式在物件上呼叫了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法的返回時,就應該使用非同步程式設計,在很多情況下采用非同步途徑往往更有效率。事實上,所謂的同步就是指阻塞式操作,而非同步就是非阻塞式操作。

3. 最後,再來點高階的

1.轉發(forward)和重定向(redirect)的區別?

答:forward是容器中控制權的轉向,是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL 的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容是從哪兒來的,所以它的位址列中還是原來的地址redirect就是伺服器端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址,因此從瀏覽器的位址列中可以看到跳轉後的連結地址,很明顯redirect無法訪問到伺服器保護起來資源,但是可以從一個網站redirect到其他網站。

2.說一說spring 中依賴注入和AOP的實現機制。

答:實現依賴注入的方式包括:構造器注入、設值注入和介面(回撥)注入。Spring中可以通過設值注入(setter方法注入)和構造器注入實現IoC,推薦使用的方式為設值注入。 實現AOP的方式包括:編譯時AOP(需要特殊的編譯器)、執行時AOP(代理模式)、載入時AOP(需要特殊的類載入器)。Spring中使用了執行時的AOP,主要通過代理的方式對原來的程式碼進行增強實現。對於實現了介面的類,Spring通過Java的動態代理(請參考Proxy類和InvocationHandler 介面)來進行增強;對於沒有實現介面的類,Spring使用第三方位元組碼生成工具CGLIB,通過繼承的方式對原有程式碼進行增強

3.什麼是ORM?

答:物件關係對映(Object-Relational Mapping,簡稱ORM)是一種為了解決程式的物件導向模型與資料庫的關係模型互不匹配問題的技術;簡單的說,ORM是通過使用描述物件和資料庫之間對映的後設資料(在Java中可以用XML或者是註解),將程式中的物件自動持久化到關聯式資料庫中或者將關聯式資料庫表中的行轉換成Java物件,其本質上就是將資料從一種形式轉換到另外一種形式。

4.簡述一下物件導向的"六原則一法則"

答: 單一職責原則:一個類只做它該做的事情。單一職責原則想表達的就是"高內聚"開閉原則:軟體實體應當對擴充套件開放,對修改關閉.要做到開閉有兩個要點:抽象是關鍵,一個系統中如果沒有抽象類或介面系統就沒有擴充套件點;封裝可變性,將系統中的各種可變因素封裝到一個繼承結構中,依賴倒轉原則: 面向介面程式設計,就是宣告方法的引數型別、方法的返回型別、變數的引用型別時,儘可能使用抽象型別而不用具體型別,因為抽象型別可以被它的任何一個子型別所替代里氏替換原則:任何時候都可以用子型別替換掉父型別介面隔離原則:介面要小而專,絕不能大而全。介面也應該是高度內聚的.Java中的介面代表能力、代表約定、代表角色,能否正確的使用介面一定是程式設計水平高低的重要標識合成聚合複用原則:優先使用聚合或合成關係複用程式碼。

總結

面試官要找的不是技術明星,而是實實在在具備了合適的技術技能、軟技能、端正的態度以及能為企業獲取利益、全面的專業人才。

最後送福利了,

加群即可獲取更多面試資料 還有Java學習視訊 群號:923116658

點選連結加入群聊【Java架構解析】:https://jq.qq.com/?_wv=1027&k=5e1QsXb


相關文章