Java基礎1.什麼是樂觀鎖?樂觀鎖:假設每次去拿資料都認為別人不會修改,所以不會上鎖.但是在更新的時候會判斷一下此期間別人有沒有去更新這個資料. 一般用在讀比較多,寫比較少的情況.悲觀鎖:假設每次都是最壞情況,每次去拿資料時別人都會修改,所以每次拿資料的時候都會上鎖,這樣別人想拿這個資料就會被阻塞直到它拿到鎖. 多寫少讀時使用.2.volatile關鍵字保證可見性,不保證原子性禁止指令重排序不快取,每次都是從主存中取1.3 hashmap 原理,紅黑樹是什麼?1.7 陣列+連結串列,連結串列過長時,會導致查詢效率退化1.8 陣列+連結串列+紅黑樹,當連結串列長度大於8轉為紅黑樹HashMap 的預設初始大小為 16,初始化大小必須為 2 的冪,最大大小為 2 的 30 次方。陣列中儲存的連結串列節點 Entry 類實現於 Map.Entry 介面,它實現了對節點的通用操作。HashMap 的閾值預設為 “容量 * 0.75f”,當儲存節點數量超過該值,則對 map 進行擴容處理。執行緒不安全的容器,解決併發問題使用ConcurrentHashMap(高效)或者是Collections.synchronizedMap().Collections.synchronizedMap()其實就是每個方法加一個synchronize,其實和HashTable 差不多.
紅黑樹
平衡的二叉查詢樹節點是紅色或者是黑色根節點是黑色每個葉子的節點都是黑色的空節點(NULL)每個紅色節點的兩個子節點都是黑色的從任意節點到其每個葉子的所有路徑都包含相同的黑色節點插入時會涉及到變色和旋轉4.jvm記憶體分配Java虛擬機器書中第二章
程式計數器Java虛擬機器棧本地方法棧Java堆方法區執行時常量池直接記憶體1.5 String,StringBuffer,StringBuilder 區別String,StringBuffer,StringBuilder最終底層儲存與操作的都是char陣列.但是String裡面的char陣列是final的,而StringBuffer,StringBuilder不是,也就是說,String是不可變的,想要新的字串只能重新生成String.而StringBuffer和StringBuilder只需要修改底層的char陣列就行.相對來說,開銷要小很多.String的大多數方法都是重新new一個新String物件返回,頻繁重新生成容易生成很多垃圾.........2. 安卓基礎1.安卓各版本大變化(Android 6.0到10.0有哪些大點變化),相容適配Android 5.0
Material DesignART虛擬機器Android 6.0
應用許可權管理官方指紋支援Doze電量管理執行時許可權機制->需要動態申請許可權Android 7.0
多視窗模式支援Java 8語言平臺需要使用FileProvider訪問照片安裝apk需要相容Android 8.0
通知,渠道->適配畫中畫自動填充後臺限制自適應桌面圖示->適配隱式廣播限制開啟後臺Service限制Android 9.0
利用 Wi-Fi RTT 進行室內定位劉海屏 API 支援多攝像頭支援和攝像頭更新不允許呼叫hide api限制明文流量的網路請求 httpAndroid 10
暗黑模式隱私增強(後臺能否訪問定位)限制程式訪問剪貼簿應用黑盒許可權細分需相容後臺定位單獨許可權需相容裝置唯一標示符需相容後臺開啟Activity 需相容非 SDK 介面限制 需相容2.熱修復原理原理
安卓在載入class時會透過雙親委託機制去載入一個類,先讓父類去載入,如果找不到再讓子類去載入某個類。透過檢視ClassLoader原始碼發現findClass方法是由每個子類自己實現的,比如BootClassLoader或者BaseDexClassLoader。而PathClassLoader是繼承自BaseDexClassLoader的,它的findClass也是在BaseDexClassLoader裡面實現的。BaseDexClassLoader的findClass裡面使用了另一個物件DexPathList去查詢對應的class,這是安卓裡面特有的實現。在DexPathList物件裡面有一個屬性dexElements,dexElements是用於存放載入好了的dex陣列的,查詢class是從這個dexElements數組裡面去找的。.........一句話總結
將修復好的類放在dexElements的最前面,這樣在載入類的時候就會被優先載入到而達到修復的目的.
3.MVC,MVP,MVVM首先需要知道的是為什麼要進行技術框架的設計? 肯定是為了低耦合,提高開發效率是吧,所以不要為了設計而設計。
MVC
在Android中View和Controller一般就是被Activity充當了,當邏輯非常多,操作非常複雜時,Activity程式碼量非常龐大,不易維護。
Model : 模型層,業務邏輯+資料儲存等View : 使用者介面,一般就是xml+ActivityController : 控制層,一般就是ActivityMVP
我個人角度,現在(2019年10月29日20:02:49)大多是使用這種方式,既不復雜也解耦合了.
Model:模型層,業務邏輯+資料儲存+網路請求View:檢視層,View繪製和使用者互動等,一般是ActivityPresenter:呈現層,連線V層和M層,完成他們之間的互動MVVM
為了更加分離M,V層,所以有了MVVM.
Model:模型層,業務邏輯+資料儲存+網路請求View:檢視層,View繪製和使用者互動等,一般是ActivityViewModel:其實就是Presenter和View的資料模型的合體.雙向繫結,View的變動會反應到ViewModel中,資料的變動也會反應到View上.4.元件化的好處任意修改都需要編譯整個工程,效率低下。解耦,有利於多人團隊協作開發功能複用5.app啟動流程Launcher startActivityAMS startActivityZygote fork程序Activity main()ActivityThread 程序loop迴圈開啟Activity,開始生命週期回撥...6.Activity啟動流程Activity startActivityForResultInstrumentation execStartActivityAMS startActivityApplicationThread scheduleLaunchActivityActivityThread.H handleMessage -> performLaunchActivityActivity attachInstrumentation callActivityOnCreate7.app體積最佳化可以使用lint工具,檢測出沒有用的檔案,同時可以開啟資源壓縮,自動刪除無用的資源。儘量多使用可繪製物件,某些影象不需要靜態影象資源,框架可以在執行時動態繪製圖像。儘量自己寫Drawable,能不用UI切圖就不用,佔用空間小。重用資源。比如一個三角按鈕,點選前三角朝上代表收起的意思,點選後三角朝下,代表展開,一般情況下,我們會用兩張圖來切換,我們其實完全可以用旋轉的形式去改變。..........8.app啟動最佳化利用提前展示出來的Window,快速展示出來一個節目,給使用者快速反饋的體驗,障眼法,治標不治本.避免在啟動時做密集沉重的初始化(Heavy app initialization)。啟動時 避免I/O操作,反序列化,網路操作,佈局巢狀等耗時操作9.app佈局最佳化如果父控制元件有顏色,也是自己需要的顏色,那麼就不必在子控制元件加背景顏色如果子控制元件有背景顏色,並且能完全覆蓋父控制元件,那麼父控制元件不用設定背景顏色儘量減少不必要的巢狀能用LinearLayout和FrameLayout,就不要用RelativeLayout,因為RelativeLayout相對比較複雜,測繪也相對耗時.include和merge一起使用,增加複用,減少層級ViewStub按需載入,更加輕便複雜介面選擇ConstraintLayout,可有效減少層級10.app記憶體最佳化頻繁使用字串拼接用StringBuilder或者StringBufferArrayMap、SparseArray替換HashMap避免記憶體洩漏 集合類洩漏(集合一直引用著被新增進來的元素物件) 單例/靜態變數造成的記憶體洩漏(生命週期長的持有了生命週期短的引用) 匿名內部類/非靜態內部類 資源未關閉造成的記憶體洩漏檢測記憶體洩漏的幾個工具:LeakCanary,TraceView,Systrace,Android Lint,Memory Monitor+mat11.記憶體洩漏有哪些集合類洩漏(集合一直引用著被新增進來的元素物件)單例/靜態變數造成的記憶體洩漏(生命週期長的持有了生命週期短的引用)匿名內部類/非靜態內部類資源未關閉造成的記憶體洩漏 網路,檔案等流忘記關閉 手動註冊廣播時,退出時忘記unregisterReceiver() Service執行完成後忘記stopSelf() EventBus等觀察者模式的框架忘記手動解除註冊12.app執行緒最佳化執行緒池 避免存在大量的Thread,重用執行緒池內部的執行緒,從而避免了執行緒的建立和銷燬帶來的效能開銷,同時能有效控制執行緒池的最大併發數,避免大量執行緒因互相搶佔系統資源而導致阻塞線現象發生。推薦閱讀 《Android開發藝術探索》 第11章。
分類
FixedThreadPool 數量固定的執行緒池CachedThreadPool 只有非核心執行緒,數量不定,空閒執行緒有超時機制,比較適合執行大量耗時較少的任務ScheduledThreadPool 核心執行緒數量固定,非核心執行緒沒有限制.主要用於執行定時任務和具有固定中週期的重複任務.SingleThreadPool 只有一個核心執行緒,確保所有的任務在同一個執行緒順序執行,統一外界任務到一個執行緒中,這使得在這些任務之間不需要處理執行緒同步 的問題. 優點減少在建立和銷燬執行緒上所花的時間以及系統資源的開銷不使用執行緒池有可能造成系統建立大量的執行緒而導致消耗完系統記憶體以及"過度切換" 注意點13.Android換膚如何實現,原理重新設定LayoutInflater的Factory2,從而攔截建立View的過程,然後搞成自己的控制元件,想怎麼換膚就怎麼換膚.
14.fresco原理,glide原理,兩者區別,哪個更省記憶體這塊暫時不懂,加入todo
15.DialogFragment 黑邊www.jianshu.com/p/c8044b2c2…
16.Handler原理,Android 訊息機制Handler機制的關鍵在於對於ThreadLocal原理的理解,執行緒私有資料,利用ThreadLocal機制將Looper存放到執行緒內部,perfect !
17.Android 系統架構應用層,應用框架層,系統執行庫層,硬體抽象層和Linux核心層
18.常用佈局有哪些FrameLayout,LinearLayout,RelativeLayout,ConstraintLayout,CoordinatorLayout等19.Android資料儲存有幾種方式SharedPreferences: 小東西,最終是xml檔案中,key-value的形式儲存的.檔案資料庫ContentProvider網路20.View,SurfaceViewView是Android中所有控制元件的基類View適用於主動更新的情況,而SurfaceView則適用於被動更新的情況,比如頻繁重新整理介面。View在主執行緒中對頁面進行重新整理,而SurfaceView則開啟一個子執行緒來對頁面進行重新整理。View在繪圖時沒有實現雙緩衝機制,SurfaceView在底層機制中就實現了雙緩衝機制。21.jni呼叫流程隔壁老李頭的系列文章非常棒,地址在這裡
22.元件之間相互引用 如何解決呼叫其他元件的對外提供的方法:之前看到過一種思路,利用"介面+實現"的方式,定義一個ComponentBase 中間層,然後裡面有每個元件對外提供方法呼叫的Interface,每個元件在初始化的時候就把這些Interface給實現了,然後其他元件需要用的時候就從ComponentBase裡面取。介面跳轉:ARouter23.自定義View 餅狀圖,點選事件,畫文字這個大家可以跟著hencoder老師的文章系統學習一下.
24.Android 數字簽名校驗使用者身份,校驗資料的完整性
25.fragment用在哪裡,與Activity的區別當Activity需要模組化的時候不同裝置上的適配,比如平臺和手機Activity相對Fragment而言,非常笨重,一般小介面小模組用Fragment比較合適.或者首頁的tab之類的.26.RxJava原理觀察者模式,鏈式
27.EventBus原理不太瞭解原理,很少使用,好像也是基於觀察者模式的一個框架。
28.View繪製原理主要是分析measure,layout,draw的過程。
29.Retrofit和OkHttp原理,攔截器Retrofit的話,原始碼寫的非常非常棒.主要是透過動態代理+獲取方法上面的註解等,然後組裝請求網路的引數,最後用OkHttp去請求網路OkHttp的攔截器鏈設計得非常巧妙,是典型的責任鏈模式.並最終由最後一個鏈處理了網路請求,並拿到結果.30.點選事件傳遞機制,事件分為哪幾種事件傳遞大體過程: Activity--> Window-->DecorView --> View樹從上往下,傳遞過程中誰想攔截就攔截自己處理,MotionEvent是Android中的點選事件。
主要事件型別
ACTION_DOWN 手機初次觸控到螢幕事件ACTION_MOVE 手機在螢幕上滑動時觸發,會回撥多次ACTION_UP 手指離開螢幕時觸發31.anr如何產生,Service觸發anr是多長時間(20秒),如何解決anr?如何解決那種莫名其妙的anr?我覺得anr就是在主執行緒做了耗時操作,比如io、讀寫檔案、資料庫操作等等。 anr發生之後一般會有日誌,在/data/anr/traces.txt裡面。
2.32 Dialog和Activity是同一個Window?不是同一個。
Activity的attach方法,這裡是為Activity例項化了一個PhoneWindow例項Dialog的構造方法裡面也是例項化了一個PhoneWindow例項33.Window,Activity,Dectorview之間的關係Activity裡面例項化了一個Window,Window裡面有一個DecorView(根佈局)。
34.ConstraintLayout和RelativeLayout在繪製方面有何差別?todo
35.onClick事件和onTouchListener在哪裡回撥?如果一個View需要處理事件,它設定了OnTouchListener,那麼OnTouchListener的onTouch方法會被回撥。如果onTouch返回false,則onTouchEvent會被呼叫,反之不會。在onTouchEvent方法中,事件為Action,UP的時候會回撥OnClickListener的onClick方法,可見OnClickListener的優先順序很低。
36.應用如何保活?這個確實不怎麼了解,主要是不建議保活,提升使用者體驗,特別是安卓高版本,谷歌是封殺得很嚴格的,不建議保活。
37.LinearLayout是如何測量(measure)的?如果有weight又是如何測量的?先做一次測量,做完之後有空間剩餘,有weight的View再測量一下,分一下剩餘的空間。
螢幕的寬度=設計稿寬度 * density
3. 其他1. Java四種引用
強引用,預設就是,寧願OOM,也不回收弱引用,記憶體不夠會被回收軟引用,GC時會被回收虛引用,它的作用在於跟蹤垃圾回收過程,在物件被收集器回收時收到一個系統通知。2.專案中遇到的最困難的事情是什麼?如何解決的?
每個人遇到的情況不同,這個提前思考一下自己做過的專案最有挑戰的地方。
3.Git基本操作
4.Kotlin優勢
完全相容java空安全支援lambda表示式支援擴充套件函式更少的程式碼量,更快的開發速度缺點就是有時候程式碼閱讀性可能會降低。
5.Kotlin 協程是什麼?
就是一個執行緒框架,提供了一套操作執行緒的api.
6.二叉樹,廣度優先遍歷,深度優先遍歷
推薦小灰的漫畫演算法
7.tcp,http,https,socket
8.敏捷開發
9.你經常使用哪些設計模式,常見設計模式的運用
10.3年之後工資怎麼想的
11.你的優勢
12.職業規劃(3年後幹啥,5年後幹啥)
13.應用,程序,執行緒之間的區別
進大廠的訣竅經過這幾年的“摸爬滾打”,我發現進大廠確實有一些訣竅,對於和我一樣背景一般的同學,只要你抓住了訣竅,進大廠不是夢。
1)一定要提前準備,至少準備個一個月,網上的面試題多看看,對於那些高頻題目,帶著理解去學習,實在不能理解的就背下來,大家高考的時候不都是背過來的。
2)大廠通常有很多部門,每個部門的hc數和招人標準都不一樣,即便是同個部門,如果hr不同,標準肯定也不一樣,重複投簡歷可以增大我們拿到面試機會的機率。同理,重複面試不同的部門,也可以增大我們進大廠的機率。
3)大廠經常會佈局新業務,新業務需要快速啟動入場,hc通常會有很多,因此招人的標準會稍微降低,這個時候是個絕佳的機會。我當時進的就是個新的業務部門。
面試系統複習路線有時候,選擇比努力更加重要,機遇比奮鬥更加重要。但是,機會只留給有準備的人。我們只有時刻準備著,才能在機會到來的時候,去抓住它。
這裡給大家分享一下我的面試複習路線,有需要的朋友可以參考一下:
1、看影片進行系統學習
前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因為Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以透過影片來學習,效果更好,也更全面。關於影片學習,個人可以推薦去B站進行學習,B站上有很多學習影片,唯一的缺點就是免費的容易過時。
2、進行系統梳理知識,提升儲備
客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
系統學習方向:
架構師築基必備技能:深入Java泛型+註解深入淺出+併發程式設計+資料傳輸與序列化+Java虛擬機器原理+反射與類載入+動態代理+高效IOAndroid高階UI與FrameWork原始碼:高階UI晉升+Framework核心解析+Android元件核心+資料持久化360°全方面效能調優:設計思想與程式碼質量最佳化+程式效能最佳化+開發效率最佳化解讀開源框架設計思想:熱修復設計+外掛化框架解讀+元件化框架設計+圖片載入框架+網路訪問框架設計+RXJava響應式程式設計框架設計+IOC架構設計+Android架構元件JetpackNDK模組開發:NDK基礎知識體系+底層圖片處理+音影片開發微信小程式:小程式介紹+UI開發+API操作+微信對接Hybrid 開發與Flutter:Html5專案實戰+Flutter進階知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。
3、讀原始碼,看實戰筆記,學習大神思路
“程式語言是程式設計師的表達的方式,而架構是程式設計師對世界的認知”。所以,程式設計師要想快速認知並學習架構,讀原始碼是必不可少的。閱讀原始碼,是解決問題 + 理解事物,更重要的:看到原始碼背後的想法;程式設計師說:讀萬行原始碼,行萬種實踐。
4、面試前夕,刷題衝刺
面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,演算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。
關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三: