21.final, finally, finalize的區別 22、finally是在異常處理時 23. Java中的String,StringBuilder,StringBuffer三者的區別? 24.GC是什麼? 為什麼要有GC? 25.構造器如何工作? 26.構造器Constructor是否可 ...
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方法進行了重寫的話,
比較的是所指向的對象的內容。