1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. Android工程師面試問題應(yīng)對法案

        時間:2020-10-18 10:49:23 面試問題 我要投稿

        Android工程師面試問題應(yīng)對法案大全

          下面對這段時間面試遇到的問題進(jìn)行整理,分享給大家供大家參考,具體內(nèi)容如下

        Android工程師面試問題應(yīng)對法案大全

          Java基礎(chǔ):

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

          1)、資源對象沒關(guān)閉。

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

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

          2)、使用Adapter時,沒有使用系統(tǒng)緩存的converview。

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

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

          BitmapFactory.Options options = newBitmapFactory.Options(); options.inSampleSize = 2;//圖片寬高都為原來的二分之一,即圖片為原來的四分之一 Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);

          4)、使用application的context來替代activity相關(guān)的context。

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

          5)、注冊沒取消造成內(nèi)存泄露

          如:廣播

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

          7)、Handler應(yīng)該申明為靜態(tài)對象, 并在其內(nè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的區(qū)別

          ArrayList初試大小為10,大小不夠會調(diào)用grow擴(kuò)容:length = length + (length >> 1) LinkedList中Node first,last。分別指向頭尾

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

          1)、對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內(nèi)部數(shù)組中增加一項,指向所添加的元素,偶爾可能會導(dǎo)致對數(shù)組重新進(jìn)行分配;而對LinkedList而言,這個開銷是 統(tǒng)一的,分配一個內(nèi)部Entry對象。

          2)、在ArrayList的 中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。

          3)、LinkedList不 支持高效的隨機(jī)元素訪問。

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

          可以這樣說:當(dāng)操作是在一列 數(shù)據(jù)的后面添加數(shù)據(jù)而不是在前面或中間,并且需要隨機(jī)地訪問其中的元素時,使用ArrayList會提供比較好的性能;當(dāng)你的操作是在一列數(shù)據(jù)的.前面或中 間添加或刪除數(shù)據(jù),并且按照順序訪問其中的元素時,就應(yīng)該使用LinkedList了。

          3、hashmap和hashtable的不同

          1)、繼承不同。

          public class Hashtable extends Dictionary implements Mappublic class HashMap extends AbstractMap implements Map

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

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

          在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應(yīng)的值為null。當(dāng)get()方法返回null值時,即可以表示 HashMap中沒有該鍵,也可以表示該鍵所對應(yīng)的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應(yīng)該用containsKey()方法來判斷。

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

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

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

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

          4、Iterator和Enumeration的不同

          1)、函數(shù)接口不同

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

          2)、Iterator支持fail-fast機(jī)制,而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機(jī)制的:當(dāng)多個線程對同一個集合的內(nèi)容進(jìn)行操作時,就可能會產(chǎn)生fail-fast事件。

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

          5、接口的注意點

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

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

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

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

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

          6、final方法

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

          Android知識點

          1、Handler機(jī)制

          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。

          構(gòu)造器如下:

          private Looper(){ mQueue = new MessageQueue(); mRun = true; mThread = Thread.currentThread();}

          3)、loop()函數(shù)

          1)從Looper中取出MessageQueue;

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

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

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

          4)、Handler對象

          重要成員變量:

          final MessageQueue mQueue;final Looper mLooper;final Callback mCallback; //用于回調(diào)

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

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

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

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

          2、Android啟動模式

          standard和singleTop模式。

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

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

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

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

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

          singleInstance:單實例模式。

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

          注:在任何跳轉(zhuǎn)的時候,首先調(diào)用本Activity的onPause,然后跳轉(zhuǎn)。如果被跳轉(zhuǎn)的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。

          以上是我遇到和搜集到的各類題目以及相應(yīng)的解答,接下來一段時間也會持續(xù)更新,希望大家繼續(xù)關(guān)注。

          也祝愿大家可以找到自己喜歡的工作。

        【Android工程師面試問題應(yīng)對法案大全】相關(guān)文章:

        應(yīng)對棘手問題面試技巧11-14

        外企英語面試怎樣應(yīng)對問題12-09

        面試應(yīng)對問題的秘訣3篇02-28

        面試經(jīng)典問題及應(yīng)對方法12-31

        應(yīng)對面試經(jīng)典問題的方法12-14

        如何應(yīng)對面試中的問題08-24

        面試前突發(fā)問題如何應(yīng)對01-03

        如何應(yīng)對面試中最難的問題01-13

        女性職場面試如何應(yīng)對敏感問題12-18

        教你應(yīng)對“五大”面試必問題12-14

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>