1. 程式人生 > >java面試題(二)

java面試題(二)

1、面向物件的特徵:抽象、繼承、封裝、多型;

抽象:抽象就是隻關注物件有哪些屬性和行為,並不會去關注他的細節是什麼;

繼承:繼承就是從已有類得到繼承資訊得到新類的過程。被繼承的叫父類(基類),得到繼承的叫子類(派生類);

封裝:封裝就是把能封裝的資料或者方法給繫結起來,對資料和方法的訪問只能通過已定義的簡單的介面;

多型:多型就是允許不同子型別的物件對同一訊息做出的不同響應。也就是說相同的物件呼叫相同的方法但做出了不同的響應。

再直白點就是方法的過載(overload)也可以理解為編譯時的多型性。方法重寫可以理解為執行時的多型 ;

2、String是不是基本資料型別?

不是。String是引用型別。Java基本資料型別只有8個:byte(-128~127)、short、int、long、float、double、char、boolean。除了這8個基本資料型別其他的都是引用型別;

3、用最有效率的方法計算2乘以8?

2<<3;(左移三位相當於2乘以2的三次方,右移三位相當於除以2的三次方 );

4、switch是否可以作用在byte上,是否能作用於long上,是否可以作用於String上?

在Java5以前switch(expr)中,expr只能是byte、short、int、char。jdk1.7及以上支援String;long目前還不支援;

5、陣列有沒有length()方法,String有沒有length()方法?

在陣列中length是屬性,不是方法,所以沒有,String中有length()方法;

6、構造器能否被重寫?

不能;因為構造器(構造方法)不能被繼承,所以不能被重寫,但是可以被過載;

7、java中如何跳出當前多重巢狀迴圈?

在最外層加一個標記,如A,然後break A;即可跳出多重迴圈;

eg:A:for(省略){ break A; }

8、是否可以繼承String類?

不可以,因為String是被final類;

9、如果兩個物件值相同 x.equals(y)==true ,他們的hash code也相同,對不對?

對;如果滿足前者,後者一定相同;如果後者相同,前者未必為true;

10、當一個物件被當作引數傳遞到一個方法後,這個方法可以改變這個物件的屬性,並且可以返回改變後的結果,

那麼這裡到底是值傳遞還是引用傳遞?

值傳遞;Java語言的方法呼叫只支援引數的值傳遞;

11、String和StringBuilder、StringBuffer的區別?

簡單的說就是String是隻讀字串,不可修改,而StringBuilder和StringBuffer可以直接修改;

12、過載和重寫的區別,過載的方法能否根據返回值型別進行去區分?

過載和重寫都是實現多型的方式,區別在於前者是編譯時多型,後者是執行時多型。過載發生在同一個類中,

重寫發生在子父類中。一個類中同名的方法如果有不同的引數列表(引數型別不同,引數個數不同,

引數型別不同的情況下順序不同),三者滿足一個即視為過載;重寫要求被重新的和重寫的要有相同的返回型別;

對於過載方法,不要試圖通過給予不同的返回值型別(引數列表完全相同)加以區分。

因為方法在呼叫時可以不將返回值賦值給一個對應的變數,這樣就沒有特徵區分。

也不要試圖通過在呼叫這樣的過載方法時賦值給對應的變數加以區分,因為問題是出現在過載方法定義上,

而不是呼叫上。總而言之,Java不允許僅僅利用返回值的不同來區分過載方法。

13、cahr型別變數中能否儲存一箇中文漢字?

可以;一個char佔2個位元組(16位元),所以放一箇中文是沒問題的;

14、抽象類(abstract class)和介面(interface)有什麼異同?

都不能例項化,但可以定義抽象類和介面類的引用;一個類如果繼承了抽象類或者實現了某個介面,那麼必須對其中的抽象方法全部實現。介面比抽象類更加抽象,因為抽象類可以定義構造器可以有抽象方法和具體方法,而介面中不能定義構造器,並且方法全部都是抽象方法。抽象類中的成員可以是private、預設、protected、public的,而介面中全都是public的;抽象類可以定義成員變數,而介面定義的成員變數都是常量;有抽象方法的類必須宣告為抽象類,而抽象類未必要有抽象方法;

15、java中會存在記憶體洩露嗎?

理論上不會,因為java中有垃圾回收機制(GC)不會存在記憶體洩露問題。這也是java被廣泛應用於伺服器端程式設計

的一個重要原因;然而實際開發中,可能會存在無用但可表達的物件,這些物件不能被GC回收,

因此也會導致記憶體洩露的發生,如hibernate中的session(一級快取)中的物件屬於持久態,

GC不會回收這些物件,而這些物件可能存在無用的垃圾物件,如果不及時關閉(close)或清空(flush)

一級快取就可能導致記憶體洩露;

16、GC是什麼?為什麼要有GC?

GC是垃圾收集的意思,記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的

不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,

Java語言沒有提供釋放已分配記憶體的顯示操作方法。Java程式設計師不用擔心記憶體管理,因為垃圾收集器會自動進行管理。

要請求垃圾收集,可以呼叫下面的方法之一:System.gc() 或Runtime.getRuntime().gc() 。

17、String s = new String("abc");建立了幾個物件?

兩個。一個是靜態區的abc,一個是用new建立在堆上的物件;

18、介面是否可以繼承介面,抽象類是否可以實現介面,抽象類是否可以繼承具體類?

介面可以繼承介面,而且支援多重繼承;抽象類可以實現介面,抽象類可繼承具體類也可以繼承抽象類;

19、一個.java原始檔中是否可以包含多個類(不是內部類)?有什麼限制?

可以,但是隻能有一個公開類(public class)並且公開類名要與檔名完全一致;

20、java中final關鍵字有哪些用法?

修飾類表示類不可繼承,修飾方法表示方法不可重寫,修飾變量表示變數只能一次賦值以後值不可修改(常量);

21、error和exception的區別?

error表示系統級錯誤和程式不必處理的異常,是 恢復不是不可能但是很困難的情況下的一種嚴重問題。

比如記憶體溢位,不指望程式能處理這樣的異常。exception表示需要捕捉或需要程式進行處理的異常,

是一種設計和實現問題。也表示如果程式正常從不會發生的某種情況;

22、try{}裡面有個return語句,那麼緊跟在後面的finally{}裡的程式碼會不會執行,什麼時候執行?

會執行,在方法返回呼叫者前執行;

注:如果有finally程式碼塊,儘量不要再finally裡修改返回值,因為有finally程式碼塊的時候,try裡面的return不會立馬返回呼叫者,而是記錄下返回值,待finally執行後再返回。如果在finally中修改了返回值,則返回修改後的值。

23、Java語言如何進行異常處理,關鍵字:throws、throw、try、catch、finally分別如何使用? 

簡單點說:一個程式一般用try來執行一段程式碼,他可能會丟擲異常(throw),可以通過catch來捕獲它,或者通過總是執行的finally程式碼塊來處理,throws是用來宣告一個方法可能丟擲的各種異常。

24、執行時異常和受檢時異常有何異同?

異常表示程式執行中可能出現的非正常狀態。執行時異常表示虛擬機器通常操作中可能遇到的異常,跟程式設計有關,受檢時異常也就是非執行時異常,跟上下文環境有關,java編譯器要求必須丟擲可能發生的受檢異常,但不要求必須丟擲未被捕獲的執行時異常。

25、List、Set、Map是否繼承Collection介面?

List和Set是,Map不是。Map是鍵值對對映容器,與List和Set有明顯區別;

26、Collection和Collections的區別?

Collection是一個介面,它是List和Set的父介面;Collections是一個工具類,提供一系列的靜態方法供容器操作,如搜、排序、執行緒安全化等等;

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

List以特定索引存取元素,可以有重複項,Set不能有重複項(equals()來區分物件是否重複 ),Map儲存鍵值對對映,對映關係可以是一對一或多對一。

28、Thread的sleep()方法和物件的wait()方法都可以讓執行緒暫停,有何區別?

sleep()方法(休眠)是Thread的靜態方法呼叫此方法會讓當前執行緒暫停指定的時間,將執行機會讓給其他執行緒,物件鎖依然保持,休眠時間結束後自動恢復。wait()方法導致當前執行緒放棄物件的鎖,執行緒暫停執行,進入物件的等待池(wait pool),只有呼叫物件的notify()方法,或者notifyAll()方法時才能喚醒等待池中的執行緒進入等鎖池(lock pool)如果執行緒重新獲取物件的鎖就可以就如就緒狀態;

29、編寫多執行緒有幾種實現方式?

java5以前實現多執行緒有兩種:繼承Thread類和實現Runnable介面。兩種方式都要重寫run()方法來定義執行緒行為;推薦用後者,因為jav繼承是單繼承,一個類只能有一個父類,如果繼承了Thread就無法繼承其他類,所以Runnable介面更為靈活。(Java5以後多了一種方法:實現Callable介面)

30、synchronized關鍵字的用法?

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

31、事務的ACID是指什麼?

原子性(Atomic):事務中各項操作,要麼全做要麼全不做,任何一項失敗都會導致整個事務的失敗;

一致性(Consistent):事務結束後系統狀態是一致的;

隔離性(Isolated ):併發執行的事務彼此無法看到對方的中間狀態;

永續性(Durable):事務完成後所做的改動都會被持久化,即使發生災難性的失敗,通過日誌和同步備份都可以在故障發生後重建資料; 

32、JDBC如何進行事務處理?

Connection提供事務處理的方法,通過呼叫setAutoCommit(false)可設定手動提交事務,事務完成後用commit()顯示提交事務,如果處理過程中發生異常用rollback()進行回滾。

33、await/wait 與sleep、yield間的區別

await/wait 會釋放鎖釋放了其獲取的鎖並阻塞等待而sleep、yield不會。