前百度面試官整理的——Java後端面試題(二)

對象的四種引用java

強引用只要引用存在,垃圾回收器永遠不會回收面試

clipboard.png

可直接經過obj取得對應的對象 如 obj.equels(new Object()); 而這樣 obj 對象對後面 new Object 的一個強 引用,只有當 obj 這個引用被釋放以後,對象纔會被釋放掉,這也是咱們常常所用到的編碼形式。算法

軟引用 非必須引用,內存溢出以前進行回收,能夠經過如下代碼實現後端

clipboard.png

這時候sf是對obj的一個軟引用,經過sf.get()方法能夠取到這個對象,固然,當這個對象被標記爲須要回收的對象 時,則返回null; 軟引用主要用戶實現相似緩存的功能,在內存足夠的狀況下直接經過軟引用取值,無需從繁忙的 真實來源查詢數據,提高速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。數組

弱引用 第二次垃圾回收時回收,能夠經過以下代碼實現緩存

clipboard.png

弱引用是在第二次垃圾回收時回收,短期內經過弱引用取對應的數據,能夠取到,當執行過第二次垃圾回收時, 將返回null。弱引用主要用於監控對象是否已經被垃圾回收器標記爲即將回收的垃圾,能夠經過弱引用的 isEnQueued 方法返回對象是否被垃圾回收器標記。 ThreadLocal 中有使用到弱引用,安全

clipboard.png

虛引用 垃圾回收時回收,沒法經過引用取到對象值,能夠經過以下代碼實現性能

clipboard.png

虛引用是每次垃圾回收的時候都會被回收,經過虛引用的get方法永遠獲取到的數據爲null,所以也被成爲幽靈引 用。虛引用主要用於檢測對象是否已經從內存中刪除。編碼

Java獲取反射的三種方法spa

1.經過new對象實現反射機制2.經過路徑實現反射機制3.經過類名實現反射機制

clipboard.png

clipboard.png

Java反射機制

Java 反射機制是在運行狀態中,對於任意一個類,都可以得到這個類的全部屬性和方法,對於任意一個對象都可以 調用它的任意一個屬性和方法。這種在運行時動態的獲取信息以及動態調用對象的方法的功能稱爲 Java 的反射機制。

Class 類與 java.lang.reflect 類庫一塊兒對反射的概念進行了支持,該類庫包含了 Field,Method,Constructor 類 (每 個類都實現了 Member 接口)。這些類型的對象時由 JVM 在運行時建立的,用以表示未知類裏對應的成員。

這樣你就可使用 Constructor 建立新的對象,用 get() 和 set() 方法讀取和修改與 Field 對象關聯的字段,用 invoke() 方法調用與 Method 對象關聯的方法。另外,還能夠調用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及構造器的對象的數組。這樣匿名對象的信息 就能在運行時被徹底肯定下來,而在編譯時不須要知道任何事情。

clipboard.png

運行結果:無參構造器Run......有參構造器Run......Apple

Arrays.sort 和 Collections.sort 實現原理 和區別

Collection和Collections區別

java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操做的通用接口方法。

java.util.Collections 是針對集合類的一個幫助類,他提供一系列靜態方法實現對各類集合的搜索、排序、 線程安全等操做。 而後還有混排(Shuffling)、反轉(Reverse)、替換全部的元素(fill)、拷貝(copy)、返 回Collections中最小元素(min)、返回Collections中最大元素(max)、返回指定源列表中最後一次出現指定目 標列表的起始位置( lastIndexOfSubList )、返回指定源列表中第一次出現指定目標列表的起始位置 ( IndexOfSubList )、根據指定的距離循環移動指定列表中的元素(Rotate);

事實上Collections.sort方法底層就是調用的array.sort方法,

clipboard.png

clipboard.png

legacyMergeSort (a):歸併排序 ComparableTimSort.sort():Timsort 排序

Timsort 排序是結合了合併排序(merge sort)和插入排序(insertion sort)而得出的排序算法

Timsort的核心過程

TimSort 算法爲了減小對升序部分的回溯和對降序部分的性能倒退,將輸入按其升序和降序特色進行了分 區。排序的輸入的單位不是一個個單獨的數字,而是一個個的塊-分區。其中每個分區叫一個run。針對這 些 run 序列,每次拿一個 run 出來按規則進行合併。每次合併會將兩個 run合併成一個 run。合併的結果保 存到棧中。合併直到消耗掉全部的 run,這時將棧上剩餘的 run合併到只剩一個 run 爲止。這時這個僅剩的 run 即是排好序的結果。

綜上述過程,Timsort算法的過程包括

(0)如何數組長度小於某個值,直接用二分插入排序算法

(1)找到各個run,併入棧

(2)按規則合併run

前百度面試官整理的——Java後端面試題(三)

相關文章
相關標籤/搜索