大廠電話面試題(別問細節看就完了)
覺得有用看就完了,不過想吐槽盡情就放馬過來,哈哈哈!
996.ICU直通車 看完面試題,來吐槽吧!
1、Android的四大元件是哪些
Activity:Activity是Android程式與使用者互動的視窗,是Android構造塊中最基本的一種,它需要為保持各介面的狀態,做很多持久化的事情,妥善管理生命週期以及一些跳轉邏輯
(1)兩個Activity A, B 。A啟動B,這過程中執行的什麼週期方法
(2)三個acitivty A,B,C。 A啟動B,B啟動C,C按返回鍵直接會退到A(考察Activity啟動模式)
(3)四個Activity A,B,C,D。相互跳轉的時候,不建立新的Activity並且也不銷燬
(4)Activity的生命週期方法不回掉
fragment 生命週期
Fragment is added ---> onAttach()--->onCreate--->onCreateView-->onActivityCreated-->onStart-->onResume-->可見
-->onPause-->onStop-->OnDestroyView-->onDestroy-->onDetach-->Fragment is destroyed
service:後臺服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事物,定義好需要接受的Intent提供同步和非同步的介面
(1)service啟動方式,以及各自的什麼週期
(2)Activity和services通訊
(3)IntentService 中封裝HandlerThread,Activity中開啟執行緒下載和啟動一個IntentService下載的區別
JobService 和JobIntentService---》在Android8.0及以上JobIntentService和JobService做的事情是相同的,都是等著JobScheduler分配任務來執行
不同點在於,JobService使用的handler使用的是主執行緒的Looper,因此需要在onStartJob()中手動建立AsyncTask去執行耗時任務,而JobIntentService
則幫我們處理這一過程,使用它只需要寫需要做的任務邏輯即可,不用關心卡住主執行緒的問題。另外,向jobScheduler傳遞任務操作也更簡單了,
不需要在指定JobInfo中的引數,直接enqueue(context,intent)就可以
(4)先startService然後bindService
(5)在呼叫 bindService 繫結到Service的時候,應當保證在某處呼叫 unbindService 解除繫結(儘管 Activity 被 finish 的時候繫結會自動解除,並且Service會自動停止);
(6)使用 startService 啟動服務之後,一定要使用 stopService停止服務,不管你是否使用bindService;
(7)同時使用 startService 與 bindService 要注意到,Service 的終止,需要unbindService與stopService同時呼叫,才能終止 Service,不管 startService 與 bindService 的呼叫順序,
如果先呼叫 unbindService 此時服務不會自動終止,再呼叫 stopService 之後服務才會停止,如果先呼叫 stopService 此時服務也不會終止,而再呼叫 unbindService 或者 之前調
用 bindService 的 Context 不存在了(如Activity 被 finish 的時候)之後服務才會自動停止;
(8)當在旋轉手機螢幕的時候,當手機螢幕在“橫”“豎”變換時,此時如果你的 Activity 如果會自動旋轉的話,旋轉其實是 Activity 的重新建立,因此旋轉之前的使用 bindService 建
立的連線便會斷開(Context 不存在了),對應服務的生命週期與上述相同。
(9)在 sdk 2.0 及其以後的版本中,對應的 onStart 已經被否決變為了 onStartCommand,不過之前的 onStart 任然有效。這意味著,如果你開發的應用程式用的 sdk 為 2.0 及其以後
的版本,那麼你應當使用 onStartCommand 而不是 onStart。
Content Provider:是Android提供的第三方應用資料的訪問方案,可以派生Content Provider類,對外提供資料,可以像資料庫一樣進行選擇排序,遮蔽內部資料的儲存細節,向外提供統一的藉口模型,大大簡化上層應用,對資料的整合提供了更方便的途徑
(1)與sharedPreference 聯合使用誇程序資料儲存,更優的方式是對檔案加鎖或對資料庫的操作
(2)
BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關訊息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型
(1)Android中的廣播使用了設計模式中的觀察者模式,將廣播的傳送者 和 接收者 解耦,使得系統方便整合,更易擴充套件
(2)訊息訂閱者、訊息釋出者、訊息中心
(3)不在onCreate() & onDestory() 或 onStart() & onStop()註冊、登出是因為:
當系統因為記憶體不足(優先順序更高的應用需要記憶體,請看上圖紅框)要回收Activity佔用的資源時,
Activity在執行完onPause()方法後就會被銷燬,有些生命週期方法onStop(),onDestory()就不會執行。當再回到此Activity時,是從onCreate方法開始執行。
(4)廣播分為哪幾種(有序、無序、動態、靜態、普通、系統、粘性(失效)、App應用內廣播)
(5)LocalBroadcast
四大元件那些執行在主執行緒,那些在子執行緒
2、Handler 原理 (死迴圈怎麼阻塞的,MessageQueue的儲存資料結構,Message是怎麼樣回撥handler中的handlerMessage方法的,延遲時間是否準確)
3、ANR 如何分析
ANR的原理
ANR的原因:先看主執行緒的堆疊,是否有耗時的操作或阻塞、死鎖。接著看看 ANR 日誌中 iowait、CPU、GC、system server 等資訊,
進一步確定是 I/O 問題,或是 CPU 競爭問題,還是由於大量 GC 導致卡死。
應用的崩潰率,怎麼降低崩潰及解決崩潰:
崩潰現場的資訊(①程序名、執行緒名,②崩潰的堆疊和型別java崩潰、native崩潰、ANR)
系統的資訊(Logcat,機型、系統、廠商、CPU、ABI、Linux 版本,裝置的狀態是否root,是否模擬器,是否安裝xposed)
記憶體資訊(①系統剩餘記憶體/proc/meminfo,②應用使用記憶體RSS、PSS--/proc/self/smap,③虛擬記憶體--/proc/self/status)
資源資訊(①檔案控制代碼,可以通過 /proc/self/limits獲得限制,超過800個就比較危險, ②執行緒數,不能超過400個,③JNI,引用失效或爆表)
崩潰分析:①確定嚴重程度 ②查詢共性 ③嘗試復現。此外對於複雜的崩潰問題或系統崩潰,可以查詢可能的原因,嘗試規避或hook解決
4、View的繪製流程,以及View,ViewGroup事件分發
5、app優化
App啟動優化
佈局優化
響應優化
記憶體優化
如何規避oom?
1.使用更加輕量的資料結構
2.避免在Android裡面使用Enum
3.減小Bitmap物件的記憶體佔用
4.使用更小的圖片
5.複用系統自帶的資源
6.注意在ListView/GridView等出現大量重複子元件的視圖裡面對ConvertView的複用
7.Bitmap物件的複用
8.避免在onDraw方法裡面執行物件的建立
9.避免物件的記憶體洩露(重點)
10.考慮使用Application Context而不是Activity Context
11.注意WebView的洩漏(重點)
12.資原始檔需要選擇合適的資料夾進行存放
13.謹慎使用static物件(重點)
14.特別留意單例物件中不合理的持有
15.珍惜Services資源
16.謹慎使用“抽象”程式設計
17.謹慎使用依賴注入框架
18..謹慎使用多程序
19.Handler的使用
20.強軟弱虛引用的應用
22.主執行緒操作UI,子執行緒操作資料
記憶體洩露的監控方案:leakcanry(原理)
記憶體洩漏點:
1.單例造成的記憶體洩漏
2.非靜態內部類建立靜態例項造成的記憶體洩漏
3.Handler造成的記憶體洩漏
4.執行緒造成的記憶體洩漏
5.資源未關閉造成的記憶體洩漏
6.使用ListView時造成的記憶體洩漏
7.集合容器中的記憶體洩露
8.WebView造成的洩露
電池使用優化
網路優化
7、Http https區別 此處延伸:https的實現原理
1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
https實現原理:
(1)客戶使用https的URL訪問Web伺服器,要求與Web伺服器建立SSL連線。
(2)Web伺服器收到客戶端請求後,會將網站的證書資訊(證書中包含公鑰)傳送一份給客戶端。
(3)客戶端的瀏覽器與Web伺服器開始協商SSL連線的安全等級,也就是資訊加密的等級。
(4)客戶端的瀏覽器根據雙方同意的安全等級,建立會話金鑰,然後利用網站的公鑰將會話金鑰加密,並傳送給網站。
(5)Web伺服器利用自己的私鑰解密出會話金鑰。
(6)Web伺服器利用會話金鑰加密與客戶端之間的通訊。
Http位於TCP/IP模型中的第幾層?為什麼說Http是可靠的資料傳輸協議?
tcp/ip的五層模型:
從下到上:物理層->資料鏈路層->網路層->傳輸層->應用層
其中tcp/ip位於模型中的網路層,處於同一層的還有ICMP(網路控制資訊協議)。http位於模型中的應用層
由於tcp/ip是面向連線的可靠協議,而http是在傳輸層基於tcp/ip協議的,所以說http是可靠的資料傳輸協議。
TCP和UDP的區別
tcp是面向連線的,由於tcp連線需要三次握手,所以能夠最低限度的降低風險,保證連線的可靠性。
udp 不是面向連線的,udp建立連線前不需要與物件建立連線,無論是傳送還是接收,都沒有傳送確認訊號。所以說udp是不可靠的。
由於udp不需要進行確認連線,使得UDP的開銷更小,傳輸速率更高,所以實時行更好。
Tcp/IP三次握手,四次揮手
8.Android多執行緒的四種方式
1、Handler+Thread
2. AsyncTask
3. ThreadPoolExecutor
4. IntentService
9、Activity、 Window、 View 三者的差別, fragment 的特點?
Activity是Android應用程式的載體,允許使用者在其上建立一個使用者介面,並提供使用者處理事件的API,如onKeyEvent, onTouchEvent等。 並維護應用程式的生命週期。
當我們呼叫Acitivity的 setContentView方法的時候實際上是呼叫的Window物件的setContentView方法,所以我們可以看出Activity中關於介面的繪製實際上全是交給Window物件來做的。
Activity―>Window―>DecorView
Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示檢視) LayoutInflater像剪刀,Xml配置像窗花圖紙。
在Activity中呼叫attach,建立了一個Window
建立的window是其子類PhoneWindow,在attach中建立PhoneWindow
在Activity中呼叫setContentView(R.layout.xxx)
其中實際上是呼叫的getWindow().setContentView()
呼叫PhoneWindow中的setContentView方法
建立ParentView:作為ViewGroup的子類,實際是建立的DecorView(作為 FramLayout的子類)
將指定的R.layout.xxx進行填充通過佈局填充器進行填充【其中的parent指的>* 就是DecorView】
呼叫到ViewGroup
呼叫ViewGroup的removeAllView(),先將所有的view移除掉
新增新的view:addView()
fragment 特點
Fragment可以作為Activity介面的一部分組成出現;
可以在一個Activity中同時出現多個Fragment,並且一個Fragment也可以在多個Activity中使用;
在Activity執行過程中,可以新增、移除或者替換Fragment;
Fragment可以響應自己的輸入事件,並且有自己的生命週期,它們的生命週期會受宿主Activity的生命週期影響。
10.Handler、 Thread 和 HandlerThread 的差別
Thread是一個執行緒;
我們知道Handler是用來非同步更新UI的,更詳細的說是用來做執行緒間的通訊的,更新UI時是子執行緒與UI主執行緒之間的通訊。那麼現在我們要是想子執行緒與子執行緒之間的通訊要怎麼做呢?當然說到底也是用Handler+Thread來完成(不推薦,需要自己操作Looper)
HandlerThread就是(Handler+Thread結合),HandlerThread其實還是一個執行緒,它跟普通執行緒有什麼不同之處是多了一個Looper,這個是子執行緒獨有的Looper,用來做訊息的取出和處理。
11.sharedPreferences是執行緒安全的嗎?程序安全嗎?
12.IPC (https://blog.csdn.net/weijinqian0/article/details/52233529)
linux:無名pipe, signal, trace, 有名管道,共享記憶體,訊號燈,訊息佇列,Socket
管道和訊息佇列:因為採用儲存轉發方式,所以至少需要拷貝2次資料,效率低;
共享記憶體:雖然在傳輸時沒有拷貝資料,但其控制機制複雜(比如跨程序通訊時,需獲取對方程序的pid,得多種機制協同操作)。
13、介面可以繼承介面嗎?可以實現介面嗎?抽象類可以繼承別的抽象類嗎?列舉可以繼承別的類嗎?java是單繼承的,如何實現多繼承?父類的靜態方法能否被子類重寫,為什麼?
14、哪些情況下的物件會被垃圾回收機制處理掉
Java 垃圾回收機制最基本的做法是分代回收。記憶體中的區域被劃分成不同的世代,物件根據其存活的時間被儲存在對應世代的區域中。一般的實現是劃分成3個世代:年輕、年老和永久。記憶體的分配是發生在年輕世代中的。當一個物件存活時間足夠長的時候,它就會被複制到年老世代中。對於不同的世代可以使用不同的垃圾回收演算法。進行世代劃分的出發點是對應用中物件存活時間進行研究之後得出的統計規律。一般來說,一個應用中的大部分物件的存活時間都很短。比如區域性變數的存活時間就只在方法的執行過程中。基於這一點,對於年輕世代的垃圾回收演算法就可以很有針對性。
(1)超出物件的引用控制代碼的作用域時,這個引用控制代碼引用的物件就變成垃圾。
(2)沒有超出物件的引用控制代碼的作用域時,給這個引用控制代碼賦值為空時,這個引用控制代碼引用的物件就變成垃圾。
(3)建立匿名物件時,匿名物件用完以後即成垃圾。
15、程序和執行緒的區別
程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同。
1. 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.
2. 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。
3. 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
4. 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
5. 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。
16、ArrayList,LinkedList與HashMap區別
17、ArrayMap VS HashMap
資料結構與演算法
1、堆和棧在記憶體中的區別是什麼(資料結構方面以及實際實現方面)
2、最快的排序演算法是哪個?給阿里 2 萬多名員工按年齡排序應該選擇哪個演算法?堆和樹的區別;寫出快排程式碼;連結串列逆序程式碼(阿里)
3、求 1000 以內的水仙花數以及 40 億以內的水仙花數(百度)
4、子串包含問題(KMP 演算法)寫程式碼實現
5、萬億級別的兩個 URL 檔案 A 和 B,如何求出 A 和 B 的差集 C,(Bit 對映->hash 分組->多檔案讀寫效率->磁碟定址以及應用層面對定址的優化)
6、蟻群演算法與蒙特卡洛演算法
其他
1、死鎖的四個必要條件
1)互斥條件,即某個資源在一段時間內只能由一個執行緒佔有,不能同時被兩個或兩個以上的執行緒佔有
2)不可搶佔條件,執行緒所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者執行緒自行釋放
3)佔有且申請條件,執行緒至少已經佔有一個資源,但又申請新的資源;由於該資源已被另外執行緒佔有,此時該執行緒阻塞;但是,它在等待新資源之時,仍繼續佔用已佔有的資源。
4)迴圈等待條件,存在一個執行緒等待序列{P1,P2,…,Pn},其中P1等待P2所佔有的某一資源,P2等待P3所佔有的某一源,……,而Pn等待P1所佔有的的某一資源,形成一個執行緒迴圈等待環
解決死鎖的辦法:加鎖順序,死鎖檢測
2、常見編碼方式; utf-8 編碼中的中文佔幾個位元組;數字幾個位元組
一個utf8數字佔1個位元組,一個utf8英文字母佔1個位元組,少數是漢字每個佔用3個位元組,多數佔用4個位元組。
3、實現一個 Json 解析器(可以通過正則提高速度)
String json = "{name:\"jason\",father:\"jason\",age:18}";
//name:"jason"
//age:18
//\"\\w+\" 字串屬性
Pattern p = Pattern.compile("\\w+:(\"\\w+\"|\\d*)");
Matcher m = p.matcher(json);
while(m.find()){
String text = m.group();
int dotPos= text.indexOf(":");
String key = text.substring(0, dotPos);
String value = text.substring(dotPos+1, text.length());
//替換字串的開始結束的雙引號
value = value.replaceAll("^\\\"|\\\"$", "");
System.out.println(key);
System.out.println(value);
}
Android App 的設計架構: MVC,MVP,MVVM 與架構經驗談(搜狐)
寫出觀察者模式的程式碼
TCP 的 3 次握手和四次揮手; TCP 與 UDP 的區別
http://blog.csdn.net/whuslei/article/details/6667471
1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線
2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向報文的
UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)
4、每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊
5、TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
6、TCP的邏輯通訊通道是全雙工的可靠通道,UDP則是不可靠通道