6年Android程序員的面試心得(可收藏)

image.png

一般Android面試分為兩部分:Java部分和Android部分,下面說一下自己面試過程遇到的一些具體題目和一些相關(guān)知識點(diǎn)。文末有福利送給大家

一 JAVA相關(guān)

1)JAVA基礎(chǔ)

1.java基本數(shù)據(jù)類型有哪些,int, long占幾個字節(jié)
2.== 和 equals有什么區(qū)別
3.hashcode 和 equals作用
4.new String創(chuàng)建了幾個對象
5.位運(yùn)算符的一些計(jì)算
6.java的拆裝箱
7.compareable 和 compartor的區(qū)別
下面列一兩個遇到的題吧


image.png

它的打印結(jié)果是什么。
類似這種的題很多,考察的都是基礎(chǔ)知識的牢固性。所以需要自己多鞏固基礎(chǔ)。

2)數(shù)據(jù)結(jié)構(gòu)和算法

常見的數(shù)據(jù)結(jié)構(gòu)就是:數(shù)組,棧,隊(duì)列,集合,映射,鏈表,堆,二分搜索樹,紅黑樹。當(dāng)然還有其他的一些,比如AVL平衡樹等一些數(shù)據(jù)結(jié)構(gòu)。

我們要做的就是了解它們的實(shí)現(xiàn)原理和各自的優(yōu)缺點(diǎn)。

數(shù)據(jù)結(jié)構(gòu)部分面試遇到最多的就是:

1.ArrayList和LinkedList的區(qū)別,優(yōu)缺點(diǎn)
2.hashmap實(shí)現(xiàn),擴(kuò)容是怎么做的,怎么處理hash沖突,hashcode算法等
3.鏈表需要知道。LinkedHashMap一般再問LRU的時候會問到
4.二分搜索樹的特性和原理。前中后序遍歷寫出其中一種,當(dāng)問到二分搜索樹的缺點(diǎn)的時候,你需要提出基于二分搜索樹的紅黑樹,說出他的特性。
5.堆的實(shí)現(xiàn),最大堆,最小堆,優(yōu)先隊(duì)列原理。

算法

算法其實(shí)就是我們平時常見的一些排序:選擇排序,插入排序,冒泡排序,希爾排序,歸并排序,快速排序。以及和數(shù)據(jù)結(jié)構(gòu)相關(guān)聯(lián)的解決部分問題的一些計(jì)算方法。

算法面試遇到的一些題:

1.手寫快速排序,插入排序,冒泡排序
2.翻轉(zhuǎn)一個數(shù)字
3.翻轉(zhuǎn)一個鏈表
4.O(n)復(fù)雜度找出數(shù)組中和是9的兩個數(shù)的索引
5.寫出二分搜索樹前中后序遍歷中的其中一個
6.實(shí)現(xiàn)一個隊(duì)列,并能記錄隊(duì)列中最大的數(shù)。
算法這一塊是需要練習(xí)的推薦去Leetcode上面刷刷題,開拓一下思維。算法也并不一定要求你能寫出來,主要考察你的思路,已經(jīng)如何優(yōu)化你的算法。

3)JVM虛擬機(jī)

JVM虛擬機(jī)我們需要知道他們內(nèi)部組成:堆,虛擬機(jī)棧,本地方法棧,方法區(qū),計(jì)數(shù)器。每一塊都存放什么東西,以及垃圾回收的時候主要回收哪些塊的東西。GC-ROOT鏈?zhǔn)菑哪男┑胤介_始的,垃圾回收集算法(很少遇到問的)。

類加載ClassLoader已經(jīng)雙親委派機(jī)制,類加載的過程,類加載的信息對應(yīng)在JVM的哪些塊中。

列一個遇到的類加載的面試題:

image.png

image.png

寫出打印輸出。

加一個小插曲:上面的題是餓了嗎面試問到的。面試我的人自己說是17年北航畢業(yè)的研究生。說自己非常注重基礎(chǔ),全程問了很多JAVA基礎(chǔ),包括上面的類加載的題,很自豪的說這個題是他自己出的。還有Collections下面的子類都有哪些,都有什么不同。但是Android相關(guān)的題目問的水平很一般,說這個沒有嘲諷的意思。想說的是有些面試從一開始就注定了你可能進(jìn)不了這個公司。面試有的時候也是要看眼緣的。不要灰心,找出自己的不足,補(bǔ)齊它,繼續(xù)前行。還有就是上面那個題,的確很不錯。

4)線程安全

當(dāng)多個線程訪問一個對象的時候,如果不用考慮這些線程在運(yùn)行時環(huán)境下的調(diào)度和交替執(zhí)行,也不需要進(jìn)行額外的同步,或者在調(diào)用方進(jìn)行任何其他的協(xié)調(diào)操作,調(diào)用這個對象的行為都可以獲取正確的結(jié)果,我們就認(rèn)為這個對象時線程安全的。

線程安全就是一些多線程下載,同步,鎖,死鎖,線程池。volatile關(guān)鍵字的特性,變量的原子性。以及java.util.concurrent包下的類,也需要了解一下。

一般會問的是手寫單例,以及雙重鎖式單例的優(yōu)點(diǎn)。還有就是讓你自己實(shí)現(xiàn)一個多線程下載,看你怎么設(shè)計(jì)。

5)編程思想

封裝,繼承,多態(tài),抽象,反射,注解,設(shè)計(jì)模式,設(shè)計(jì)模式的原則。

面試中一般會問下:

1.抽象和接口有什么不一樣
2.工作中常用的設(shè)計(jì)模式,一些源碼中的設(shè)計(jì)模式
3.具體給你一個設(shè)計(jì)模式讓你說說你對他的了解,比如觀察者,工廠。
以上這些東西主要考察你的代碼設(shè)計(jì)能力。

6)網(wǎng)絡(luò)協(xié)議

1.互聯(lián)網(wǎng)的實(shí)現(xiàn)主要分為幾層,http、ftp、tcp、ip分別位于哪一層。
2.http和https的區(qū)別
3.為什么tcp要經(jīng)過三次握手,四次揮手
4.socket了解過嗎
一般http和https問的比較多,對稱加密和非對稱加密也會問。tcp和socket偶爾遇見問的。

二 JAVA部分總結(jié)

我覺得JAVA部分大致上可以分為這幾大塊,細(xì)想一套代碼,其實(shí)就是類和組合這些類,怎么組合其實(shí)就是設(shè)計(jì)模式。而類里面包含的其實(shí)就是基本數(shù)據(jù)類型和一些數(shù)據(jù)機(jī)構(gòu)來存放這些基本數(shù)據(jù)類型或者類,然后就是JVM去怎么加載這些類。針對上面幾個部分我推薦幾本書吧:
《JAVA編程思想》
《深入理解JAVA虛擬機(jī) 第二版》
《大話設(shè)計(jì)模式》
《HeadFirst設(shè)計(jì)模式》
《數(shù)據(jù)結(jié)構(gòu)和算法》
《圖解HTTP》

數(shù)據(jù)結(jié)構(gòu)和算法重點(diǎn)推薦:https://github.com/wangxp423/ExerciseJava 以及readme中提到的劉宇波(liuyubobobo)他開源的代碼和文檔。他在慕課網(wǎng)錄制了四套視頻來講解數(shù)據(jù)結(jié)構(gòu)和算法。文檔通俗易懂。很適合初學(xué)者,和想系統(tǒng)了解的人。

在這由于文字很多,我總結(jié)了Android面試所涉及到的常問范圍及常問面試題免費(fèi)分享給大家,文末有領(lǐng)??!

三 Android相關(guān)

Android部分我就不分幾大塊了。直接列舉,但是列舉到的每一項(xiàng)都是面試經(jīng)常會問到并且會延伸問的,所以需要深入的去研究。

1.四大組件有哪些,說出你對他們在Android系統(tǒng)中的作用和理解。
2.Activity生命周期,A啟動B兩個頁面生命周期怎么運(yùn)行的,為什么會 這樣,生命周期為什么這么設(shè)計(jì),你有了解過嗎。
3.四種啟動模式,內(nèi)部堆棧是怎么回事,你工作中怎么使用的。
4.Activity的啟動過程,這個我強(qiáng)烈建議每個Android開發(fā)人員都要清楚的知道,并且跟一下源碼,幾個核心類的作用。你會對Android有一個更好的認(rèn)識。
5.事件分發(fā)流程,怎么處理滑動沖突。舉例:長按ListView的一個Item它變灰了。這個時候在滑動。item恢復(fù)原來的樣子,這個時候他們內(nèi)部的事件傳遞是什么樣子。有很多種問法,所以你一定要搞清楚。
6.自定義View,View的繪制流程。onMeasure,onLayout,onDraw都是什么作用。ViewGroup是怎么分發(fā)繪制的。onDraw里面怎么去做繪制,Canvas,Path,Paint你都需要了解。并且配合ValueAnimtor或者Scroller去實(shí)現(xiàn)動畫。有時候面試的會突發(fā)奇想問你ViewGroup是樹形結(jié)構(gòu),我想知道樹的深度,你怎么計(jì)算,突然就變成了一個數(shù)據(jù)結(jié)構(gòu)和算法的題。
7.Bitmap和Drawable
8.Animation和Animator
9.LinearLayout、RelativeLayout、FrameLayout三種常用布局的特性,他在布局的時候是怎么計(jì)算的。效率如何。CoordinatorLayout配合AppbarLayout的使用,以及自定義Behavior。ConstraintLayout的使用。用來減少層級。
10.Handler消息機(jī)制,推薦看一下Looper的源碼
11.進(jìn)程間通信,Binder機(jī)制
12.AsyncTask源碼看一下。
13.圖片的壓縮處理,三級緩存,Lru算法
14.分辨率和屏幕密度,以及計(jì)算一個圖片大小。mdpi,hdpi的關(guān)系和比例。
15.優(yōu)化,內(nèi)存優(yōu)化,布局優(yōu)化,啟動優(yōu)化,性能優(yōu)化。內(nèi)存泄露,內(nèi)存溢出。怎么優(yōu)化,用了什么工具,具體怎么做的。
16.listView和RecycleView對比,以及緩存策略。
17.JNI(很少問)
18.MVC,MVP,MVVM
19.開源框架Okhttp,Glide,EventBus,Rxjava等,以及JetPack下的開源庫,要會用,還說說出一些東西,推薦 Retrofit,Okhttp,Glide,EventBus這些看一下源碼。
20.RecyclerView四大塊,能實(shí)現(xiàn)什么效果,大致怎么實(shí)現(xiàn)的,心里要有數(shù)
21.DecorView,Window,WindowManager,PhoneWindow關(guān)系,以及個子的職責(zé)。
加分項(xiàng):Kotlin,Gradle,F(xiàn)lutter,組件化,插件化,熱修復(fù)。

四 Android相關(guān)總結(jié)

上面的列的相關(guān)內(nèi)容,看似很短一句話,但是每一項(xiàng)都需要你深入的去研究,要了解原理,最好去看一下源碼實(shí)現(xiàn)。當(dāng)然還有一些是我沒寫到的,可能是我寫的時候沒有想起來,并不代表他們不重要,你也需要重視,再來一波推薦:
《Android開發(fā)藝術(shù)探索》強(qiáng)烈推薦,建議細(xì)細(xì)的讀,如果粗心大意建議讀兩到三遍,針對性的讀。
《Android進(jìn)階之光》
《高級Android開發(fā)強(qiáng)化實(shí)戰(zhàn)》
《Android組件化架構(gòu)》
《Android熱修復(fù)技術(shù)原理》
《Android插件化開發(fā)指南》

網(wǎng)絡(luò)框架有哪些?他們之間的區(qū)別是什么?(這個也會問到)

Xutils

這個框架非常全面,可以進(jìn)行網(wǎng)絡(luò)請求,可以進(jìn)行圖片加載處理,可以數(shù)據(jù)儲存,還可以對view進(jìn)行注解,使用這個框架非常方便,但是缺點(diǎn)也是非常明顯的,使用這個項(xiàng)目,會導(dǎo)致項(xiàng)目對這個框架依賴非常的嚴(yán)重,一旦這個框架出現(xiàn)問題,那么對項(xiàng)目來說影響非常大的

OKhttp

Android開發(fā)中是可以直接使用現(xiàn)成的api進(jìn)行網(wǎng)絡(luò)請求的。就是使用HttpClient,HttpUrlConnection進(jìn)行操作。okhttp針對Java和Android程序,封裝的一個高性能的http請求庫,支持同步,異步,而且okhttp又封裝了線程池,封裝了數(shù)據(jù)轉(zhuǎn)換,封裝了參數(shù)的使用,錯誤處理等。API使用起來更加的方便。但是我們在項(xiàng)目中使用的時候仍然需要自己在做一層封裝,這樣才能使用的更加的順手。

Volley

Volley是Google官方出的一套小而巧的異步請求庫,該框架封裝的擴(kuò)展性很強(qiáng),支持HttpClient、HttpUrlConnection, 甚至支持OkHttp,而且Volley里面也封裝了ImageLoader,所以如果你愿意你甚至不需要使用圖片加載框架,不過這塊功能沒有一些專門的圖片加載框架強(qiáng)大,對于簡單的需求可以使用,稍復(fù)雜點(diǎn)的需求還是需要用到專門的圖片加載框架。Volley也有缺陷,比如不支持post大數(shù)據(jù),所以不適合上傳文件。不過Volley設(shè)計(jì)的初衷本身也就是為頻繁的、數(shù)據(jù)量小的網(wǎng)絡(luò)請求而生。

Retrofit

Retrofit是Square公司出品的默認(rèn)基于OkHttp封裝的一套RESTful網(wǎng)絡(luò)請求框架,RESTful是目前流行的一套api設(shè)計(jì)的風(fēng)格, 并不是標(biāo)準(zhǔn)。Retrofit的封裝可以說是很強(qiáng)大,里面涉及到一堆的設(shè)計(jì)模式,可以通過注解直接配置請求,可以使用不同的http客戶端,雖然默認(rèn)是用http ,可以使用不同Json Converter 來序列化數(shù)據(jù),同時提供對RxJava的支持,使用Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架,但是需要有比較高的門檻。

Volley VS OkHttp

Volley的優(yōu)勢在于封裝的更好,而使用OkHttp你需要有足夠的能力再進(jìn)行一次封裝。而OkHttp的優(yōu)勢在于性能更高,因?yàn)?OkHttp基于NIO和Okio ,所以性能上要比 Volley更快。IO 和 NIO這兩個都是Java中的概念,如果我從硬盤讀取數(shù)據(jù),第一種方式就是程序一直等,數(shù)據(jù)讀完后才能繼續(xù)操作這種是最簡單的也叫阻塞式IO,還有一種是你讀你的,程序接著往下執(zhí)行,等數(shù)據(jù)處理完你再來通知我,然后再處理回調(diào)。而第二種就是 NIO 的方式,非阻塞式, 所以NIO當(dāng)然要比IO的性能要好了,而 Okio是 Square 公司基于IO和NIO基礎(chǔ)上做的一個更簡單、高效處理數(shù)據(jù)流的一個庫。理論上如果Volley和OkHttp對比的話,更傾向于使用 Volley,因?yàn)閂olley內(nèi)部同樣支持使用OkHttp,這點(diǎn)OkHttp的性能優(yōu)勢就沒了, 而且 Volley 本身封裝的也更易用,擴(kuò)展性更好些。

OkHttp VS Retrofit

毫無疑問,Retrofit 默認(rèn)是基于 OkHttp 而做的封裝,這點(diǎn)來說沒有可比性,肯定首選 Retrofit。

Volley VS Retrofit

這兩個庫都做了不錯的封裝,但Retrofit解耦的更徹底,尤其Retrofit2.0出來,Jake對之前1.0設(shè)計(jì)不合理的地方做了大量重構(gòu), 職責(zé)更細(xì)分,而且Retrofit默認(rèn)使用OkHttp,性能上也要比Volley占優(yōu)勢,再有如果你的項(xiàng)目如果采用了RxJava ,那更該使用 Retrofit 。所以這兩個庫相比,Retrofit更有優(yōu)勢,在能掌握兩個框架的前提下該優(yōu)先使用 Retrofit。但是Retrofit門檻要比Volley稍高些,要理解他的原理,各種用法,想徹底搞明白還是需要花些功夫的,如果你對它一知半解,那還是建議在商業(yè)項(xiàng)目使用Volley吧。

18.熟悉哪些設(shè)計(jì)模式?

按照自己的實(shí)際情況回答,當(dāng)然是越多越好。比如我自己也就熟悉個單例模式。

19.三級緩存(這個偶爾會問)

  • 網(wǎng)絡(luò)加載,不優(yōu)先加載,速度慢,浪費(fèi)流量

  • 本地緩存,次優(yōu)先加載,速度快

  • 內(nèi)存緩存,優(yōu)先加載,速度最快

    首次加載Android App時,肯定要通過網(wǎng)絡(luò)交互來獲取圖片,之后我們可以將圖片保存至本地SD卡和內(nèi)存中,之后運(yùn)行APP時,優(yōu)先訪問內(nèi)存中的圖片緩存,若內(nèi)存中沒有,則加載本地SD卡中圖片,最后選擇訪問網(wǎng)絡(luò)

Android與服務(wù)器交互的方式中的對稱加密和非對稱加密是什么?

  • 對稱加密,就是加密和解密數(shù)據(jù)都是使用同一個key,這方面的算法有DES。
  • 非對稱加密,加密和解密是使用不同的key。發(fā)送數(shù)據(jù)之前要先和服務(wù)端約定生成公鑰和私鑰,使用公鑰加密的數(shù)據(jù)可以用私鑰解密,反之。這方面的算法有RSA。ssh 和 ssl都是典型的非對稱加密。

五 面試心得

1.準(zhǔn)備要充分,知識面要盡量的廣,同時深度也要夠。
2.面試安排上,如果不著急,盡量給自己留多時間,兩天一家,及時做總結(jié)和補(bǔ)充。
3.心態(tài)要放平,當(dāng)做一次技術(shù)交流,面試要看一部分的運(yùn)氣,也要看一些眼緣,有的面試官一張嘴你就能感覺到你這次面試完了。想去的公司沒有面試好,不要?dú)怵H,繼續(xù)加油準(zhǔn)備。
4.簡歷投遞方面,拉勾上投了很多經(jīng)常不匹配,可能是我學(xué)歷問題(自考本),有一些打擊自信心,如果有同樣感受的,不妨換BOSS或者其他平臺。避免打擊自信心。
5.寫簡歷一定要體現(xiàn)自己的優(yōu)勢,最好能體現(xiàn)類似于,用到了什么技術(shù),解決了什么問題。簡歷上寫到的一定要胸有成竹。
6.類似于你的優(yōu)勢是什么,你覺得你項(xiàng)目中做的比較好的地方有哪些,你能給公司帶來什么,這種問題心里要先想一些,免得臨場發(fā)揮容易緊張說不好。
7.我所經(jīng)歷的面試,一般技術(shù)面最少是兩輪。如果一輪后讓你走了,而你還自我感覺良好,那我覺得你有必要回顧一下面試內(nèi)容,并一條一條找找該問題的相關(guān)內(nèi)容,大部分問題就在于你沒有答到點(diǎn)子上,可能是深度不夠,也可能是擴(kuò)展不夠。繼續(xù)加油。

六 閑聊

現(xiàn)在外面面試問的的確比較多,要求也挺高的,行情不好,薪資也不好要,所以心態(tài)一定要放好,找好自己的定位,心態(tài)一定要好。

面試之后要盡量做到總結(jié),從我最開始沒什么準(zhǔn)備就出去面試,被打擊一通之后,總結(jié)了七八家面試題,會發(fā)新面試問到的都是那些知識點(diǎn),可能角度不一樣,但是你只要深度夠,他怎么問,你基于原理來回答,基本上都沒差,從簽了賠償協(xié)議以后出來面試,連續(xù)四家公司都走到了HR面,可以說面試的感覺上來了。前面的總結(jié)積累終究沒有白費(fèi)。

在寫這篇文章之前,我專門看了下我之前收藏的別的公號上發(fā)的面試題,很全,我都有點(diǎn)不想寫這篇文章了。但是想了下我這三個月聽到要裁員開始面試,到第一批沒被裁,第二批裁員遲遲不來。到第二批來的時候主動申請被裁。中間面試被打擊,失落,看到新聞那那都在裁員,到現(xiàn)在面試整體感覺還不錯。還是想分享一下自己的心里路程,想告訴大家,裁員別慌,做自己該做的,其他自己決定不了的,先放一放,心里列一個123,一條一條來。

可以看到我在上面推薦了很多書籍,而且JAVA部分時分塊來了。是因?yàn)楫?dāng)我看到很多面試題,針對題來的時候,題會很多,而且有時候你會覺得你的題都會了,但是面試的時候還是面不好,說明你的知識并不扎實(shí)?;蛘吣阒R會了這個題,并沒有融會貫通,所以在JAVA部分我分大塊來描述,而且針對每一塊,我都有推薦一本相關(guān)的書,你可能不需要都看,可以針對性的看。而Android部分時詳細(xì)的知識點(diǎn),這些知識點(diǎn)我希望的是,能夠深入研究。而推薦的書籍,書中的部分都有一些相關(guān)的知識點(diǎn),大家也可以選擇性的看,當(dāng)然論壇,博客都是知識的來源,大家做好知識點(diǎn)深度和廣度的基類就行了。

最后,雖然裁員的很多,都在說Android要沒落,但是,不要慌,做自己的計(jì)劃,學(xué)自己的習(xí),競爭無處不在,每個行業(yè)都是如此。祝大家2019年萬事大吉。

給大家看一份2019阿里p7高級工程師學(xué)習(xí)大綱


15217452-f73d303363b14995.jpg
QQ圖片20190414204449.jpg

加qq群:457848807。點(diǎn)擊鏈接加入群聊Android【高級技術(shù)交流】即可免費(fèi)領(lǐng)取高清技術(shù)大綱圖以及面試資料(包括java基礎(chǔ)與原理,自定義控件、NDK、架構(gòu)設(shè)計(jì)、混合式開發(fā)(Flutter,Weex)、性能優(yōu)化、完整商業(yè)項(xiàng)目開發(fā)等)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容