Android工程師面試問(wèn)題應對法案大全
下面對這段時(shí)間面試遇到的問(wèn)題進(jìn)行整理,分享給大家供大家參考,具體內容如下
Java基礎:
1、內存泄露的原因
1)、資源對象沒(méi)關(guān)閉。
如Cursor、File等資源。他們會(huì )在finalize中關(guān)閉,但這樣效率太低。容易造成內存泄露。
SQLiteCursor,當數據量大的時(shí)候容易泄露
2)、使用Adapter時(shí),沒(méi)有使用系統緩存的converview。
3)、即時(shí)調用recycle()釋放不再使用的Bitmap。
適當降低Bitmap的采樣率,如:
BitmapFactory.Options options = newBitmapFactory.Options(); options.inSampleSize = 2;//圖片寬高都為原來(lái)的二分之一,即圖片為原來(lái)的四分之一 Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
4)、使用application的context來(lái)替代activity相關(guān)的context。
盡量避免activity的context在自己的范圍外被使用,這樣會(huì )導致activity無(wú)法釋放。
5)、注冊沒(méi)取消造成內存泄露
如:廣播
6)、集合中的對象沒(méi)清理造成的內存泄露我們通常把一些對象的引用加入到了集合中,當我們不需要該對象時(shí),并沒(méi)有把它的引用從集合中清理掉,這樣這個(gè)集合就會(huì )越來(lái)越大。如果這個(gè)集合是static的話(huà),那情況就更嚴重了。
7)、Handler應該申明為靜態(tài)對象, 并在其內部類(lèi)中保存一個(gè)對外部類(lèi)的弱引用。如下:
static class MyHandler extends Handler { WeakReferencemActivityReference; MyHandler(Activity activity) { mActivityReference= new WeakReference(activity); } @Override public void handleMessage(Message msg) { final Activity activity = mActivityReference.get(); if (activity != null) { mImageView.setImageBitmap(mBitmap); } }}
2、ArrayList和LinkedList的區別
ArrayList初試大小為10,大小不夠會(huì )調用grow擴容:length = length + (length >> 1) LinkedList中Node first,last。分別指向頭尾
ArrayList和LinkedList在性能上各 有優(yōu)缺點(diǎn),都有各自所適用的地方,總的說(shuō)來(lái)可以描述如下:
1)、對ArrayList和LinkedList而言,在列表末尾增加一個(gè)元素所花的開(kāi)銷(xiāo)都是固定的。對 ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會(huì )導致對數組重新進(jìn)行分配;而對LinkedList而言,這個(gè)開(kāi)銷(xiāo)是 統一的,分配一個(gè)內部Entry對象。
2)、在A(yíng)rrayList的 中間插入或刪除一個(gè)元素意味著(zhù)這個(gè)列表中剩余的元素都會(huì )被移動(dòng);而在LinkedList的中間插入或刪除一個(gè)元素的開(kāi)銷(xiāo)是固定的。
3)、LinkedList不 支持高效的隨機元素訪(fǎng)問(wèn)。
4)、ArrayList的空 間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個(gè)元素都需要消耗相當的空間。
可以這樣說(shuō):當操作是在一列 數據的后面添加數據而不是在前面或中間,并且需要隨機地訪(fǎng)問(wèn)其中的元素時(shí),使用ArrayList會(huì )提供比較好的性能;當你的操作是在一列數據的.前面或中 間添加或刪除數據,并且按照順序訪(fǎng)問(wèn)其中的元素時(shí),就應該使用LinkedList了。
3、hashmap和hashtable的不同
1)、繼承不同。
public class Hashtable extends Dictionary implements Mappublic class HashMap extends AbstractMap implements Map
2)、Hashtable 中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。在多線(xiàn)程并發(fā)的環(huán)境下,可以直接使用Hashtable,但是要使用HashMap的話(huà)就要自己增加同步處理了。
3)、Hashtable中,key和value都不允許出現null值。
在HashMap中,null可以作為鍵,這樣的鍵只有一個(gè);可以有一個(gè)或多個(gè)鍵所對應的值為null。當get()方法返回null值時(shí),即可以表示 HashMap中沒(méi)有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來(lái)判斷HashMap中是否存在某個(gè)鍵, 而應該用containsKey()方法來(lái)判斷。
4)、兩個(gè)遍歷方式的內部實(shí)現上不同。
Hashtable、HashMap都使用了 Iterator。而由于歷史原因,Hashtable還使用了Enumeration的方式 。
5)、哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。
6.Hashtable和HashMap它們兩個(gè)內部實(shí)現方式的數組的初始大小和擴容的方式。HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。
4、Iterator和Enumeration的不同
1)、函數接口不同
Enumeration只有2個(gè)函數接口。通過(guò)Enumeration,我們只能讀取集合的數據,而不能對數據進(jìn)行修改。 Iterator只有3個(gè)函數接口。Iterator除了能讀取集合的數據之外,也能數據進(jìn)行刪除操作。
2)、Iterator支持fail-fast機制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函數包括Vector、Hashtable等類(lèi),這些類(lèi)都是JDK 1.0中加入的,Enumeration存在的目的就是為它們提供遍歷接口。Enumeration本身并沒(méi)有支持同步,而在Vector、Hashtable實(shí)現Enumeration時(shí),添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是為了HashMap、ArrayList等集合提供遍歷接口。Iterator是支持fail-fast機制的:當多個(gè)線(xiàn)程對同一個(gè)集合的內容進(jìn)行操作時(shí),就可能會(huì )產(chǎn)生fail-fast事件。
ail-fast 機制是java集合(Collection)中的一種錯誤機制。當多個(gè)線(xiàn)程對同一個(gè)集合的內容進(jìn)行操作時(shí),就可能會(huì )產(chǎn)生fail-fast事件。例如:當某一個(gè)線(xiàn)程A通過(guò)iterator去遍歷某集合的過(guò)程中,若該集合的內容被其他線(xiàn)程所改變了;那么線(xiàn)程A訪(fǎng)問(wèn)集合時(shí),就會(huì )拋出ConcurrentModificationException異常,產(chǎn)生fail-fast事件。
5、接口的注意點(diǎn)
1)、接口中的字段全部默認為 public static類(lèi)型。
2)、接口中的方法全部默認為 public類(lèi)型。
3)、接口中可以申明內部類(lèi),而默認為public static,正因為是static,只是命名空間屬于接口,代碼邏輯不屬于接口。所以不違法接口定義。
4)、接口本身可以申明為public或者缺省。
5)、抽象類(lèi)繼承自某接口。如果在抽象類(lèi)中實(shí)現了父類(lèi)(接口)中的方法,在其子類(lèi)可以不用實(shí)現,否則在子類(lèi)必須實(shí)現。
6、final方法
將方法聲明為final那有兩個(gè)原因,第一就是說(shuō)明你已經(jīng)知道這個(gè)方法提供的功能已經(jīng)滿(mǎn)足你要求,不需要進(jìn)行擴展,并且也不允許任何從此類(lèi)繼承的類(lèi)來(lái)覆寫(xiě)這個(gè)方法,但是繼承仍然可以繼承這個(gè)方法,也就是說(shuō)可以直接使用。第二就是允許編譯器將所有對此方法的調用轉化為inline調用的機制,它會(huì )使你在調用final方法時(shí),直接將方法主體插入到調用處,而不是進(jìn)行例行的方法調用,例如保存斷點(diǎn),壓棧等,這樣可能會(huì )使你的程序效率有所提高,然而當你的方法主體非常龐大時(shí),或你在多處調用此方法,那么你的調用主體代碼便會(huì )迅速膨脹,可能反而會(huì )影響效率,所以你要慎用final進(jìn)行方法定義。
Android知識點(diǎn)
1、Handler機制
1)、Handler對Activity finish影響。
在開(kāi)發(fā)的過(guò)程中碰到一個(gè)棘手的問(wèn)題,調用Activity.finish函數Acitivity沒(méi)有執行生命周期的ondestory函數,后面查找半天是因為有一個(gè)handler成員,因為它有一個(gè)delay消息沒(méi)有處理,調用Activity.finish,Activity不會(huì )馬上destory,所以記得在A(yíng)tivity finish前清理一下handle中的未處理的消息,這樣Activity才會(huì )順利的destory
2)、Looper
通過(guò)調用Looper.prepare()創(chuàng )建Looper()對象并綁定到ThreadLocal變量中。
Looper里面包含了messageQueue。
構造器如下:
private Looper(){ mQueue = new MessageQueue(); mRun = true; mThread = Thread.currentThread();}
3)、loop()函數
1)從Looper中取出MessageQueue;
2)循環(huán)從MessageQueue中取出Message;
3)從Message中取出Target(Handler對象);
4)調用tartget的dispatchMessage分發(fā)消息。
4)、Handler對象
重要成員變量:
final MessageQueue mQueue;final Looper mLooper;final Callback mCallback; //用于回調
Handler對象在發(fā)送消息的時(shí)候,將MSG的target變量設為自己。這樣在Looper對象循環(huán)取出msg的時(shí)候就可以調用對應handler的dispatchMessage()。此函數分發(fā)消息的優(yōu)先級如下:
Message在創(chuàng )建的時(shí)候調用Obtain設置了Callback。
Handler在創(chuàng )建的時(shí)候傳入了Callback。
交給Handler子類(lèi)的HandleMessage處理(通常的做法)。
2、Android啟動(dòng)模式
standard和singleTop模式。
這兩種比較簡(jiǎn)單。創(chuàng )建Activity放入當前的任務(wù)棧中,若當前是singleInstace,則放入設置的任務(wù)棧中。其中如果Activity在棧頂,則調用onNewIntent。
singletask:棧內復用模式。不是在當前任務(wù)棧中查找是否存在,實(shí)際過(guò)程如下:
1)、查找該Activity所需的任務(wù)棧是否存在(由taskAffinity控制,或者默認為包名)。
2)、在任務(wù)棧當中查找該Activity是否存在。
這里面存在任務(wù)棧的切換,也就是當開(kāi)啟的singtask類(lèi)型的Activity不屬于當前任務(wù)棧時(shí),則會(huì )切換到其任務(wù)棧。
singleInstance:?jiǎn)螌?shí)例模式。
包含了singleTask的所有特性,另外加上:設置為該模式的Activity,只能單獨存在于一個(gè)任務(wù)棧中。當有兩個(gè)singleInstace的Activity設置成同樣的任務(wù)棧時(shí),會(huì )出現兩個(gè)同名的任務(wù)棧,分別用來(lái)存放同名的Activity。
注:在任何跳轉的時(shí)候,首先調用本Activity的onPause,然后跳轉。如果被跳轉的activity由于啟動(dòng)方式而沒(méi)創(chuàng )建新的實(shí)例,則會(huì )先調用onNewIntent,然后按照正常的生命周期調用。
如
1:A→B,A:onPause;B:onCreate,onStart,onResume。
2:A(singleTop)→A,A:onPause;A:onSaveInstanceState;A:onResume。
以上是我遇到和搜集到的各類(lèi)題目以及相應的解答,接下來(lái)一段時(shí)間也會(huì )持續更新,希望大家繼續關(guān)注。
也祝愿大家可以找到自己喜歡的工作。
【Android工程師面試問(wèn)題應對法案大全】相關(guān)文章:
應對棘手問(wèn)題面試技巧11-14
面試應對問(wèn)題的秘訣3篇02-28
如何應對面試中的問(wèn)題08-24
面試前突發(fā)問(wèn)題如何應對01-03
如何應對面試中最難的問(wèn)題01-13
女性職場(chǎng)面試如何應對敏感問(wèn)題12-18
教你應對“五大”面試必問(wèn)題12-14