Java天天10道面試題,跟我走,offer有!(三)java
21.final, finally, finalize的區別程序員
一、final修飾符(關鍵字)。 被final修飾的類, 就意味着不能再派生出新的子類, 不能做爲父類而被子類繼承。 所以一個類不能既被abstract聲明, 又被final聲明。將變量或方法聲明爲final, 能夠保證他們在使用的過程當中不被修改。 被聲明爲final的變量必須在聲明時給出變量的初始值, 而在之後的引用中只能讀取。 被final聲明的方法也一樣只能使用, 即不能方法重寫。
2二、finally是在異常處理時面試
提供finally塊來執行任何清除操做。 無論有沒有異常被拋出、捕獲,finally塊都會被執行。 try塊中的內容是在無異常時執行到結束。 catch塊中的內容, 是在try塊內容發生catch所聲明的異常時, 跳轉到catch塊中執行。 finally塊則是不管異常是否發生, 都會執行finally塊的內容, 因此在代碼邏輯中有須要 不管發生什麼都必須執行的代碼, 就能夠放在finally塊中。 三、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() 來強制進行一次當即的內存清理。
順便在此給你們推薦一個Java架構方面的交流學習羣:698581634,進羣便可免費獲取Java架構學習資料:裏面有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系,羣裏必定有你須要的資料,你們趕忙加羣吧。性能優化
25.構造器如何工做?多線程
Java在構造實例時的順序是這樣的: 一、分配對象空間,並將對象中成員初始化爲0或者空 ,java不容許用戶操縱一個不定值的對象。 二、執行屬性值的顯式初始化 三、執行構造器 4 、將變量關聯到堆中的對象上 而執行構造器的步驟有能夠分爲如下幾步: 一、Bind構造器的參數 二、若是顯式的調用了this,那就遞歸調用this構造器而後跳到步驟5 三、遞歸調用顯式或者隱式的父類構造器,除了Object之外,由於它沒有父類 四、執行顯式的實例變量初始化(也就是上邊的流程中的第二步,調用返回之後執行, 這個步驟至關於在父構造器執行後隱含執行的,看樣子像一個特殊處理)
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方法進行了重寫的話, 比較的是所指向的對象的內容。
原文連接:https://www.jianshu.com/p/de185a685235