Android工程師面試題大全

校招的日子結束了,結果也算圓滿。忙碌了一陣子,現(xiàn)在終于可以安安靜靜的做做項目看看書寫寫論文了。下面對這段時間面試遇到的問題并結合網(wǎng)上各位的大神秒下的面試題做個總結,本文會持續(xù)更新,希望能在面試中助各位一臂之力!

Java基礎:

1、內(nèi)存泄露的原因:
  1. 資源對象沒關閉。
    如Cursor、File等資源。他們會在finalize中關閉,但這樣效率太低。容易造成內(nèi)存泄露。
    SQLiteCursor,當數(shù)據(jù)量大的時候容易泄露
  2. 使用Adapter時,沒有使用系統(tǒng)緩存的converView。
  3. 即時調(diào)用recycle()釋放不再使用的Bitmap。
    適當降低Bitmap的采樣率,如:
BitmapFactory.Options options = newBitmapFactory.Options();    
options.inSampleSize = 2;//圖片寬高都為原來的二分之一,即圖片為原來的四分之一    
Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);   
  1. 使用application的context來替代activity相關的context。
    盡量避免activity的context在自己的范圍外被使用,這樣會導致activity無法釋放。
  2. 注冊沒取消造成內(nèi)存泄露
    如:廣播
  3. 集合中的對象沒清理造成的內(nèi)存泄露我們通常把一些對象的引用加入到了集合中,當我們不需要該對象時,并沒有把它的引用從集合中清理掉,這樣這個集合就會越來越大。如果這個集合是static的話,那情況就更嚴重了。
  4. Handler應該申明為靜態(tài)對象, 并在其內(nèi)部類中保存一個對外部類的弱引用。如下:
static class MyHandler extends Handler 
{
       WeakReference<Activity > mActivityReference;
       MyHandler(Activity activity)
      { 
            mActivityReference= new WeakReference<Activity>(activity);
      }
     @Override
     public void handleMessage(Message msg)
    {
           final Activity activity = mActivityReference.get();
           if (activity != null)
          {
                 mImageView.setImageBitmap(mBitmap);
          }    
     }
}

2、ArrayList和LinkedList的區(qū)別
  • ArrayList初試大小為10,大小不夠會調(diào)用grow擴容:length = length + (length >> 1)
  • LinkedList中Node first,last。分別指向頭尾

ArrayList和LinkedList在性能上各 有優(yōu)缺點,都有各自所適用的地方,總的說來可以描述如下:

  1. 對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內(nèi)部數(shù)組中增加一項,指向所添加的元素,偶爾可能會導致對數(shù)組重新進行分配;而對LinkedList而言,這個開銷是 統(tǒng)一的,分配一個內(nèi)部Entry對象。
  2. 在ArrayList的 中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
  3. LinkedList不 支持高效的隨機元素訪問。
  4. ArrayList的空 間浪費主要體現(xiàn)在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現(xiàn)在它的每一個元素都需要消耗相當?shù)目臻g
      可以這樣說:當操作是在一列 數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列數(shù)據(jù)的前面或中 間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時,就應該使用LinkedList了。

3、hashmap和hashtable的不同
  1. 繼承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
  1. Hashtable 中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。在多線程并發(fā)的環(huán)境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。
  2. Hashtable中,key和value都不允許出現(xiàn)null值。
    在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示 HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。
  3. 兩個遍歷方式的內(nèi)部實現(xiàn)上不同。
    Hashtable、HashMap都使用了 Iterator。而由于歷史原因,Hashtable還使用了Enumeration的方式 。
  4. 哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。
    6.Hashtable和HashMap它們兩個內(nèi)部實現(xiàn)方式的數(shù)組的初始大小和擴容的方式。HashTable中hash數(shù)組默認大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認大小是16,而且一定是2的指數(shù)。
4、Iterator和Enumeration的不同
  1. 函數(shù)接口不同
    Enumeration只有2個函數(shù)接口。通過Enumeration,我們只能讀取集合的數(shù)據(jù),而不能對數(shù)據(jù)進行修改。 Iterator只有3個函數(shù)接口。Iterator除了能讀取集合的數(shù)據(jù)之外,也能數(shù)據(jù)進行刪除操作。
  2. Iterator支持fail-fast機制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函數(shù)包括Vector、Hashtable等類,這些類都是JDK 1.0中加入的,Enumeration存在的目的就是為它們提供遍歷接口。Enumeration本身并沒有支持同步,而在Vector、Hashtable實現(xiàn)Enumeration時,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是為了HashMap、ArrayList等集合提供遍歷接口。Iterator是支持fail-fast機制的:當多個線程對同一個集合的內(nèi)容進行操作時,就可能會產(chǎn)生fail-fast事件。

ail-fast 機制是java集合(Collection)中的一種錯誤機制。當多個線程對同一個集合的內(nèi)容進行操作時,就可能會產(chǎn)生fail-fast事件。例如:當某一個線程A通過iterator去遍歷某集合的過程中,若該集合的內(nèi)容被其他線程所改變了;那么線程A訪問集合時,就會拋出ConcurrentModificationException異常,產(chǎn)生fail-fast事件。


5、接口的注意點

  1. 接口中的字段全部默認為 public static類型。
  2. 接口中的方法全部默認為 public類型。
  3. 接口中可以申明內(nèi)部類,而默認為public static,正因為是static,只是命名空間屬于接口,代碼邏輯不屬于接口。所以不違法接口定義。
  4. 接口本身可以申明為public或者缺省。
  5. 抽象類繼承自某接口。如果在抽象類中實現(xiàn)了父類(接口)中的方法,在其子類可以不用實現(xiàn),否則在子類必須實現(xiàn)。

6、final方法
將方法聲明為final那有兩個原因,第一就是說明你已經(jīng)知道這個方法提供的功能已經(jīng)滿足你要求,不需要進行擴展,并且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。第二就是允許編譯器將所有對此方法的調(diào)用轉化為inline調(diào)用的機制,它會使你在調(diào)用final方法時,直接將方法主體插入到調(diào)用處,而不是進行例行的方法調(diào)用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高,然而當你的方法主體非常龐大時,或你在多處調(diào)用此方法,那么你的調(diào)用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進行方法定義。



Android知識點

1、Handler機制
  1. Handler對Activity finish影響。
    在開發(fā)的過程中碰到一個棘手的問題,調(diào)用Activity.finish函數(shù)Acitivity沒有執(zhí)行生命周期的ondestory函數(shù),后面查找半天是因為有一個handler成員,因為它有一個delay消息沒有處理,調(diào)用Activity.finish,Activity不會馬上destory,所以記得在Ativity finish前清理一下handle中的未處理的消息,這樣Activity才會順利的destory
  2. Looper
    通過調(diào)用Looper.prepare()創(chuàng)建Looper()對象并綁定到ThreadLocal變量中。
    Looper里面包含了messageQueue。
    構造器如下:
private Looper()
{
        mQueue = new MessageQueue();
        mRun = true;
        mThread = Thread.currentThread();
}
  1. loop()函數(shù)
    1)從Looper中取出MessageQueue;
    2)循環(huán)從MessageQueue中取出Message;
    3)從Message中取出Target(Handler對象);
    4)調(diào)用tartget的dispatchMessage分發(fā)消息。
  2. Handler對象
    重要成員變量:
final MessageQueue mQueue;
final Looper  mLooper;
final Callback mCallback;   //用于回調(diào)
Handler對象在發(fā)送消息的時候,將MSG的target變量設為自己。這樣在Looper對象循環(huán)取出msg的時候就可以調(diào)用對應handler的dispatchMessage()。此函數(shù)分發(fā)消息的優(yōu)先級如下:

Message在創(chuàng)建的時候調(diào)用Obtain設置了Callback。
Handler在創(chuàng)建的時候傳入了Callback。
交給Handler子類的HandleMessage處理(通常的做法)。


2、Android啟動模式

standard和singleTop模式。
這兩種比較簡單。創(chuàng)建Activity放入當前的任務棧中,若當前是singleInstace,則放入設置的任務棧中。其中如果Activity在棧頂,則調(diào)用onNewIntent。

singletask:棧內(nèi)復用模式。不是在當前任務棧中查找是否存在,實際過程如下:

  1. 查找該Activity所需的任務棧是否存在(由taskAffinity控制,或者默認為包名)。
  2. 在任務棧當中查找該Activity是否存在。
    這里面存在任務棧的切換,也就是當開啟的singtask類型的Activity不屬于當前任務棧時,則會切換到其任務棧。

singleInstance:單實例模式。
包含了singleTask的所有特性,另外加上:設置為該模式的Activity,只能單獨存在于一個任務棧中。當有兩個singleInstace的Activity設置成同樣的任務棧時,會出現(xiàn)兩個同名的任務棧,分別用來存放同名的Activity。
注:在任何跳轉的時候,首先調(diào)用本Activity的onPause,然后跳轉。如果被跳轉的activity由于啟動方式而沒創(chuàng)建新的實例,則會先調(diào)用onNewIntent,然后按照正常的生命周期調(diào)用。

1:A→B,A:onPause;B:onCreate,onStart,onResume。
2:A(singleTop)→A,A:onPause;A:onSaveInstanceState;A:onResume。


3、View的繪制

推薦郭霖大神的博客:
http://blog.csdn.net/guolin_blog/article/details/16330267


4、canvas的使用

推薦以下博客:
http://blog.csdn.net/qinjuning/article/details/6936783


5、ActivityManagerService的相關知識點

推薦以下博客:
http://wiki.jikexueyuan.com/project/deep-android-v2/activity.html


6、Activity切換時生命周期交集

Activity之間的協(xié)作當一個activity A啟動了另外一個activity B,它們的生命周期是有交叉的;
首先A的onPause()被調(diào)用;
之后B的onCrate(), onStart()及onResume() 方法會被調(diào)用(此時B擁有用戶焦點);
最后,如果A在屏幕上不可見,onStop()方法被調(diào)用;
因此,我們在兩個activities中傳遞數(shù)據(jù),或者共享資源時(如數(shù)據(jù)庫連接),需要在前一個activity的onPause()方法而不是onStop()方法中進行;


7、Hybrid(重要加分項)
  1. java和JS的交互
    http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/
    http://rensanning.iteye.com/blog/2043049
  2. WebView開啟JavaScript腳本執(zhí)行
  3. WebView設置供JavaScript調(diào)用的交互接口。

8、網(wǎng)絡編程
  1. volley
    https://bxbxbai.github.io/2014/09/14/android-working-with-volley/
    http://blog.csdn.net/guolin_blog/article/details/17656437
  2. 如何控制TCP連接時的擁塞
    http://blog.csdn.net/yechaodechuntian/article/details/25429143
  3. 三次握手
    http://blog.csdn.net/whuslei/article/details/6667471
  4. Android客戶端和服務端如何使用Token和Session
    http://wyong.blog.51cto.com/1115465/1553352
  5. 移動端獲取網(wǎng)絡數(shù)據(jù)優(yōu)化的幾個點
  6. 連接復用 :
    節(jié)省連接建立時間,如開啟 keep-alive。
    對于 Android 來說默認情況下 HttpURLConnection 和 HttpClient 都開啟了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影響連接池的 Bug,具體可見:Android HttpURLConnection 及 HttpClient 選擇
  7. 請求合并:
    即將多個請求合并為一個進行請求,比較常見的就是網(wǎng)頁中的 CSS Image Sprites。如果某個頁面內(nèi)請求過多,也可以考慮做一定的請求合并。
  8. 減少請求數(shù)據(jù)的大小:
    對于post請求,body可以做gzip壓縮的,header也可以作數(shù)據(jù)壓縮(不過只支持http 2.0)。
  9. 返回的數(shù)據(jù)的body也可以作gzip壓縮,body數(shù)據(jù)體積可以縮小到原來的30%左右。(也可以考慮壓縮返回的json數(shù)據(jù)的key數(shù)據(jù)的體積,尤其是針對返回數(shù)據(jù)格式變化不大的情況,支付寶聊天返回的數(shù)據(jù)用到了)
  10. 根據(jù)用戶的當前的網(wǎng)絡質(zhì)量來判斷下載什么質(zhì)量的圖片(電商用的比較多)。

9、android開發(fā)中,可能會導致內(nèi)存泄露的問題
  1. 不要讓生命周期長于Activity的對象持有到Activity的引用
  2. 盡量使用Application的Context而不是Activity的Context
  3. 盡量不要在Activity中使用非靜態(tài)內(nèi)部類,因為非靜態(tài)內(nèi)部類會隱式持有外部類實例的引用(具體可以查看細話Java:”失效”的private修飾符了解)。如果使用靜態(tài)內(nèi)部類,將外部實例引用作為弱引用持有。
  4. 垃圾回收不能解決內(nèi)存泄露,了解Android中垃圾回收機制
    **更多內(nèi)容可以參考以下博客:
    http://spencer-dev.lofter.com/post/d7b9e_6faf120

10、activity的啟動過程:

http://www.cloudchou.com/android/post-788.html

以上是我遇到和搜集到的各類題目以及相應的解答,接下來一段時間也會持續(xù)更新,大家遇到什么經(jīng)典或者不會的問題也可以給我留言,在此統(tǒng)一分享給大家。祝大家能夠找到自己心儀的工作,前途一片光明!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,726評論 18 399
  • 本文出自 Eddy Wiki ,轉載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,173評論 0 16
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,692評論 25 708
  • 一直想聊聊我對《易經(jīng)》的認識,可是一直都不敢。主要是現(xiàn)在大家對《易經(jīng)》這本書,過于神化,而且各種各樣的講法,五花八...
    老蕭書房閱讀 646評論 1 1
  • 接龍客棧一月懸賞 任務2--晨 是什么將晨曦帶給世界 是那絢爛的彩霞 是那柔和的光茫 是那水天一色處涌動著的熾熱的...
    蘇寂然閱讀 398評論 5 8