安卓開發(Java)面試經歷
除了問專案經歷,一些技術性的問題如下:
記憶體回收機制(Garbage Collection,GC)
1. java的記憶體
- 堆 (是gc的主要區域) 執行緒共享,主要是用於分配例項物件和陣列
- 棧 執行緒私有,它的生命週期和執行緒相同,又分成 虛擬機器棧和本地方法棧,只有它會報 StackOverFlowError,棧深度超標
- 方法區 執行緒共享 用於儲存被虛擬機器載入的類的資訊,靜態變數 常量和編譯後的.class位元組碼
- 程式計數器 執行緒私有,執行緒之間不相互影響,獨立存取;
以上部分,執行緒私有是不會發生gc.並且他們是隨執行緒生隨執行緒滅,即程式計數器 本地方法棧和虛擬機器棧
2.GC回收機制–判斷是否可以gc
引用計數演算法
原理:通過一個計數器對物件進行計數,物件被引用時+1,引用失效時-1;當計數為0時則說明可以被回收;
缺點:很難解決物件的相互迴圈引用問題
可達性分析演算法
Java虛擬機器所採用的演算法;
原理:通過一些列稱為“GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈,當一個物件到GC Roots沒有任何引用鏈相連時,則證明此物件是不可用的。
那麼哪些物件可以被稱為gc roots呢—-虛擬機器棧(棧中的本地變數列表)/方法區靜態屬性/方法區常量引用/本地方法棧中JNI 所引用的的物件都是可以作為 gc roots的
3.GC回收機制–如何回收
標記清除演算法
清除演算法分成2個階段–標記和清除; 標記階段對所有存活的階段進行標記,標記完成後,再掃描整個空間未標記物件,直接回收不存活的物件.
優點:大多數情況下比較高效,缺點是會造成記憶體碎片,碎片太多導致後面過程中對大記憶體的分配無足夠空間時而提前猝發一次垃圾回收動作;
複製演算法
將可用記憶體將容量劃分成大小相等的2塊,每次清理時將其中A記憶體還存活的物件複製到B記憶體裡面,然後再把A中清理掉;
優點高效且並不產生碎片,缺點犧牲了一半的記憶體為代價
適用存活物件少,回收物件多
標記整理演算法
該演算法標記階段和標記清除演算法一樣,完成標記後它不是直接清理可回收物件,而是將存活物件都向一端移動最後清理掉端邊界意外的記憶體;
適用於存活物件多,回收物件少的情況
分代收集演算法
整合了複製演算法和標記整理演算法,根據新生代和老年代的不同特性採取上面的不同演算法
新生代 生命週期短,每次回收時都有大量垃圾物件需要回收 複製演算法
老年代 每次只有少量的物件需要回收 標記整理演算法
Tcp與udp
內容來源
TCP與UDP基本區別
1.基於連線與無連線
2.TCP要求系統資源較多,UDP較少;
3.UDP程式結構較簡單
4.流模式(TCP)與資料報模式(UDP);
5.TCP保證資料正確性,UDP可能丟包
6.TCP保證資料順序,UDP不保證
UDP應用場景:
1.面向資料報方式
2.網路資料大多為短訊息
3.擁有大量Client
4.對資料安全性無特殊要求
5.網路負擔非常重,但對響應速度要求高
http與https的區別
HTTP協議以明文方式傳送內容,不提供任何方式的資料加密
HTTPS存在不同於HTTP的預設埠及一個加密/身份驗證層(在HTTP與TCP之間)
HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。
感覺這裡要使用過https程式設計才會有更深的理解
手寫二叉樹的遍歷
寫完面試官就看了一眼….應該沒什麼問題
override與overload的區別
Override是重寫:方法名稱、引數個數,型別,順序,返回值型別都是必須和父類方法一致的。它的關係是父子關係
Overload是過載:方法名稱不變,其餘的都是可以變更的。它的關係是同一個類,同一個方法名,不同的方法引數或返回值。
備註:它們都是是Java多型性的不同表現
檔案系統與資料庫的區別
檔案系統和資料庫系統之間的區別。
(1)檔案系統用檔案將資料長期儲存在外存上,資料庫系統用資料庫統一儲存資料;
(2)檔案系統中的程式和資料有一定的聯絡,資料庫系統中的程式和資料分離;
(3)檔案系統用作業系統中的存取方法對資料進行管理,資料庫系統用DBMS統一管理和控制資料;
(4)檔案系統實現以檔案為單位的資料共享,資料庫系統實現以記錄和欄位為單位的資料共享。
問專案的時候即興問的一個問題。。。還是沒答上來
其實也很久沒有打java程式碼,用的時候也沒有去思考這些問題,感覺要提前做好充分準備
面試於2018/4/14日上午