天天看點

這些java面試題你會了嗎?

這些java面試題你會了嗎?

以下推薦的java面試題目,可以幫你積累面試經驗溫習技術知識!

1.通路修飾符public,private,protected以及不寫時的差別?

這些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類.

8.String和StringBuilder,StringBuffer的差別?

答:String是隻讀字元串,String引用的字元串内容是不能被改變的.而StringBuffer和StringBuilder是可變字元串.StringBuilder和StringBuffer的用法相同, 差別是StringBuffer被synchronized修飾,效率比StringBuilder低。

9.構造器是否可以被重寫?

答: 構造器不能被繼承,是以不能被重寫,但是可以被重載.

10.int a = 1; int b = 2; 怎麼讓a,b值交換?

答:

a = a ^ b;

b = a ^ b;

a = a ^ b;

再來點更新版的~

這些java面試題你會了嗎?

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.說說你對同步和異步的了解.

答:如果系統中存在臨界資源(資源數量少于競争資源的線程數量的資源),例如正在寫的資料以後可能被另一個線程讀到,或者正在讀的資料可能已經被另一個線程寫過了,那麼這些資料就必須進行同步存取(資料庫操作中的排他鎖就是最好的例子)

當應用程式在對象上調用了一個需要花費很長時間來執行的方法,并且不希望讓程式等待方法的傳回時,就應該使用異步程式設計,在很多情況下采用異步途徑往往更有效率。事實上,所謂的同步就是指阻塞式操作,而異步就是非阻塞式操作。

這些java面試題你會了嗎?

再來點進階的~

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對象,其本質上就是将資料從一種形式轉換到另外一種形式。

繼續閱讀