成年人在线观看视频免费,国产第2页,人人狠狠综合久久亚洲婷婷,精品伊人久久

我要投稿 投訴建議

Android工程師面試題

時(shí)間:2022-11-03 22:01:07 面試試題 我要投稿
  • 相關(guān)推薦

Android工程師面試題匯總

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

Android工程師面試題匯總

  Java基礎(chǔ):

  1、內(nèi)存泄露的原因:

  資源對(duì)象沒(méi)關(guān)閉。

  如Cursor、File等資源。他們會(huì)在finalize中關(guān)閉,但這樣效率太低。容易造成內(nèi)存泄露。

  SQLiteCursor,當(dāng)數(shù)據(jù)量大的時(shí)候容易泄露

  使用Adapter時(shí),沒(méi)有使用系統(tǒng)緩存的converView。

  即時(shí)調(diào)用recycle()釋放不再使用的Bitmap。

  適當(dāng)降低Bitmap的采樣率,如:

  3

  BitmapFactory.Options options = newBitmapFactory.Options();

  options.inSampleSize = 2;//圖片寬高都為原來(lái)的二分之一,即圖片為原來(lái)的四分之一

  Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);

  使用application的context來(lái)替代activity相關(guān)的context。

  盡量避免activity的context在自己的范圍外被使用,這樣會(huì)導(dǎo)致activity無(wú)法釋放。

  注冊(cè)沒(méi)取消造成內(nèi)存泄露

  如:廣播

  集合中的對(duì)象沒(méi)清理造成的內(nèi)存泄露我們通常把一些對(duì)象的引用加入到了集合中,當(dāng)我們不需要該對(duì)象時(shí),并沒(méi)有把它的引用從集合中清理掉,這樣這個(gè)集合就會(huì)越來(lái)越大。如果這個(gè)集合是static的話,那情況就更嚴(yán)重了。

  Handler應(yīng)該申明為靜態(tài)對(duì)象, 并在其內(nèi)部類(lèi)中保存一個(gè)對(duì)外部類(lèi)的弱引用。如下:

  復(fù)制代碼

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  static class MyHandler extends Handler

  {

  WeakReference mActivityReference;

  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的區(qū)別

  ArrayList初試大小為10,大小不夠會(huì)調(diào)用grow擴(kuò)容:length = length + (length >> 1)

  LinkedList中Node first,last。分別指向頭尾

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

  對(duì)ArrayList和LinkedList而言,在列表末尾增加一個(gè)元素所花的開(kāi)銷(xiāo)都是固定的。對(duì)

  ArrayList而言,主要是在內(nèi)部數(shù)組中增加一項(xiàng),指向所添加的元素,偶爾可能會(huì)導(dǎo)致對(duì)數(shù)組重新進(jìn)行分配;而對(duì)LinkedList而言,這個(gè)開(kāi)銷(xiāo)是

  統(tǒng)一的,分配一個(gè)內(nèi)部Entry對(duì)象。

  在ArrayList的 中間插入或刪除一個(gè)元素意味著這個(gè)列表中剩余的元素都會(huì)被移動(dòng);而在LinkedList的中間插入或刪除一個(gè)元素的開(kāi)銷(xiāo)是固定的。

  LinkedList不 支持高效的隨機(jī)元素訪問(wèn)。

  ArrayList的空 間浪費(fèi)主要體現(xiàn)在在list列表的結(jié)尾預(yù)留一定的容量空間,而LinkedList的空間花費(fèi)則體現(xiàn)在它的每一個(gè)元素都需要消耗相當(dāng)?shù)目臻g

  可以這樣說(shuō):當(dāng)操作是在一列

  數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機(jī)地訪問(wèn)其中的元素時(shí),使用ArrayList會(huì)提供比較好的性能;當(dāng)你的操作是在一列數(shù)據(jù)的前面或中

  間添加或刪除數(shù)據(jù),并且按照順序訪問(wèn)其中的元素時(shí),就應(yīng)該使用LinkedList了。

  3、hashmap和hashtable的不同

  繼承不同。

  復(fù)制代碼

  1

  2

  public class Hashtable extends Dictionary implements Map

  public class HashMap extends AbstractMap implements Map

  Hashtable 中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。在多線程并發(fā)的環(huán)境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。

  Hashtable中,key和value都不允許出現(xiàn)null值。

  在HashMap中,null可以作為鍵,這樣的鍵只有一個(gè);可以有

  一個(gè)或多個(gè)鍵所對(duì)應(yīng)的值為null。當(dāng)get()方法返回null值時(shí),即可以表示

  HashMap中沒(méi)有該鍵,也可以表示該鍵所對(duì)應(yīng)的值為null。因此,在HashMap中不能由get()方法來(lái)判斷HashMap中是否存在某個(gè)鍵,

  而應(yīng)該用containsKey()方法來(lái)判斷。

  兩個(gè)遍歷方式的內(nèi)部實(shí)現(xiàn)上不同。

  Hashtable、HashMap都使用了 Iterator。而由于歷史原因,Hashtable還使用了Enumeration的方式 。

  哈希值的使用不同,HashTable直接使用對(duì)象的hashCode。而HashMap重新計(jì)算hash值。

  6.Hashtable和HashMap它們兩個(gè)內(nèi)部實(shí)現(xiàn)方式的數(shù)組的初始大小和擴(kuò)容的方式。HashTable中hash數(shù)組默認(rèn)大小是11,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16,而且一定是2的指數(shù)。

  4、Iterator和Enumeration的不同

  函數(shù)接口不同

  Enumeration只有2個(gè)函數(shù)接口。通過(guò)Enumeration,我們只能讀取集合的數(shù)據(jù),而不能對(duì)數(shù)據(jù)進(jìn)行修改。 Iterator只有3個(gè)函數(shù)接口。Iterator除了能讀取集合的數(shù)據(jù)之外,也能數(shù)據(jù)進(jìn)行刪除操作。

  Iterator支持fail-fast機(jī)制,而Enumeration不支持。 Enumeration 是JDK

  1.0添加的接口。使用到它的函數(shù)包括Vector、Hashtable等類(lèi),這些類(lèi)都是JDK

  1.0中加入的,Enumeration存在的目的就是為它們提供遍歷接口。Enumeration本身并沒(méi)有支持同步,而在Vector、

  Hashtable實(shí)現(xiàn)Enumeration時(shí),添加了同步。而Iterator 是JDK

  1.2才添加的接口,它也是為了HashMap、ArrayList等集合提供遍歷接口。Iterator是支持fail-fast機(jī)制的:當(dāng)多個(gè)線程對(duì)

  同一個(gè)集合的內(nèi)容進(jìn)行操作時(shí),就可能會(huì)產(chǎn)生fail-fast事件。

  ail-fast 機(jī)制是java集合(Collection)中的一種錯(cuò)誤機(jī)制。當(dāng)多個(gè)線程對(duì)同一個(gè)集合的內(nèi)

  容進(jìn)行操作時(shí),就可能會(huì)產(chǎn)生fail-fast事件。例如:當(dāng)某一個(gè)線程A通過(guò)iterator去遍歷某集合的過(guò)程中,若該集合的內(nèi)容被其他線程所改變

  了;那么線程A訪問(wèn)集合時(shí),就會(huì)拋出ConcurrentModificationException異常,產(chǎn)生fail-fast事件。

  5、接口的注意點(diǎn)

  接口中的字段全部默認(rèn)為 public static類(lèi)型。

  接口中的方法全部默認(rèn)為 public類(lèi)型。

  接口中可以申明內(nèi)部類(lèi),而默認(rèn)為public static,正因?yàn)槭莝tatic,只是命名空間屬于接口,代碼邏輯不屬于接口。所以不違法接口定義。

  接口本身可以申明為public或者缺省。

  抽象類(lèi)繼承自某接口。如果在抽象類(lèi)中實(shí)現(xiàn)了父類(lèi)(接口)中的方法,在其子類(lèi)可以不用實(shí)現(xiàn),否則在子類(lèi)必須實(shí)現(xiàn)。

  6、final方法

  將方法聲明為final那有兩個(gè)原因,第一就是說(shuō)明你已經(jīng)知道這個(gè)方法提供的功能已經(jīng)滿足你要求,不需要進(jìn)行擴(kuò)展,并且

  也不允許任何從此類(lèi)繼承的類(lèi)來(lái)覆寫(xiě)這個(gè)方法,但是繼承仍然可以繼承這個(gè)方法,也就是說(shuō)可以直接使用。第二就是允許編譯器將所有對(duì)此方法的調(diào)用轉(zhuǎn)化為

  inline調(diào)用的機(jī)制,它會(huì)使你在調(diào)用final方法時(shí),直接將方法主體插入到調(diào)用處,而不是進(jìn)行例行的方法調(diào)用,例如保存斷點(diǎn),壓棧等,這樣可能會(huì)使

  你的程序效率有所提高,然而當(dāng)你的方法主體非常龐大時(shí),或你在多處調(diào)用此方法,那么你的調(diào)用主體代碼便會(huì)迅速膨脹,可能反而會(huì)影響效率,所以你要慎用

  final進(jìn)行方法定義。

  Android知識(shí)點(diǎn)

  1、Handler機(jī)制

  Handler對(duì)Activity finish影響。

  在開(kāi)發(fā)的過(guò)程中碰到一個(gè)棘手的問(wèn)題,調(diào)用Activity.finish函數(shù)

  Acitivity沒(méi)有執(zhí)行生命周期的ondestory函數(shù),后面查找半天是因?yàn)橛幸粋(gè)handler成員,因?yàn)樗幸粋(gè)delay消息沒(méi)有處理,調(diào)用

  Activity.finish,Activity不會(huì)馬上destory,所以記得在Ativity

  finish前清理一下handle中的未處理的消息,這樣Activity才會(huì)順利的destory

  Looper

  通過(guò)調(diào)用Looper.prepare()創(chuàng)建Looper()對(duì)象并綁定到ThreadLocal變量中。

  Looper里面包含了messageQueue。

  構(gòu)造器如下:

  復(fù)制代碼

  1

  2

  3

  4

  5

  6

  private Looper()

  {

  mQueue = new MessageQueue();

  mRun = true;

  mThread = Thread.currentThread();

  }

  loop()函數(shù)

  1)從Looper中取出MessageQueue;

  2)循環(huán)從MessageQueue中取出Message;

  3)從Message中取出Target(Handler對(duì)象);

  4)調(diào)用tartget的dispatchMessage分發(fā)消息。

  Handler對(duì)象

  重要成員變量:

  復(fù)制代碼

  1

  2

  3

  final MessageQueue mQueue;

  final Looper mLooper;

  final Callback mCallback; //用于回調(diào)

  Handler對(duì)象在發(fā)送消息的時(shí)候,將MSG的target變量設(shè)為自己。這樣在Looper對(duì)象循環(huán)取出msg的時(shí)候就可以調(diào)用對(duì)應(yīng)handler的dispatchMessage()。此函數(shù)分發(fā)消息的優(yōu)先級(jí)如下:

  Message在創(chuàng)建的時(shí)候調(diào)用Obtain設(shè)置了Callback。

  Handler在創(chuàng)建的時(shí)候傳入了Callback。

  交給Handler子類(lèi)的HandleMessage處理(通常的做法)。

  2、Android啟動(dòng)模式

  standard和singleTop模式。

  這兩種比較簡(jiǎn)單。創(chuàng)建Activity放入當(dāng)前的任務(wù)棧中,若當(dāng)前是singleInstace,則放入設(shè)置的任務(wù)棧中。其中如果Activity在棧頂,則調(diào)用onNewIntent。

  singletask:棧內(nèi)復(fù)用模式。不是在當(dāng)前任務(wù)棧中查找是否存在,實(shí)際過(guò)程如下:

  查找該Activity所需的任務(wù)棧是否存在(由taskAffinity控制,或者默認(rèn)為包名)。

  在任務(wù)棧當(dāng)中查找該Activity是否存在。

  這里面存在任務(wù)棧的切換,也就是當(dāng)開(kāi)啟的singtask類(lèi)型的Activity不屬于當(dāng)前任務(wù)棧時(shí),則會(huì)切換到其任務(wù)棧。

  singleInstance:?jiǎn)螌?shí)例模式。

  包含了singleTask的所有特性,另外加上:設(shè)置為該模式的Activity,只能單獨(dú)存在于一個(gè)任務(wù)棧中。當(dāng)有兩個(gè)singleInstace的Activity設(shè)置成同樣的任務(wù)棧時(shí),會(huì)出現(xiàn)兩個(gè)同名的任務(wù)棧,分別用來(lái)存放同名的Activity。

  注:在任何跳轉(zhuǎn)的時(shí)候,首先調(diào)用本Activity的onPause,然后跳轉(zhuǎn)。如果被跳轉(zhuǎn)的activity由于啟動(dòng)方式而沒(méi)創(chuàng)建新的實(shí)例,則會(huì)先調(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的相關(guān)知識(shí)點(diǎn)

  推薦以下博客:

  http://wiki.jikexueyuan.com/project/deep-android-v2/activity.html

  6、Activity切換時(shí)生命周期交集

  Activity之間的協(xié)作當(dāng)一個(gè)activity A啟動(dòng)了另外一個(gè)activity B,它們的生命周期是有交叉的;

  首先A的onPause()被調(diào)用;

  之后B的onCrate(), onStart()及onResume() 方法會(huì)被調(diào)用(此時(shí)B擁有用戶焦點(diǎn));

  最后,如果A在屏幕上不可見(jiàn),onStop()方法被調(diào)用;

  因此,我們?cè)趦蓚(gè)activities中傳遞數(shù)據(jù),或者共享資源時(shí)(如數(shù)據(jù)庫(kù)連接),需要在前一個(gè)activity的onPause()方法而不是onStop()方法中進(jìn)行;

  7、Hybrid(重要加分項(xiàng))

  java和JS的交互

  http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/

  http://rensanning.iteye.com/blog/2043049

  WebView開(kāi)啟JavaScript腳本執(zhí)行

  WebView設(shè)置供JavaScript調(diào)用的交互接口。

  8、網(wǎng)絡(luò)編程

  volley

  https://bxbxbai.github.io/2014/09/14/android-working-with-volley/

  http://blog.csdn.net/guolin_blog/article/details/17656437

  如何控制TCP連接時(shí)的擁塞

  http://blog.csdn.net/yechaodechuntian/article/details/25429143

  三次握手

  http://blog.csdn.net/whuslei/article/details/6667471

  Android客戶端和服務(wù)端如何使用Token和Session

  http://wyong.blog.51cto.com/1115465/1553352

  移動(dòng)端獲取網(wǎng)絡(luò)數(shù)據(jù)優(yōu)化的幾個(gè)點(diǎn)連接復(fù)用 :

  節(jié)省連接建立時(shí)間,如開(kāi)啟 keep-alive。

  對(duì)于 Android 來(lái)說(shuō)默認(rèn)情況下 HttpURLConnection 和 HttpClient 都開(kāi)啟了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影響連接池的 Bug,具體可見(jiàn):Android HttpURLConnection 及 HttpClient 選擇

  請(qǐng)求合并:

  即將多個(gè)請(qǐng)求合并為一個(gè)進(jìn)行請(qǐng)求,比較常見(jiàn)的就是網(wǎng)頁(yè)中的 CSS Image Sprites。如果某個(gè)頁(yè)面內(nèi)請(qǐng)求過(guò)多,也可以考慮做一定的請(qǐng)求合并。

  減少請(qǐng)求數(shù)據(jù)的大小:

  對(duì)于post請(qǐng)求,body可以做gzip壓縮的,header也可以作數(shù)據(jù)壓縮(不過(guò)只支持http 2.0)。

  返回的數(shù)據(jù)的body也可以作gzip壓縮,body數(shù)據(jù)體積可以縮小到原來(lái)的30%左右。(也可以考慮壓縮返回的json數(shù)據(jù)的key數(shù)據(jù)的體積,尤其是針對(duì)返回?cái)?shù)據(jù)格式變化不大的情況,支付寶聊天返回的數(shù)據(jù)用到了)

  根據(jù)用戶的當(dāng)前的網(wǎng)絡(luò)質(zhì)量來(lái)判斷下載什么質(zhì)量的圖片(電商用的比較多)。

  9、android開(kāi)發(fā)中,可能會(huì)導(dǎo)致內(nèi)存泄露的問(wèn)題

  不要讓生命周期長(zhǎng)于Activity的對(duì)象持有到Activity的引用

  盡量使用Application的Context而不是Activity的Context

  盡量不要在Activity中使用非靜態(tài)內(nèi)部類(lèi),因?yàn)榉庆o態(tài)內(nèi)部類(lèi)會(huì)隱式持有外部類(lèi)實(shí)例的引用(具體可以查看細(xì)話Java:”失效”的private修飾符了解)。如果使用靜態(tài)內(nèi)部類(lèi),將外部實(shí)例引用作為弱引用持有。

  垃圾回收不能解決內(nèi)存泄露,了解Android中垃圾回收機(jī)制

  **更多內(nèi)容可以參考以下博客:

  http://spencer-dev.lofter.com/post/d7b9e_6faf120

  10、activity的啟動(dòng)過(guò)程:

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

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

【Android工程師面試題】相關(guān)文章:

android面試題摘要02-20

android面試題大全12-30

android面試題目匯總02-17

百度面試Android面試題08-01

2014百度android開(kāi)發(fā)類(lèi)面試題目07-20

Android開(kāi)發(fā)工程師優(yōu)秀簡(jiǎn)歷模板07-24

Android開(kāi)發(fā)工程師面試試題02-14

java工程師面試題09-25

硬件工程師面試題大全07-20

測(cè)試工程師面試題07-25