前言
博主Android開發(fā)三年了!不論是大公司(百度抖锥、美團亿眠、網(wǎng)易),還是小公司的面試都經(jīng)歷過磅废。這篇面試題是我積累了好幾年的心血纳像,之前都是在有道云筆記、印象筆記中拯勉,通過自己一次次的面試竟趾,每次都會把面試官問的問題自己回來記錄好,做好總結(jié)宫峦。直到現(xiàn)在岔帽,我選擇發(fā)出來,是因為我覺得我已經(jīng)積累的差不多了导绷,這些面試題差不多能應(yīng)對一場面試了犀勒。
聊聊面試這件事。面試,我認為不光是考察技術(shù)(當(dāng)然技術(shù)是必不可少的)贾费,有時候天時地利人和到了钦购,你技術(shù)可能一般,也就通過面試了褂萧,面試官看你看對眼了的話押桃,再加上今天面試官可能表白成功,你可能就是走了狗屎運了[偷笑]导犹。當(dāng)然唱凯,我只是舉個例子而已,只是想闡述面試考的不止是技術(shù)谎痢,也是有運氣成分的磕昼。所以,如果你面試很多次都沒有offer的話舶得,不要灰心,不要氣餒爽蝴,總有個坑會要你這根蘿卜的沐批,這就好比是相親,相了好多次蝎亚,都沒有看上你的話九孩,不要灰心,不要氣餒发框,總有個瞎了狗眼的會看上你躺彬。
我把面試的問題分為java基礎(chǔ)、Android知識點梅惯、數(shù)據(jù)結(jié)構(gòu)與算法宪拥、項目相關(guān)的問題四部分。
java基礎(chǔ)這部分很重要铣减,這個看你基本功她君,去大公司面試比較注重基礎(chǔ),所以這部分會問的比較多葫哗,jvm問的挺多缔刹,線程池這塊也是重點,還有劣针,大公司面試還會問你并發(fā)這塊的知識點校镐,比如鎖機制,一些volatile捺典、synchronized關(guān)鍵字用來做什么的鸟廓,內(nèi)部實現(xiàn)原理等問題。
Android知識點,這塊自然不用多說肝箱,肯定是面試的重災(zāi)區(qū)哄褒。去大公司面試都都喜歡問你源碼、內(nèi)部實現(xiàn)煌张,這樣的問題呐赡。所以,handler骏融,asynctask這樣常用的API內(nèi)部原理必須會链嘀,面試官還經(jīng)常問你看過哪些開源框架的源碼,所以你得熟悉幾個開源框架的內(nèi)部實現(xiàn)档玻,比如volley怀泊、retrofit、OkHttp误趴、butterknife枣申、glide楼雹。Android還是要做多項目積累經(jīng)驗。
數(shù)據(jù)結(jié)構(gòu)與算法這部分是我的弱項,多扯兩句,這部分是去大公司面試的必問問題,博主去美團答恶、百度面試都讓算法給刷掉了包竹,所以這塊很重要饵蒂,要想進大公司算法是繞不過去的渊迁,雖然Android一般用不到太多膏萧、太復(fù)雜的算法。我在面試題中,關(guān)于算法這塊我也寫了幾個,比如排序,二分查找,面試小公司饲窿,可能會讓你寫個什么冒泡排序,快排辽故,二分查找喂走,但是進大公司面試,面試官根本不問這些最普通的面試問題睡汹,他們都會自己給你出一個題,讓你寫出最優(yōu)算法寂殉,平時多看看《劍指offer》囚巴、刷LeetCode。算法也是我的弱項友扰,我就不在這里侃了彤叉。數(shù)據(jù)結(jié)構(gòu),也是很重要的村怪!常用的數(shù)據(jù)結(jié)構(gòu)(ArrayList秽浇、LinkedList、HashMap)內(nèi)部實現(xiàn)都得知道实愚,能跟面試官侃侃而談兼呵,還有延伸的一些數(shù)據(jù)結(jié)構(gòu)你也得有所了解兔辅,比如問到HashMap都知道他不是線程安全的,那線程安全的ConcurrentHashMap击喂,你知道內(nèi)部的機制维苔,他是怎么來保證線程安全的前提下,最大的提高讀寫效率的呢懂昂?還有Android特有的數(shù)據(jù)結(jié)構(gòu)SparseArray等一些原理介时。了解數(shù)據(jù)結(jié)構(gòu)內(nèi)部實現(xiàn)其實挺好的,對編碼有幫助凌彬。
項目相關(guān)的問題沸柔,這部分基本都是在二面、三面上吧(終于過了一年了)铲敛,這塊你就跟面試官聊聊你做的項目褐澎,用到了什么技術(shù),怎么來解決問題啥的伐蒋,這個針對自己項目來說就行工三,就不多說了。
面試要點寫完了先鱼,來一句感受:面試搬大象俭正,干活擰螺絲!
今天臨時想到的基本都是這些焙畔,最后奉獻上我積累幾年的面試題[無私]掸读,祝愿各位都能拿到不錯的offer。
Java
1. jvm垃圾回收機制
2. hashCode()和equals()
Java hashCode() 和 equals()的若干問題解答
3. java內(nèi)存管理
java內(nèi)存優(yōu)化
- 釋放連接
- 優(yōu)化邏輯,釋放不必要的對象 盡量使用局部變量
- 減少循環(huán)邏輯里的對象的創(chuàng)建
- 基本類型代替對象類型
- 使用stringBuffer和stringBuilder替代多次String對象
- 單線程盡量使用hashmap和ArrayList
- 提前分配stringBuffer宏多,數(shù)組儿惫,array,vector等容量
- 合適的場所使用單例
- 盡量不要隨意使用靜態(tài)變量
- 處理內(nèi)存泄露
4.線程池
5. 進程和線程的關(guān)系
6. Thread和Runnable的區(qū)別
java線程(上)Thread和Runnable的區(qū)別
7. 死鎖
java 死鎖及解決
【Java并發(fā)編程】之九:死鎖(含代碼)
8. 單例
9. 強引用 軟引用 弱引用 虛引用
Java 7之基礎(chǔ) - 強引用姥闪、弱引用始苇、軟引用砌烁、虛引用
10. http
Android之Http通信——1.初識Http協(xié)議
Android Http請求頭與響應(yīng)頭的學(xué)習(xí)
11. 接口和抽象類的區(qū)別
- 接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法催式。
- 類可以實現(xiàn)很多個接口函喉,但是只能繼承一個抽象類
- 類如果要實現(xiàn)一個接口,它必須要實現(xiàn)接口聲明的所有方法荣月。但是管呵,類可以不實現(xiàn)抽象類聲明的所有方法,當(dāng)然哺窄,在這種情況下捐下,類也必須得聲明成是抽象的账锹。
- 抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口。
- Java接口中聲明的變量默認都是final的坷襟。抽象類可以包含非final的變量奸柬。
- Java接口中的成員函數(shù)默認是public的。抽象類的成員函數(shù)可以是private婴程,protected或者是public廓奕。
- 接口是絕對抽象的,不可以被實例化档叔。抽象類也不可以被實例化桌粉,但是,如果它包含main方法的話是可以被調(diào)用的衙四。
12.字符串
Java中的字符串常量池
Java細節(jié):字符串的拼接
13. java并發(fā)
- volatile的原理
Java并發(fā)編程:volatile關(guān)鍵字解析 - synchronized的原理
Java并發(fā)編程:Synchronized及其實現(xiàn)原理 - java.util.concurrent包詳解
Java - concurrent包詳解 - lock的實現(xiàn)原理
Android
Android基礎(chǔ)知識
1. Android生命周期
2. Android啟動模式
3. Service
Android Service完全解析铃肯,關(guān)于服務(wù)你所需知道的一切
Service兩種啟動方式的區(qū)別
如何讓一個Service一直保持存活?
IntentService的特點
- 它創(chuàng)建了一個獨立的工作線程來處理所有的通過onStartCommand()傳遞給服務(wù)的intents。
- 創(chuàng)建了一個工作隊列传蹈,來逐個發(fā)送intent給onHandleIntent()缘薛。
- 不需要主動調(diào)用stopSelft()來結(jié)束服務(wù)。因為卡睦,在所有的intent被處理完后宴胧,系統(tǒng)會自動關(guān)閉服務(wù)。
- 默認實現(xiàn)的onBind()返回null
- 默認實現(xiàn)的onStartCommand()的目的是將intent插入到工作隊列中
4. 自定義view
Android LayoutInflater原理分析表锻,帶你一步步深入了解View
Android View 四個構(gòu)造函數(shù)詳解
5.DiskLruCache LruCache
Android DiskLruCache完全解析恕齐,硬盤緩存的最佳方案
6.Touch事件傳遞機制
- Touch事件分發(fā)中只有兩個主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent瞬逊、dispatchTouchEvent显歧、onTouchEvent三個相關(guān)事件。View包含dispatchTouchEvent确镊、onTouchEvent兩個相關(guān)事件士骤。其中ViewGroup又繼承于View。
- ViewGroup和View組成了一個樹狀結(jié)構(gòu)蕾域,根節(jié)點為Activity內(nèi)部包含的一個ViwGroup拷肌。
- 觸摸事件由Action_Down、Action_Move旨巷、Aciton_UP組成巨缘,其中一次完整的觸摸事件中,Down和Up都只有一個采呐,Move有若干個若锁,可以為0個。
- 當(dāng)Acitivty接收到Touch事件時斧吐,將遍歷子View進行Down事件的分發(fā)又固。ViewGroup的遍歷可以看成是遞歸的仲器。分發(fā)的目的是為了找到真正要處理本次完整觸摸事件的View,這個View會在onTouchEvent結(jié)果返回true仰冠。
- 當(dāng)某個子View返回true時娄周,會中止Down事件的分發(fā),同時在ViewGroup中記錄該子View沪停。接下去的Move和Up事件將由該子View直接進行處理煤辨。由于子View是保存在ViewGroup中的,多層ViewGroup的節(jié)點結(jié)構(gòu)時木张,上級ViewGroup保存的會是真實處理事件的View所在的ViewGroup對象:如ViewGroup0-ViewGroup1-TextView的結(jié)構(gòu)中众辨,TextView返回了true,它將被保存在ViewGroup1中舷礼,而ViewGroup1也會返回true鹃彻,被保存在ViewGroup0中。當(dāng)Move和UP事件來時妻献,會先從ViewGroup0傳遞至ViewGroup1蛛株,再由ViewGroup1傳遞至TextView。
- 當(dāng)ViewGroup中所有子View都不捕獲Down事件時育拨,將觸發(fā)ViewGroup自身的onTouch事件谨履。觸發(fā)的方式是調(diào)用super.dispatchTouchEvent函數(shù),即父類View的dispatchTouchEvent方法熬丧。在所有子View都不處理的情況下笋粟,觸發(fā)Acitivity的onTouchEvent方法。
- onInterceptTouchEvent有兩個作用:1.攔截Down事件的分發(fā)析蝴。2.中止Up和Move事件向目標View傳遞害捕,使得目標View所在的ViewGroup捕獲Up和Move事件。
dispatchTouchEvent源碼分析總結(jié)
- 觸摸控件(View)首先執(zhí)行dispatchTouchEvent方法闷畸。
在dispatchTouchEvent方法中先執(zhí)行onTouch方法尝盼,后執(zhí)行onClick方法(onClick方法在onTouchEvent中執(zhí)行,下面會分析)佑菩。 - 如果控件(View)的onTouch返回false或者mOnTouchListener為null(控件沒有設(shè)置setOnTouchListener方法)或者控件不是enable的情況下會調(diào)運onTouchEvent盾沫,dispatchTouchEvent返回值與onTouchEvent返回一樣。
- 如果控件不是enable的設(shè)置了onTouch方法也不會執(zhí)行倘待,只能通過重寫控件的onTouchEvent方法處理(上面已經(jīng)處理分析了)疮跑,dispatchTouchEvent返回值與onTouchEvent返回一樣组贺。
- 如果控件(View)是enable且onTouch返回true情況下凸舵,dispatchTouchEvent直接返回true,不會調(diào)用onTouchEvent方法失尖。
7.動畫
8.View的繪制流程
從ViewRoot的performTraversals()方法開始依次調(diào)用perfromMeasure渐苏、performLayout和performDraw這三個方法。這三個方法分別完成頂級View的measure菇夸、layout和draw三大流程琼富,其中perfromMeasure會調(diào)用measure,measure又會調(diào)用onMeasure庄新,在onMeasure方法中則會對所有子元素進行measure鞠眉,這個時候measure流程就從父容器傳遞到子元素中了,這樣就完成了一次measure過程择诈,接著子元素會重復(fù)父容器的measure械蹋,如此反復(fù)就完成了整個View樹的遍歷.
同理,performLayout和performDraw也分別完成perfromMeasure類似的流程羞芍。通過這三大流程哗戈,分別遍歷整棵View樹,就實現(xiàn)了Measure荷科,Layout唯咬,Draw這一過程,View就繪制出來了畏浆。
9.Android性能優(yōu)化
- 布局優(yōu)化:盡量減少布局文件的層級胆胰,刪除布局中無用的控件和層級。<merge> <incude> <ViewStub>提供按需加載的功能
- 繪制優(yōu)化:onDraw()方法中不要創(chuàng)建新的局部對象刻获,不要做耗時的任務(wù) GPU過度繪制 HierarchyView來檢測 開發(fā)者選項 顯示開發(fā)者過度繪制選項
- 內(nèi)存泄露優(yōu)化:context煮剧、handler、bitmap将鸵、單例模式勉盅、內(nèi)部類、靜態(tài)變量顶掉、資源對象沒有關(guān)閉
- 響應(yīng)速度優(yōu)化和ANR日志分析:避免在主線程中做耗時操作草娜,系統(tǒng)會在/data/anr目錄下創(chuàng)建一個文件traces.txt
- 避免創(chuàng)建過多的對象
- 不要過多使用枚舉芝薇,枚舉占用的內(nèi)存空間要比整型大
- 常量請使用static final 來修飾
- 使用一些Android特有的數(shù)據(jù)結(jié)構(gòu)田度,比如SparseArray和Pair等兑凿,他們都具有更好的性能
- 適當(dāng)使用軟引用和弱引用
- 采用內(nèi)存緩存和磁盤緩存
- 盡量采用靜態(tài)內(nèi)部類雄妥,這樣可以避免潛在的由于內(nèi)部類而導(dǎo)致的內(nèi)存泄露
- Android的性能優(yōu)化
- Android應(yīng)用開發(fā)性能優(yōu)化完全分析
10.MVP模式
11.橫豎屏切換,Android生命周期的變化
- 不設(shè)置Activity的android:configChanges時围俘,切屏?xí)匦抡{(diào)用各個生命周期铅碍,切橫屏?xí)r會執(zhí)行一次傻谁,切豎屏?xí)r會執(zhí)行兩次
- 設(shè)置Activity的android:configChanges="orientation"時书劝,切屏還是會重新調(diào)用各個生命周期老充,切橫葡盗、豎屏?xí)r只會執(zhí)行一次
- 設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期啡浊,只會執(zhí)行onConfigurationChanged方法
11.WebView
WebView性能觅够、體驗分析與優(yōu)化
Android中Java和JavaScript交互
12. Android中出現(xiàn)65536的限制的原因以及解決辦法
13. Android Lint的工作機制原理
14. Android中的Dalvik VM ART JVM 的區(qū)別
Android 中的Dalvik和ART是什么胶背,有啥區(qū)別?
Dalvik 虛擬機和 Sun JVM 在架構(gòu)和執(zhí)行方面有什么本質(zhì)區(qū)別喘先?
15.Android內(nèi)存泄露問題
避免Android中Context引起的內(nèi)存泄露
譯文:Android中糟糕的AsyncTask
Android中Handler引起的內(nèi)存泄露
Android內(nèi)存泄漏總結(jié)
16. RecyclerView和ListView的區(qū)別
- RecyclerView的ViewHolder規(guī)范化
- RecyclerView可以實現(xiàn)線性布局效果,網(wǎng)格布局效果,瀑布流布局效果
- ListView具有setEmptyView() addHeaderView() addFooterView()
Android 優(yōu)雅的為RecyclerView添加HeaderView和FooterView - RecyclerView支持局部刷新
- listview實現(xiàn)局部刷新 https://juejin.im/entry/581bdee6570c35006094a30e
- RecyclerView輕松實現(xiàn)item動畫效果
- RecyclerView沒有setOnItemClickListener() setOnItemLongClickListener() 而是實現(xiàn)了RecyclerView.OnItemTouchListener()
android開發(fā)游記:RecyclerView無法添加onItemClickListener最佳的高效解決方案 - RecyclerView自定義分割線
17.compileSdkVersion, minSdkVersion 和 targetSdkVersion區(qū)別
如何選擇 compileSdkVersion, minSdkVersion 和 targetSdkVersion
18. RelativeLayout和LinearLayout性能分析
Android中RelativeLayout和LinearLayout性能分析
- RelativeLayout會讓子View調(diào)用2次onMeasure钳吟,LinearLayout 在有weight時,也會調(diào)用子View2次onMeasure
- RelativeLayout的子View如果高度和RelativeLayout不同窘拯,則會引發(fā)效率問題红且,當(dāng)子View很復(fù)雜時,這個問題會更加嚴重涤姊。如果可以直焙,盡量使用padding代替margin。
- 在不影響層級深度的情況下,使用LinearLayout和FrameLayout而不是RelativeLayout砂轻。
- 為什么Google給開發(fā)者默認新建了個RelativeLayout奔誓,而自己卻在DecorView中用了個LinearLayout。因為DecorView的層級深度是已知而且固定的搔涝,上面一個標題欄厨喂,下面一個內(nèi)容欄。采用RelativeLayout并不會降低層級深度庄呈,所以此時在根節(jié)點上用LinearLayout是效率最高的蜕煌。而之所以給開發(fā)者默認新建了個RelativeLayout是希望開發(fā)者能采用盡量少的View層級來表達布局以實現(xiàn)性能最優(yōu),因為復(fù)雜的View嵌套對性能的影響會更大一些诬留。
19. 圖片處理
Android高效加載大圖斜纪、多圖解決方案,有效避免程序OOM
20. 屏幕適配問題
21. 多進程的知識
Android API源碼和第三方框架源碼
1. AsyncTask
- 設(shè)置當(dāng)前AsyncTask的狀態(tài)為RUNNING文兑,上面的switch也可以看出盒刚,每個異步任務(wù)在完成前只能執(zhí)行一次。
- 執(zhí)行了onPreExecute()绿贞,當(dāng)前依然在UI線程因块,所以我們可以在其中做一些準備工作。
- 將我們傳入的參數(shù)賦值給了mWorker.mParams ,mWorker為一個Callable的子類籍铁,且在內(nèi)部的call()方法中涡上,調(diào)用了doInBackground(mParams),然后得到的返回值作為postResult的參數(shù)進行執(zhí)行拒名;postResult中通過sHandler發(fā)送消息吩愧,最終sHandler的handleMessage中完成onPostExecute的調(diào)用。
- exec.execute(mFuture)增显,mFuture為真正的執(zhí)行任務(wù)的單元雁佳,將mWorker進行封裝,然后由sDefaultExecutor交給線程池進行執(zhí)行。
如果現(xiàn)在大家去面試甘穿,被問到AsyncTask的缺陷腮恩,可以分為兩個部分說梢杭,在3.0以前温兼,最大支持128個線程的并發(fā),10個任務(wù)的等待武契。在3.0以后募判,無論有多少任務(wù),都會在其內(nèi)部單線程執(zhí)行咒唆;
2. Handler
Android 異步消息處理機制 讓你深入理解 Looper届垫、Handler、Message三者關(guān)系
- 首先Looper.prepare()在本線程中保存一個Looper實例全释,然后該實例中保存一個MessageQueue對象装处;因為Looper.prepare()在一個線程中只能調(diào)用一次,所以MessageQueue在一個線程中只會存在一個浸船。
- Looper.loop()會讓當(dāng)前線程進入一個無限循環(huán)妄迁,不端從MessageQueue的實例中讀取消息,然后回msg.target.dispatchMessage(msg)方法李命。
- Handler的構(gòu)造方法登淘,會首先得到當(dāng)前線程中保存的Looper實例,進而與Looper實例中的MessageQueue想關(guān)聯(lián)封字。
- Handler的sendMessage方法黔州,會給msg的target賦值為handler自身,然后加入MessageQueue中阔籽。
- 在構(gòu)造Handler實例時流妻,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調(diào)用的方法笆制。
好了合冀,總結(jié)完成,大家可能還會問项贺,那么在Activity中君躺,我們并沒有顯示的調(diào)用Looper.prepare()和Looper.loop()方法,為啥Handler可以成功創(chuàng)建呢开缎,這是因為在Activity的啟動代碼中棕叫,已經(jīng)在當(dāng)前UI線程調(diào)用了Looper.prepare()和Looper.loop()方法。
3.Retrofit
Android:手把手帶你深入剖析 Retrofit 2.0 源碼
4. Glide
Android圖片加載框架最全解析奕删,Glide的基本用法
5.OkHttp
6.HandlerThread
7. IntentService
Android IntentService完全解析 當(dāng)Service遇到Handler
8. leakcanary
9. Volley
- 當(dāng)一個RequestQueue被成功申請后會開啟一個CacheDispatcher和4個默認的NetworkDispatcher俺泣。
- CacheDispatcher緩存調(diào)度器最為第一層緩沖,開始工作后阻塞的從緩存序列mCacheQueue中取得請求;對于已經(jīng)取消的請求伏钠,標記為跳過并結(jié)束這個請求横漏;新的或者過期的請求,直接放入mNetworkQueue中由N個NetworkDispatcher進行處理熟掂;已獲得緩存信息(網(wǎng)絡(luò)應(yīng)答)卻沒有過期的請求缎浇,由Request的parseNetworkResponse進行解析,從而確定此應(yīng)答是否成功赴肚。然后將請求和應(yīng)答交由Delivery分發(fā)者進行處理素跺,如果需要更新緩存那么該請求還會被放入mNetworkQueue中。
- 將請求Request add到RequestQueue后對于不需要緩存的請求(需要額外設(shè)置誉券,默認是需要緩存)直接丟入mNetworkQueue交給N個NetworkDispatcher處理指厌;對于需要緩存的,新的請求加到mCacheQueue中給CacheDispatcher處理踊跟;需要緩存踩验,但是緩存列表中已經(jīng)存在了相同URL的請求,放在mWaitingQueue中做暫時處理商玫,等待之前請求完畢后箕憾,再重新添加到mCacheQueue中。
- 網(wǎng)絡(luò)請求調(diào)度器NetworkDispatcher作為網(wǎng)絡(luò)請求真實發(fā)生的地方决帖,對消息交給BasicNetwork進行處理厕九,同樣的,請求和結(jié)果都交由Delivery分發(fā)者進行處理地回。
- Delivery分發(fā)者實際上已經(jīng)是對網(wǎng)絡(luò)請求處理的最后一層了扁远,在Delivery對請求處理之前,Request已經(jīng)對網(wǎng)絡(luò)應(yīng)答進行過解析刻像,此時應(yīng)答成功與否已經(jīng)設(shè)定畅买;而后Delivery根據(jù)請求所獲得的應(yīng)答情況做不同處理;若應(yīng)答成功细睡,則觸發(fā)deliverResponse方法谷羞,最終會觸發(fā)開發(fā)者為Request設(shè)定的Listener;若應(yīng)答失敗溜徙,則觸發(fā)deliverError方法湃缎,最終會觸發(fā)開發(fā)者為Request設(shè)定的ErrorListener;處理完后蠢壹,一個Request的生命周期就結(jié)束了嗓违,Delivery會調(diào)用Request的finish操作,將其從mRequestQueue中移除图贸,與此同時蹂季,如果等待列表中存在相同URL的請求冕广,則會將剩余的層級請求全部丟入mCacheQueue交由CacheDispatcher進行處理。
數(shù)據(jù)結(jié)構(gòu)與算法
1. 算法實現(xiàn)統(tǒng)計出Activity中的view樹的深度
2. HashMap
3. LinkedList
4. ArrayList
5.ConcurrentHashMap
Java并發(fā)編程:并發(fā)容器之ConcurrentHashMap(轉(zhuǎn)載)
6.List Map Set的區(qū)別
淺談Java中的Set偿洁、List撒汉、Map的區(qū)別
7. 快速排序
8. 二分查找
9.數(shù)組去重
其他問題
1. 工作中遇到一次最大困難時什么 你最后是怎么解決的 如果讓你再來一次你是否能夠解決的更好
2. 職業(yè)規(guī)劃
3. HTTP和HTTPS的區(qū)別
- HTTP協(xié)議使用默認80端口涕滋,HTTPS協(xié)議使用443端口
- HTTPS協(xié)議需要到CA申請證書睬辐,一般免費的證書較少,需要交費
- HTTP信息是明文傳輸何吝,HTTPS使用具有安全性的SSL加密傳輸信息
4. http1和http2的區(qū)別
- http2可以同時發(fā)多個請求
- http2會壓縮,體積小
- http2服務(wù)器會推送
3. 加密算法有哪些溉委?對稱加密和非對稱加密的區(qū)別鹃唯?
MD5爱榕,SHA1,Base64坡慌,RSA黔酥,AES,DES
非對稱密鑰加密的使用過程:
- A要向B發(fā)送信息洪橘,A和B都要產(chǎn)生一對用于加密和解密的公鑰和私鑰跪者。
- A的私鑰保密,A的公鑰告訴B熄求;B的私鑰保密渣玲,B的公鑰告訴A。
- A要給B發(fā)送信息時弟晚,A用B的公鑰加密信息忘衍,因為A知道B的公鑰。
- A將這個消息發(fā)給B(已經(jīng)用B的公鑰加密消息)卿城。
- B收到這個消息后枚钓,B用自己的私鑰解密A的消息,其他所有收到這個報文的人都無法解密瑟押,因為只有B才有B的私鑰搀捷。
- 反過來,B向A發(fā)送消息也是一樣多望。
對稱加密和非對稱加密的區(qū)別
- 對稱加密加密與解密使用的是同樣的密鑰嫩舟,所以速度快,但由于需要將密鑰在網(wǎng)絡(luò)傳輸怀偷,所以安全性不高家厌。
- 非對稱加密使用了一對密鑰,公鑰與私鑰枢纠,所以安全性高像街,但加密與解密速度慢黎棠。
- 解決的辦法是將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然后發(fā)送出去镰绎,接收方使用私鑰進行解密得到對稱加密的密鑰脓斩,然后雙方可以使用對稱加密來進行溝通。
面經(jīng)
一年Android工作經(jīng)驗畴栖,一舉拿下百度随静、網(wǎng)易、美團吗讶、小米燎猛、快手等Offer面經(jīng)