1. 程式人生 > >03-撩課-Java面試寶典-第三篇

03-撩課-Java面試寶典-第三篇

21.final, finally, finalize的區別

1、final修飾符(關鍵字)。
被final修飾的類,
就意味著不能再派生出新的子類,
不能作為父類而被子類繼承。
因此一個類不能既被abstract宣告,
又被final宣告。將變數或方法宣告為final,
可以保證他們在使用的過程中不被修改。
被宣告為final的變數必須在宣告時給出變數的初始值,
而在以後的引用中只能讀取。
被final宣告的方法也同樣只能使用,
即不能方法重寫。

22、finally是在異常處理時

提供finally塊來執行任何清除操作。
不管有沒有異常被丟擲、捕獲,finally塊都會被執行。
try塊中的內容是在無異常時執行到結束。
catch塊中的內容,
是在try塊內容發生catch所宣告的異常時,
跳轉到catch塊中執行。
finally塊則是無論異常是否發生,
都會執行finally塊的內容,
所以在程式碼邏輯中有需要
無論發生什麼都必須執行的程式碼,
就可以放在finally塊中。

3、finalize是方法名。
java技術允許使用finalize()方法
在垃圾收集器將物件從記憶體中
清除出去之前做必要的清理工作。
這個方法是由垃圾收集器
在確定這個物件沒有被引用時對這個物件呼叫的。
它是在object類中定義的,
因此所有的類都繼承了它。
子類覆蓋finalize()方法以整理系統資源或者被執行其他清理工作。
finalize()方法是在垃圾收集器
刪除物件之前對這個物件呼叫的。 

###2.Overload和Override的區別。
首先過載和重寫是應用於兩個不同場景下面的兩種不同的手段:
兩者各自的特徵:
過載(Overload):首先是位於一個類之中或者其子類中,
具有相同的方法名,
但是方法的引數不同,
返回值型別可以相同也可以不同。
(1):方法名必須相同
(2):方法的引數列表一定不一樣。
(3):訪問修飾符和返回值型別可以相同也可以不同。
其實簡單而言:過載就是對於不同的情況寫不同的方法。
 比如,同一個類中,
寫不同的建構函式用於初始化不同的引數。

重寫(override):一般都是表示子類和父類之間的關係,
其主要的特徵是:
方法名相同,
引數相同,
但是具體的實現不同。

重寫的特徵:
(1):方法名必須相同,返回值型別必須相同
(2):引數列表必須相同
(3):訪問許可權不能比父類中被重寫的方法的訪問許可權更低。
例如:如果父類的一個方法被宣告為public,
那麼在子類中重寫該方法就不能宣告為protected。
(4):子類和父類在同一個包中,
那麼子類可以重寫父類所有方法,
除了宣告為private和final的方法。
(5):構造方法不能被重寫,
簡單而言:就是具體的實現類對於父類的該方法實現不滿意,
需要自己在寫一個滿足於自己要求的方法。

23. Java中的String,StringBuilder,StringBuffer三者的區別?

首先說執行速度,或者說是執行速度,
在這方面執行速度快慢為:StringBuilder > StringBuffer > String
String最慢的原因:
String為字串常量,
而StringBuilder和StringBuffer均為字串變數,
即String物件一旦建立之後該物件是不可更改的,
但後兩者的物件是變數,是可以更改的。
而StringBuilder和StringBuffer的物件是變數,
對變數進行操作就是直接對該物件進行更改,
而不進行建立和回收的操作,
所以速度要比String快很多。

String               ---->     字串常量
StringBuffer      ---->     字串變數(執行緒安全的)
StringBuilder    ---->     字串變數(非執行緒安全的)

String:適用於少量的字串操作的情況
StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況
StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況

24.GC是什麼? 為什麼要有GC?

GC是垃圾收集的意思,
記憶體處理是程式設計人員容易出現問題的地方,
忘記或者錯誤的記憶體回收
會導致程式或系統的不穩定甚至崩潰,
Java提供的GC功能
可以自動監測物件是否超過作用域
從而達到自動回收記憶體的目的,

Java語言沒有提供釋放已分配記憶體的顯示操作方法。J
ava程式設計師不用擔心記憶體管理,
因為垃圾收集器會自動進行管理。
要請求垃圾收集,
可以呼叫下面的方法之一:
System.gc()或Runtime.getRuntime().gc(),
但JVM可以遮蔽掉顯示的垃圾回收呼叫。 

垃圾回收可以有效的防止記憶體洩露,
有效的使用可以使用的記憶體。
垃圾回收器通常是作為一個單獨的低優先順序的執行緒執行,
不可預知的情況下對記憶體堆中
已經死亡的或者長時間沒有使用的物件進行清除和回收,
程式設計師不能實時的呼叫垃圾回收器
對某個物件或所有物件進行垃圾回收。

Java有了GC,
就不需要程式設計師去人工釋放記憶體空間。
當Java虛擬機發覺記憶體資源緊張的時候,
就會自動地去清理無用變數所佔用的記憶體空間。
當然,如果需要,
程式設計師可以在Java程式中顯式地使用System.gc()
來強制進行一次立即的記憶體清理。

25.構造器如何工作?

 Java在構造例項時的順序是這樣的:
1、分配物件空間,並將物件中成員初始化為0或者空
,java不允許使用者操縱一個不定值的物件。   
2、執行屬性值的顯式初始化   
3、執行構造器   
4 、將變數關聯到堆中的物件上

而執行構造器的步驟有可以分為以下幾步:

1、Bind構造器的引數
2、如果顯式的呼叫了this,那就遞迴呼叫this構造器然後跳到步驟5
3、遞迴呼叫顯式或者隱式的父類構造器,除了Object以外,因為它沒有父類
4、執行顯式的例項變數初始化(也就是上邊的流程中的第二步,呼叫返回以後執行,
   這個步驟相當於在父構造器執行後隱含執行的,看樣子像一個特殊處理)

26.構造器Constructor是否可被override?

構造器Constructor不能被繼承,
因此不能重寫Overriding,
但可以被過載Overloading 
1). 構造器不能是native,final,static,synchronized 的,
可以是public,private,或什麼都沒有。 
2). 構造器函式裡可以寫return呢,但後面什麼都不許有(包括null) 
3). 構造器不能返回值. 
但如果有個"構造器"返值了,
它就不是構造器嘍,只是個普通方法 
4). super();this();這兩個方法只能在構造方法裡呼叫. 
5). 成員變數宣告時候賦值,比建構函式還早.

27.寫一個Singleton出來。

Singleton模式主要作用是保證在Java應用程式中,
一個類Class只有一個例項存在。 
一般Singleton模式通常有幾種種形式: 
第一種形式: 定義一個類,
它的建構函式為private的,
它有一個static的private的該類變數,
在類初始化時例項話,
通過一個public的getInstance方法獲取對它的引用,
繼而呼叫其中的方法。 

public class Singleton { 
  private Singleton(){} 
  //在自己內部定義自己一個例項,是不是很奇怪? 
  //注意這是private 只供內部呼叫 
  private static Singleton instance = new Singleton(); 
  //這裡提供了一個供外部訪問本class的靜態方法,可以直接訪問   
  public static Singleton getInstance() { 
    return instance;    
   } 
} 

第二種形式: 
public class Singleton { 
  private static Singleton instance = null; 
  public static synchronized Singleton getInstance() { 
  //這個方法比上面有所改進,不用每次都進行生成物件,只是第一次      
  //使用時生成例項,提高了效率! 
  if (instance==null) 
    instance=new Singleton(); 
return instance;   } 
} 

其他形式: 
定義一個類,
它的建構函式為private的,
所有方法為static的。 
一般認為第一種形式要更加安全些

28.error和exception有什麼區別?

Error類和Exception類都繼承自Throwable類。
二者的不同之處:
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)。
2.表示一個由程式設計師導致的錯誤。
3.應該在應用程式級被處理。

Error:
1.總是不可控制的(unchecked)。
2.經常用來用於表示系統錯誤或低層資源的錯誤。
3.如何可能的話,應該在系統級被捕捉。

error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。
比如說記憶體溢位。
不可能指望程式能處理這樣的情況。 

exception 表示一種設計或實現問題。
也就是說,
它表示如果程式執行正常,
從不會發生的情況。 

29.HashMap和Hashtable的區別?

hashmap:
1.執行緒不安全
2.允許有null的鍵和值
3.效率高一點、
4.方法不是Synchronize的要提供外同步
5.有containsvalue和containsKey方法
6.HashMap 是Java1.2 引進的Map interface 的一個實現
7.HashMap是Hashtable的輕量級實現

hashtable:
1.執行緒安全
2.不允許有null的鍵和值
3.效率稍低、
4.方法是是Synchronize的
5.有contains方法方法
6.Hashtable 繼承於Dictionary 類
7.Hashtable 比HashMap 要舊

30.==和equals()區別?

對於==,
如果作用於基本資料型別的變數,
則直接比較其儲存的 
“值”是否相等;
如果作用於引用型別的變數,
則比較的是所指向的物件的地址

對於equals方法,
注意:equals方法不能作用於基本資料型別的變數
如果沒有對equals方法進行重寫,
則比較的是引用型別的變數所指向的物件的地址;
諸如String、Date等類對equals方法進行了重寫的話,
比較的是所指向的物件的內容。