映客
1.ConstraintLayout 、FrameLayout 右下方放一個view
約束布局,可以對他的子view,比如TextView,約束其右邊界在某某控制元件的右部一側,約束其底部在某某控制元件的底部一側,layout_constraintRight_toRightOf="parent",layout_constraintBottom_toBottomOf="parent";FrameLayout,默認其子控制元件都是堆疊在布局的左上角,如果要實作將一個View放在其右下角,可以給view設定layout_gravity="right|bottom"屬性,相對其父控制元件居右、居底,
2.從架構層面介紹自己設計的模塊
3.專案中遇到多執行緒的問題
4.Recycler中onCreateViewHolder何時被呼叫多次 ,利用RecyclerView如何畫圓環
5.執行緒池的原理,執行緒個數最優分配 ,如果是無限長佇列,如何設定拒絕策略
6.volatile的作用
7.Activity生命周期方法,透明和非透明兩種
8.onDraw方法需要注意什么
9.圖片壓縮的幾種方式
10.大圖片加載
11.jpg和png的差別
12.資料庫升級遇到的過什么問題,怎么解決?
TraxChina
1.String 、StringBuffer 、 StringBuilder區分
2.Invalidatefinish方法
3.是否可以在方法里定義靜態變數
public void test(){
Static int a = 3;
}
跟誰學
1.Android事件分發機制,dispatchTouchEvent方法回傳true、false、super.dispatchTouchEvent各表示什么意思
2.屬性影片、和幀影片,從性能上有何優缺點,
3.Arouter核心原理
4.Glide核心原理
5.如何從view層性能優化,TraceView如何使用
6.Activity的啟動流程,可以從哪些地方做優化
7.UI卡頓的檢查、處理
8.HashMap底層原理,ArrayList底層原理
9.兩個int型別的鏈表,合并成一個鏈表并按順序排列,
作業幫
1.ClassLoader的雙親委派機制
2.HashTable、HashMap原理
3.Arouter關聯表關系,EventBus實作原理,
4.物件的結構
5.IPC Binder機制
6.歸并排序,二叉樹遍歷
7.View.post()和handler.postDelay()實作原理
8.系統原始碼有沒有留意單例的使用
9.LogUtils的封裝
10.執行緒池阻塞佇列的實作原理
11.WebView優化 (加載的時候先將資源快取)
12.泛型擦除
微博一面
1.方法鎖、類鎖的區別
2.ThreadLocal的實作原理
3.一個view被繪制到頁面上的流程
4.OkHttp原理
5.事件分發流程,如果所有View都不消耗,最后事件由誰處理
6.怎樣確保A、B、C三個執行緒都執行完后,才執行D執行緒
7.觀察者模式和訂閱者模式的區別
8.UI優化
9.亮點功能
微博二面:
1.Glide快取原理,LruCache如何實作,如果讓你自己實作該如何做?
2.記憶體優化都做了哪些優化?
3.Handler機制原理,可否利用handler機制監控頁面卡頓,怎么做?
4.Dalvik和ART虛擬機差別?
5.青蛙跳箱子問題
WiFi鑰匙
1.什么是服務,前臺服務和后臺服務有沒有了解?
2.AIDL流程
千喜鶴
1.HashMap底層原理,怎么判斷存鏈表還是存紅黑樹?
2.ConcurrentHashMap如何使用,如何保證執行緒安全?
3.Handler訊息機制,同步訊息、異步訊息、訊息屏障區別,post和send的區別
4.APP繪制流程
setContentView 其內部是通過PhoneWindow將我們的布局添加到其內部的mContentParent中,在ActivityThread的handleResumeActivity中,會呼叫WindowManager的addView方法將DecorView添加到WMS中,這樣DecorView被渲染到螢屏上顯示,并且可以接收螢屏觸摸事件;而WindowManager的最終實作是WindowManagerGlobal,在其setView方法中創建了一個最關鍵的物件ViewRootImpl物件,通過ViewRootImpl的setView方法,執行requestLayout()完成測量繪制,并將View添加WMS中,而且在setView中還設定了輸入事件的處理,設定了一系列的輸入管道,一個觸屏事件發生后,經過驅動層一系列計算通過Socket跨行程通知WMS,最終螢屏事件會被發送到輸入管道里,最終呼叫PhoneWindow的dispatchTouchEvent,其內部的callback指的就是activity,這樣事件就到了Activity的dispatchTouchEvent中了,
5.AMS、PMS
6.6.0~10.0的適配
7.Glide使用流程,傳入Application和Activity有什么區別
8.OKHTTP原理,攔截器加載順序
9.Retrofit的使用
10.APP啟動流程
1.ActivityA --> ActivityManagerService:我們的呼叫startActivity后最終交由Instrumentation的exeStartActivity方法,Instrumentation是用來做應用行程和系統行程互動的,在其方法內通過AIDL 來呼叫AMS的startActivity方法,
2.ActivityManagerService --> ApplicationThread:AMS只做了兩件事,一是綜合處理LaunchMode和Intent的flag標志位,并根據處理結果生成一個目標Activity物件,二是判斷是否要為目標物件創建一個新的行程或新的任務堆疊,我們在執行Instrumentation的方法時傳入了一個ApplicationThread的參考,這個類就是負責行程間通信的,AMS最終就是呼叫了B行程中的一個ApplicationThread參考,從而間接通知B行程進行相應操作,
3.ApplicationThread -> Activity:通過ApplicationThread參考,最終呼叫ActivityThread的scheduleTransaction方法,該方法通過Handler發送了一個Message,Message的obj就是啟動Activity的事務物件,最終呼叫事務的execute方法,最終呼叫ActivityThread的handleLaunchActivity方法,通過反射創建指定的Activity,最終通過Instrumentation呼叫其onCreate方法,
小紅書
1.自定義view ,在draw方法里畫個背景,設定Wrap_content,放到一個100*100的父布局里,view的寬高多大
不處理wrap_content,默認是match_parent的效果,我們可以在wrap_content的時候設定一個最小默認寬高,來解決這個問題;
2.在onCreate能獲取View的寬高嗎,onResume里可以嗎?
都不可以,在onResume方法里,DecorView才被添加到WMS中,觸發View的繪制,
在onCreate中
3.EventBus原理,EventBus是跨行程的嗎?
不是跨行程的,
首先在EventBus的register方法中通過反射遍歷注冊物件的所有方法,將帶有@Subscribe標簽的方法放入到一個串列里,最后以注冊物件為key,以串列為value放入一個HashMap中,
訂閱事件和訂閱者之間也有一個關聯關系表,當post執行的時候會查找訂閱了該Event的訂閱者并呼叫其方法,
postSticky的時候會將event和event.getClass保存起來,當有新事件要注冊監聽時,遍歷map,如果有會執行一次回呼,
4.在ListView和RecyclerView中LayoutInflater的inflate方法,最后一個布林值設定什么,設定為true會有問題嗎?
- root不能為空,否則布局檔案中設定的布局引數不會起作用
- attach不能設定為true,否則inflate回傳的布局為RecylerView,而不是我們希望回傳的自定義布局物件
- 必須為RecylerView指定LayoutManager,否則會拋出例外
就拿我們的Adapter來說吧,在創建item布局時,有下列幾種情況:
- inflate(R.layout.xxx,null);
- inflate(R.layout.xxx,parent,false);
- inflate(R.layout.xxx,parent,true);
那么就講一下這三種情況把,
首先,inflate(R.layout.xxx,null) ,這是最簡單的寫法,這樣生成的布局就是根據http://R.layout.xxx回傳的View,要知道,這個布局檔案中的寬高屬性都是相當于父布局而言的,由于沒有指定parent,所以他的寬高屬性就失效了,因此不管你怎么改寬高屬性,都無法按你想象的那樣顯示,
然后,inflate(R.layout.xxx,parent,false),相較于前者,這里加了父布局,不管后面是true還是false,由于有了parent,布局檔案的寬高屬性是有依靠了,這時候顯示的寬高樣式就是布局檔案中的那樣了,
最后,inflate(R.layout.xxx,parent,true),這樣……等等,報錯了???哦,不要驚奇,分析一下原因:首先,有了parent,所以可以正確處理布局檔案的寬高屬性,然后,既然attachToRoot為true,那么根據上面的原始碼就會知道,這里會呼叫root的addView方法,而如果root是listView或者RecyclerView都會報錯,
adpater里面不要用true,那么什么時候用true呢?答案是fragment,在為fragment創建布局時,如果為true,那么這個布局檔案就會被添加到父activity中盛放fragment的布局中,
5.自定義view滑動的時候,通過設定什么方法實作滑動位置,
在MOVE事件里獲取坐標,然后設定setX(),setY()
6.啟動優化都做了哪些?
影響啟動速度的因素有:
- 高耗時任務:比如三方框架初始化、MultiDex的加載、大檔案讀取導致c阻塞;
- 復雜的View層級:嵌套的Layout過多,導致View渲染程序中,影響Measure、layout的執行速度;
- 類過于復雜:Java物件創建需要一定的時間,如果一個類結構特別復雜,new一個物件也比較耗資源,特別是單例;
- 主題及Activity配置:由于主題切換,可能導致白屏,或者點了icon,過了一會才啟動頁面;
解決方案:
- 優化方法數:通過配置minify選項,打包時洗掉掉沒有用的方法,少用一些不必要的框架,或者找輕量級框架;
- Dex懶加載,將dex的加載放到Splash頁面;
- 三方框架放到執行緒池里初始化,或者通過異步作業協程;
- 一些優先級低的三方庫初始化,我們可以通過Looper.myQueue().addIdleHandler(),向MessageQueue中插入一條IdleHandler,IdleHandler只會在主執行緒空閑時才會被Looper從佇列中取出來執行,
- 避免在APP啟動的時候做資料庫的耗時任務;
- 通過Studio工具Layout Inspector,分析層級嵌套,優化布局;
- 使用沒有ActionBar、TitleBar的主題,相當于在DecorView里少了一個view,所以能有效提高啟動速度;(全屏主題,并設定背景為layer-list,這樣不 生成view,減少view繪制時間)
7.怎么優化Activity的啟動速度,怎么優化跨行程的Activity啟動速度
通過Studio工具Layout Inspector,分析層級嵌套,優化布局;在onPause方法里少做操作;在第二個頁面里盡量避免大物件的使用;
8.Arouter原理,Arouter怎么生成java檔案
Arouter使用Apt技術,在編譯階段將路由path和組件類生成具有映射關系類,Arouter根據用戶請求的postcard,需要要跳轉的目標地址,
Arouter采用了分組+按需加載的思想,分組就是在原來的path到目標的map外,再加一個新的map,這個map保存了組名到組加載器的映射關系,組加載器是一個類,可以加載組內的path到目標的映射關系,按需加載時,當呼叫navigation方法時,執行緒記憶體里的path到目標的映射表去找(第一次通常為空),找不到然后再從通過組名找到對應的組加載器,組加載器加載改組內的路由映射關閉,并將其添加到快取中,
9.ConcurrentHashMap支持并發讀嗎,支持并發寫嗎?
10.事件分發流程,
11.HashMap插入鏈表的時候,是在表頭插入還是表尾插入?
12.Kotlin
13.Glide的加載流程
14.二叉樹遍歷
前、中、后遍歷,以根節點父節點的遍歷順序來區分的,如果先遍歷父節點,再遍歷左子樹、右子樹就是前序遍歷;
15.Android做了哪些適配,8.0通知欄適配,和10.0適配
6.0隱私權限動態申請;7.0的FileProvider,和不支持權限組申請;
Android 8.0通知欄訊息分渠道,如果不適配,訊息通知可能無法完全彈出,所以一定要適配,我們可以創建自己的通知渠道,然后在自定義通知的時候設定下發到哪個渠道,
Android8.0應用圖示適配,將其分為前景層和背景層,
Android9.0默認不支持Http協議;要求啟動前臺服務的時候要先請求FOREGROUND_SERVICE權限,
Android10.0設備id非系統APP無法獲取,可以通過硬體資訊加上一些計算生成一個;取消讀寫本地檔案的權限,新增獲取系統媒體檔案的權限;
16.怎樣啟動一個Activity,是new出來的嗎?
ActivityThread呼叫performLaunchActivity方法,通過反射創建Activity物件,并執行其attach方法,Window就是在attach方法中被創建的;
17.Http和Https區別,抓包方式有差異嗎,Http的post請求和get請求能抓包嗎,都是明文傳輸嗎?
阿里影業
1.Handler機制里Message是怎么獲取的,Message類似什么設計模式
2.session機制過期,后續的處理邏輯是怎樣的,要注意哪些(比如多個請求session失效,請求佇列存盤)
3.Kotlin、Jetpack
4.vue知識
5.Okhttp里執行緒池的阻塞佇列和兩個佇列怎么配合使用的?
6.SharePreferences是執行緒安全的嗎,是行程安全的嗎,commit和apply的區別?
sp是執行緒安全的,谷歌使用3把鎖保證多執行緒下sp的寫操作安全;commit是在UI執行緒做提交,apply是在子執行緒中操作,設計apply的初衷是為了解決ANR,但也無法完全規避,當Activity.onStop()以及Service處理onStop等相關方法時,則會執行 QueuedWork.waitToFinish()等待所有的等待鎖釋放,因此如果SharedPreferences一直沒有完成更新任務,有可能會導致卡在主執行緒,最終超時導致ANR;sp沒有使用跨行程鎖,所以是行程不安全的,跨行程讀寫會有資料丟失的可能,我們可以使用檔案鎖,保證同一時刻只有一個行程在操作sp,也可以使用谷歌倡導的跨行程通信組件ContentProvider,其他行程通過定制ContentProvider,用于訪問sp,同樣也能保證sp的行程安全,同時sp在寫的時候也有檔案備份機制,能夠保證之前存盤的資料恢復,
滴滴
startActivity是同步還是異步,哪個執行緒給哪個執行緒發訊息?
Hander能發送同樣的訊息嗎
Postdelay 1秒和10秒,誰先執行
按執行時間插入排序,所以1秒的先執行,只是他只能保證1秒后執行,不能保證正好在1秒的時候執行,
Aidl是同步還是異步
類點class是什么型別的物件
在主執行緒做耗時操作會報什么例外
如果在主執行緒做網路請求,會拋NetWorkOnMainThreadException例外,如果做其他耗時操作比如遍歷大陣列,IO,會導致ANR,
物件鎖類鎖會不會互相影響
靜態變數是在什么時候被加載到記憶體的
Retroit livedata
Socket 和aidl差別
掌閱
有沒有遇到過https安全性問題
證書篡改、DNS劫持
美團
1.LeakCanary原理
它通過監控Activity的宣告周期,當activity呼叫onDestroy方法時,將activity物件包裝到弱參考中,如果該弱參考物件被回收,弱參考物件就會被放到ReferenceQueue佇列中,通過監控佇列里的內容就能檢查到Activity是否被真正回收,
2.OKHTTP相比HTTPURLConnection的優點是哪里
透明的gzip壓縮;各種攔截器;支持多種型別的資料快取;
3.TCP和UDP的區別
有沒有遇到過線上OOM的情況
一般批量圖片加載的時候,或者加載大圖時,容易OOM,線上遇到過表單泄漏、堆疊溢位的情況(遞回的結束條件沒處理好),執行緒池使用時有可能OOM,
插件化原理
一般實作方式有反射、hook等方案,插件化原理多用hook方案,比如hook主IActivityManager,先在清單檔案里占坑,再在合適時候將目標物件塞到啟動占坑頁面的Intent中,在將要啟動占坑頁面的時候再修改具體要跳轉的Activity,
火花思維
深拷貝、淺拷貝區別
參考拷貝:創建一個指向物件的參考變數的拷貝,它指向同一個物件,
物件拷貝:創建物件本身的一個副本,物件拷貝的方法,呼叫物件的clone方法,比如Student stu2 = stu1.clone();
深拷貝和淺拷貝都是物件拷貝,區別如下:
淺拷貝,拷貝原物件里的屬性,但如果屬性有物件屬性,那么只是拷貝物件屬性的參考;深拷貝的話,是拷貝原物件的所有,包括其屬性是物件型別的,也會clone新的地址,
什么是泛型,作用是什么?
泛型字面意思就是廣泛的型別,可以是介面、類、方法應用于非常廣泛的型別,它使代碼和他們操作的資料型別不再系結在一起,同一套代碼可以用于多種資料型別,降低耦合性、提高代碼復用性、安全性,
編譯的時候,編譯器會將泛型轉為非泛型的物件,將泛型擦除,替換為Object,插入必要的強制型別轉換,
什么是反射?
反射就是讓我們獲得一個類的所有資訊,
HashMap相關問題
1.HashMap的初始容量是怎么計算的?
通過位運算,將傳入的引數右移一位、兩位、四位、8位這樣,然后做異或,計算出第一個大于該引數的2的n次冪,HashMap初始容量是16,初始擴容因子是0.75,之所以用位運算,是因為其效率高,
2.hash函式是怎么計算的?
static final hash(Object key){
int h ;
return (key == null)? 0 : (h = key.hashCode()^(h >>> 16));
}
key.hashCode()回傳的是一個int型別,也即32位的數,然后將其右移16位后做異或(異或就是相同回傳0,不同回傳1),
hash函式計算出的結果值,再和(容量-1)做與運算,便得出下標索引,
3.put程序是怎樣的?
先獲取位置,然后獲取位置上的值,如果沒有則放置上,如果有,則遍歷節點,通過key判斷是否有和其相同key的Node,如果有直接覆寫,如果沒有,則采用頭插法,插入元素,
4.什么時候擴容,機制時怎么實作的?
HashMap容量達到容器長度*擴容因子時,就會擴容,原容量左移一位,也即是原容量的二倍;遍歷原陣列,其中每個item變成游離的狀態,重新計算各個元素下標,如果下標處沒有值,直接復制,如果有值,變成頭結點,之前的值變成子節點,
5.鏈表過長,每次遍歷這個鏈表,會影響性能嗎?
紅黑樹:能夠減小查找范圍,不用從頭到尾遍歷,紅黑樹是一個搜索樹,是一種接近平衡的二叉樹,
紅黑樹的特性:每個節點要么是黑色,要么是紅色;根節點是黑色;如果節點是紅色,那么它的子節點必須是黑色(反之不一定成立);從根節點到葉節點或者空子節點的每條路徑,都包含相同數目的黑色節點;
6.HashMap,執行緒不安全,可能出現兩種情況,一可能同一個位置的值被覆寫;二可能會在擴容的程序中拋例外;
Android中setOnTouchListener、onTouchEvent、setOnClickListener的呼叫順序?
setOnTouchListener ----> onTouchEvent ----> setOnClickListener,setOnTouchEvent的onTouch事件,回傳true表示不想下傳遞,就不進入到onTouchEvent中了,
onTouchEvent的回傳值,回傳true、false、super.onTouchEvent()的區別?
true,表示消費此次時間,false即不消費;super.onTouchEvent()即直接交由父view的onTouchEvent()方法,
LeakCanary原理
1.通過ActivityLifeCycleCallbacks監聽Activity的宣告周期,在其onDestroy被呼叫的時候,將Activity包裝成一個WeakReference物件,并在弱參考的構造方法里傳入一個ReferenceQueue,
2.同時這個弱引物件會標記一個亂數key,并將這個key存盤在強參考set集合里;
3.當系統gc的時候,會把被回收物件的弱參考都添加到ReferenceQueue中,主動觸發gc,遍歷佇列,將將佇列里的弱參考物件的key從Set集合里移出,遍歷完之后,仍然在Set集合里的key,對應的WeakReference所包含的物件就是記憶體泄漏的物件,
BlockCanary原理
如果主執行緒被卡住,則其實是在Looper的loop方法里的 msg.target.dispatchMessage(msg)耗時,我們可以記錄該方法執行前后的時間戳,得到差值再跟設定的閥值對比,大于閥值則dump出堆疊資訊,以及CPU資訊,
1.ContentProvider
它主要用來實作跨行程間資料共享,是一套安全的訪問機制,Android通過ContentProvider實作圖片、音頻、視頻資料共享,底層使用的是Binder機制,
1.Service
本地服務:指的是服務和啟動服務的activity在同一個行程中
遠程服務; 指的是服務和啟動服務的activity不在同一個行程中,
啟動本地服務用的是顯式啟動; 遠程服務的啟動要用到隱式啟動,
3.BroadCastReceiver
普通廣播:完全異步執行的廣播,當廣播發出后,幾乎所有廣播接收器都會在同一時間收到這條廣播,
有序廣播:是一種同步執行的廣播,廣播發出后,只會有一個廣播接收器能接收到廣播訊息,當這個廣播接收器接收到后,廣播才會繼承傳遞,對于有序廣播有了先后順序,在Android中提供了優先級的屬性(priority)來控制先后,有序廣播中可以截斷廣播,不被下一個廣播接收器接收,這是有序廣播的特點,
4.執行緒池的shutdown和shutDownNow區別
shutDown是將當前執行的執行緒狀態置為SHUTDOWN狀態,而且不再往執行緒池里添加任務,只在執行的任務執行完畢后才退出;shutDownNow是將當前執行執行緒狀態都置為STOP,并試圖停止執行緒執行,而且不再往執行緒池里添加任務,終止執行緒的辦法是通過呼叫Thread.interrupt()方法來實作的,但如果執行緒中沒有sleep、wait、Condition、定時鎖等,則無法回應中斷,所以仍然會執行下去,
阿里二面
1.final修飾的變數,如果是物件,物件里的屬性能修改嗎?
final修飾的變數,如果是基本資料型別,則初始化后不能再被修改,如果是參考型別,初始化后則不能再指向別的物件,但他指向的物件,其內部屬性是可以更改的,
2.重寫equal和hashCode需要注意什么?
==比較的是兩個參考的指標地址是否相等;equal方法則比較的是兩個物件的內容是否相等,不過Object的equal方法也是==判斷,比的是地址,
如果只重寫equal不重寫hashCode,則在一些集合容器里,相同的物件會散列到不同的位置,導致相同物件不能覆寫的問題,
小米
1.自己對自己的定位評價、能給團隊帶來什么?
2.WebView + Recycler這種如何實作?
3.A (standard)、B(standard)、C(singleTask) D(singleInstance)、B、C,頁面銷毀的先后順序
C銷毀后,同堆疊里的A銷毀,然后才是單獨堆疊里的D銷毀
4.一個大檔案里有很多很多個數,沒法一直讀取到記憶體,請找出最大的數?
5.強、軟、弱、虛的作用
強參考,只要物件和參考直接沒有切斷聯系(沒有置null),即便記憶體不足,也不會被回收,會拋OOM;
軟參考,只有記憶體不足的時候才會被GC回收,常用來實作快取技術,圖片快取、瀏覽器快取等;
弱參考,GC時被回收,可以用來監控物件是否被回收;虛參考,隨時可能被回收,主要用于監控物件是否從記憶體中洗掉,
6.ConcurrentHashMap 1.7和1.8的改動,為什么要這么改?
7.Handler機制里,入佇列不俺順序可以不?
百度
1.MVC,MVP、MVVM區別
MVC:View觸發事件,傳遞到Controller層,Controller層完成業務邏輯后,呼叫Model層更改狀態,Model處理完后將資料傳遞給View,View更新,所有的通信都是單向的,
MVP:以P層為核心,從Model中取資料,并通過介面回呼的形式填充到View中,Model和View不再有聯系,P分別于View和Model保持雙向通信,
MVVM:它與MVP類似,V層和Model層不互相通信,ViewModel層取代了Presenter層,不同點是View和ViewModel采用雙向系結,View的變動自動反應在ViewModel上,
2.Retrofit的使用
3.RxJava
RxJava把復雜的邏輯串成一條線,很簡潔的實作異步操作,RxJava的觀察者模式,Observable是被觀察者,Observer是觀察者,通過subscribe()方法實作訂閱關系,類比Android中的點擊事件也是觀察者模式,View是被觀察者,OnClickListener是觀察者,setOnClickListener來實作訂閱,也就是被觀察者持有觀察者的參考,當被觀察者的某種狀態改變時,呼叫觀察者的回呼方法做通知,RxJava與之不同的是,他不但有onNext()方法,還有onComplete()和onError()方法來處理事件佇列是否正常執行,后兩個方法是互斥執行的,
RxJava默認的規則中,事件的發送和處理都是在同一個執行緒中,但觀察者模式本身的目的就是”后臺處理,前臺回呼“的異步機制,RxJava實作異步的另外一個概念是Scheduler,
Schedulers.immediate(): 直接在當前執行緒運行,相當于不指定執行緒,這是默認的Scheduler,Schedulers.newThread(): 總是啟用新執行緒,并在新執行緒執行操作,Schedulers.io(): I/O 操作(讀寫檔案、讀寫資料庫、網路資訊互動等)所使用的Scheduler,行為模式和newThread()差不多,區別在于io()的內部實作是是用一個無數量上限的執行緒池,可以重用空閑的執行緒,因此多數情況下io()比newThread()更有效率,不要把計算作業放在io()中,可以避免創建不必要的執行緒,
map()方法是一對一的物件轉換,flatMap()是一對多的轉換,
小米二面
1.EventBus的優點是什么,為什么不用廣播,EventBus怎么實作切執行緒?
2.靜態廣播和動態廣播的注冊時機分別是什么時候?
3.EventBus使用反射影響效率,這個問題有沒有得到解決?
4.如何實作字母索引,繼承View可以實作嗎?
5.Sysnchronized與ReentrantLock實作原理有何不同?
6.volatile是執行緒安全的嗎?
7.startActivity的時候有哪個類加載器去加載?
PathClassLoader
8.APP啟動時發生的事情?
1.先去從zygote行程fork一個行程,
2.fork行程后,會呼叫ActivityThread的main()方法,new出一個ActivityThread物件,并且會把它與Application做關聯,即attach()方法;
3.attach會引發一些列的事件,這個程序會先后創建ClassLoader、appContext和Application,把Application和ActivityThread關聯到一起;
4.呼叫Instrumentation的callApplicationOnCreate(app)觸發Application的onCreate方法;
9.Synchronized和lock的底層實作原理
Synchronized是JVM層面的鎖,映射到位元組碼指令時,會產生兩個指令,monitorEnter、monitorExit,當執行緒遇到monitorEnter的時候就會嘗試獲取鎖,monitorExit釋放鎖,Synchronized是悲觀鎖,而Lock底層是CAS和Volatile來實作,競爭激烈的環境下用lock鎖,競爭不激烈建議用Synchronized,因為Synchronized鎖不可降級,經歷一個短暫的高峰之后,synchronized所有的鎖都會成為重量級鎖,這個時候效率就會降低,
瓜子
1.組件間如何通信,大檔案如何共享讀寫
2.通過腳本轉換格式
3.介紹一次網路通信程序,以及可能遇到的問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/229899.html
標籤:其他
