android面試題(一)
自己總結了一些android的面試題,先寫一部分,後續在補充
一、Android的四大元件是哪些?它們的作用是?
答:Activity是android程式和使用者互動的介面,相當於單獨的螢幕,需要為保持各介面的狀態做很多持久化的事情,管理生命週期和一些邏輯跳轉。
Service是一段長生命週期,沒有使用者介面的程式。可以一直在後臺執行,也可以跨程序訪問。
Content Provider:當開發者需要將應用資料與其他應用進行共享時,是Android提供的一個修改、增加、刪除、查詢外部資料的功能的中間層。是Android提供的第三方應用資料的訪問方案,可以派生ContentProvider類,對外提供資料,可以像資料庫一樣進行選擇排序。
BroadCast.Receiver:希望開發者的應用能對外部事件做出相應,在事件發生時做一些簡單的處理,轉換成一臺Notification。接受一種或者多重呢Intent作觸發事件。
二、請簡單介紹一些android中常用的五種佈局?
FrameLayout: (框架佈局)所有的東西都依次放在左上角,會進行重疊。
LinearLayour:(線性佈局)可分為垂直佈局和水平佈局,當只有一行時垂直(從上往下)水平(從左往右)
AbsoluteLayour:(絕對佈局)使用xy座標指定元素的位置,但是這種佈局在螢幕旋轉時會出問題
RelativeLayout :(相對佈局)以某一個元素為參照物,進行佈局相對於某一個元素:layout_below layout_toleftof layout相對於父元素layout_alignparentLeft
TableLayout:(表格佈局)以行列劃分。
三、Android中的動畫元素有哪些?其特點和區別?
Frame動畫(幀動畫): 由圖片組成,為傳統的動畫。通過播放排列好的圖片來實現。
Tween動畫(補間動畫):可以使元件移動、放大、漸變。
四、Android中有哪幾種方式來解析xml?官方推薦? 以及他們的原理和區別?
SAX:基於時間的解析器。流程是從檔案的開始解析到檔案的結束,不能暫停或者倒退
優點:不佔記憶體空間,解析屬性方便;缺點:不記錄標籤的屬性關係。在手機和敏感資料庫使用
DOM:將整個XML載入到記憶體中去,在PC機上使用的比較的多。
PULL:執行與SAX類似,都是基於事件的模式,不同於在於返回數字,且需要我們自己獲取產生的事件然後解析。SAX是由觸發器。
五、List的優化方案?
if(converview==null){
itemview = View.inflate(this,view1,view2,null);
holter = new Holder();
item .setTag(holter);
}else{
Itemview= converview;
Holder=(viewHolder)itemview.getTag();}
一層優化:判斷contentview是否為空。儘可能少的建立view
二層優化:給contentview設定setag(),傳入一個viewholder物件,用於快取要載入的資料,達到影象非同步載入的效果。減少findbyid
三層:進行分頁顯示
六、介紹android的資料儲存方式?
□SharedPreferences:是android提供的一些簡單配置資訊的一種機制。採用的Map資料結構來儲存,進行簡單的讀寫。
獲取SharedPreference的兩種方式:
- 呼叫context物件的getsharedPrederenes()方法,在統一程式下的其他元件所共享
- 呼叫Activity物件的getpreferences()方法,只能在該Avtivity中使用
四種模式:
- Context.MODE_PRIVATE:為預設的模式,檔案是私有資料,寫入的內容覆蓋原檔案的內容。
- Context.MODE_APPEND:會檢查檔案是否存在,存在追加,部存在就建立。
- Context.MODE_ WORLD_READABLE:表示當前檔案可以被其他應用程式進行讀。
- Context.MODE_ WORLD_WRITEABLE:表示當前檔案可以被其他應用程式進行讀。
例項化:
SharedPrefence .Editor = myshared .edit();
editor.putString();
editot.commit();
先呼叫edit使其進入編輯狀態,使用xml進行儲存,檔案在file explorer 中的/data/date/<package name >/shares_prefs下。且只能在同一個包中使用。
□檔案儲存:與java中的機制一樣。使用file
FileInputStrea fis =openFileInput(); FileOutputStrea fos =openFileOutput();
□網路儲存資料
呼叫WebService返回的資料或者解析HTTP協議實現網路資料互動。
□ContentProvider:四大元件之一,用與應用程式之間共享資料。統一的資料訪問的方式
七、ConrentProvider的使用簡介
基礎:首先需要獲得一個ConrentResolver的例項通過Acrtivity的成員的getContentResolver()方法得到。例項自帶的方法可以找到指定的Content provider方法並且獲取到,通過ConrentResolver代理,使用者不能訪問。每一個Content provider都有一個公共的uri,用於表示這個Content provider所提供的資料。Content provider的每一行都帶有一個唯一值的數字欄位,名為_id
建立:繼承Content Ptovider類,實現query,inset,update等方法
宣告:在manifest中宣告。
查詢:想使用一個Content Ptovider需要的資訊有○定義這個Content Ptoviderde 的uri返回結果的欄位名稱,以及這些資料型別○如果需要查詢Content Ptovider資料集的特定記錄行,需要知道該記錄的id,沒有加id會得到多行資料
構建查詢:輸入uri的引數,能夠找到uri對應的Content Ptovider,則返回一個cursor物件,通過ContentResolver.Query()或者activity.manageQuery()實現(能夠管理生命週期,與activity相同)。
Cursor cur = managedQuery(uri,null,null…);
或則使用withAppendedId進行拼接
Uri uri = contentUri. withAppendedId(people.CONTENT_URI,23); people.CONTENT_URI是uri常量.
修改:使用ContentValue
Uri簡介:“conrent://主機名/路徑”
主機名錶示唯一表示這個Content provider,在《provider》中定義。
路徑表示我們要操作的資料,例如操作contact表中id為10的jiljk。 /conract/10
將一個字串轉換成uri,Uri uri = Uri.parse(“”);
八、Activity的啟動模式有哪些?是什麼含義?
Standard:預設的啟動模式,每一個例項處理一個Intent,總是新建例項;
SingleTop:如果被啟動的Activity已經在棧頂,則將例項傳給他onNewIntent,否則新建例項。
SingleTask:單例項總是把activity作為一個task的根元素,允許有其他的activity在task。
SingleInstance:與singleTsak相同,但是不允許有其他的activity在task中。
九、跟activity和task有關的intent啟動方式有哪些?其含義?
FLAG_ACTIVITY_NEW_TASK:首先會查詢是否存在和被啟動的Activity具有相同親和性的任務,(即taskAffinity,注意同一應用程式中的activity的親和性一樣)如果有則把這個棧直接整體移到前臺,並保持其中的順序不變,如果沒有則新建一個棧來存放被啟動的activity。且如果啟動的activity正在執行則不會為其新建,而是將原有的包含activity的task返回到前臺,其中順序不變。
FLAG_ACTIVITY_CLEAR_TOP:如果設定,並且這個ativity已經在當前的task中執行,因此不再重新啟動一下這個activity的例項,而是將這個activity上方的所有activity都將關閉,然後這個intent會作為一個新的intent投遞到老的activity中。
十、activity在螢幕旋轉時的生命週期
不設定activity的android:configChange時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
設定android:configChange=“orientation”時,都只重新呼叫一次。
設定android:configChange=“orientation|keyboardhidden”不會重新呼叫各個生命週期,只會執行onconfigurationchanged方法。
如何啟動Service,如何停用Service。
第一步:繼承service類
第二步:在manifest中的《application》宣告
第三步:進行啟動
Cotext.startService():與呼叫者沒有關聯,一旦執行則一直執行,在服務未被建立之前就呼叫oncreate(),如果呼叫的服務已經存在,不會導致多次建立服務,但會導致多次呼叫onstart();
Context.bindService():與呼叫者的生命週期相同,不會多次呼叫oncreate()和onbind();橫豎屏切換時,之前使用的bindservice則會斷開
十四、解釋單執行緒模式中的Message、Handler、Message Queue 、Looper之間的關係?
Meaage:理解為執行緒間的交流資訊,處理資料後臺執行緒需要更新的UI,則傳送Message內含一些資料給UI執行緒。獲取例項最好的方法是呼叫Message.obtain()或者是Handler.message(),因為是型回收池獲取。儘管他的構造方法是public。
Message Queue:訊息佇列,用來存放通過Handler釋出的訊息。按照先進先出執行。Message不是直接加到一個MessageQueue中,而是通過MessageQueue.idlehandler關聯到looper。可以通過looper。Myqueue從當前的執行緒中獲取。每個訊息佇列對應一個Handler。它象訊息佇列傳送訊息的兩種方法:sendMessage和post。SendMessage傳送一個Meaage,由handler的handlermeaager()執行。二post傳送的是一個runnable,自己執行。
Looper:是每條執行緒裡面的管家。
他們之間的關係:handler獲取當執行緒中的looper物件,looper用來從存放的message的messageQueue中取出Message,再有handler進行message的分發和處理。
十五、簡單解釋intent?
Intent:不同元件之間相互通訊的紐帶,封裝的不同元件之間的通訊的條件,用於儲存和傳輸各種資料。
activity的使用:使用StartActivity(),StartActivityForResult();傳遞給一個activity
service的使用:傳給onstar(),onBind();
Broad Receiver:傳給onReceive();
Intent的使用:setClass();putExtra();
十六、說說MVC的 原理,在android中的應用?
Model:模型,業務邏輯層,對資料庫、網路的操作、還有演算法等計算。
View:檢視層,負責使用者的介面,一般是xml檔案。
Control:控制層,是根據使用者的輸入,控制使用者介面的資料顯示及更新Model物件的狀態。Dao。
十七、什麼是ANR?如何避免它?
Application Not Responding(應用無響應):活動管理器和視窗管理器負責監視應用程式的響應,當用戶操作5s內應用程式不能做出反應,BroadcastReceiver在10秒內沒有執行完畢,機會出現ANR提示。
避免:在activity的關鍵生命週期內儘可能少的去做建立操作、潛在的耗時操作、網路,資料庫操作,耗時的計算應該在子執行緒中完成,執行緒應該為子執行緒提供一個Handler,以便完成時能提交給主執行緒。
十八、什麼情況下會導致Force Close?如何避免?如何捕捉異常?
答:程式出現異常時,例如空指標。在logcat中能夠看到
十九、描述一下android的系統框架
答:4個層次,從上往下為:
Linux核心層(Linux Lernel):由c語言實現,硬體和團建之間的抽象層,裡面包含各種驅動。
系統執行庫(Linbraries):由c/c++實現,通過android應用程式框架為開發者提供服務。由D埃裡克Java虛擬機器和java類庫組成。
Android應用框架層(application framework):程式所使用的api
Android應用程式層(applications):是應用程式層,用java編寫。
二十、如果後臺的activity由於某種原因被系統回收了,如何在被系統回收之前儲存當前的狀態?
答:重寫OnSaveInstaceState(),儲存需要儲存需要儲存的資料,他會在系統回收activity之前被呼叫。
二十一、如何將acrivity設定成視窗的樣式?
答:在<activity>中配置,android:theme=“@android:style/theme.Dialog”;
另外android:theme=”@android:style/theme.translucent”設定為透明
二十二、如何退出activity?如何安全退出以呼叫多個activity的application?
單一的activity:退出activity的方法:finish(),killprocess(),system.exit();
多個activity:◎記錄開啟的activity,在退出的時候關閉。◎傳送特定的廣播,收到廣播的activity退出。◎遞迴退出:使用startActivityForResult(),在其中呼叫函式。
二十三、AIDL的全稱是什麼?
答:Android的介面描述語言,用於跨程序通訊。
如果需要在一個activity中,訪問另一個Service中的某個物件,需要先將物件轉化成AIDL可識別的引數,然後使用AIDL來傳遞這些引數,在訊息的接受端,使用這些引數組裝成自己需要的物件。
序列化:將傳輸的資料轉化為能夠在記憶體之間流通的形式。
二十四、Service和Thread的區別?
Thread:是程式執行的最小單位,用來執行一些非同步操作,獨立於Activity執行,當一個activity被finish()後,如果沒有主動停止Thread或者Thread.run方法裡面的東向沒有執行完,則Thread會一直執行。而且當activity被結束之後就不在持有Thread的引用,沒有辦法在不同的Activity對同一thread進行控制。
Service:是android的一種機制。可以被不同的元件來控制。
二十五、請解釋android程式執行時權與檔案系統許可權的區別?
答:執行時許可權:Dalvik(指apk在執行時所獲取到的許可權)
檔案系統許可權: 是指相應的使用者或者組對於某一個檔案的讀寫執行許可權
二十七、android dvm程序和linux的程序,應用程式的程序是否為同一個概念?
答:dvm指的是dalivk的虛擬機器,每一個android應用程式都在它自己的程序中執行,都有一個獨立的dalvik虛擬機器例項。而每一個dvm都是在linux中的一個程序,所以說可以是同一個概念。
二十八、NDK是什麼?
答:NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將SO和JAVA 應用打成apk包。NDK集成了交叉編譯器,並提供了相應的mk檔案盒隔離cpu、平臺等差異,開發人員只需簡單的修改mk檔案就可以創建出so。
二十九、android的記憶體回收?
按照優先順序釋放無用的程序,在記憶體不夠的時候,釋放掉那些不要了的程序。
三十、儲存Activity的執行狀態?
呼叫onSaveInstanceState()
※當activity物件被暫停或者停止時,任然儲存在記憶體裡面,關於他的成員資訊和當前狀態都是活動的,此時可以進行狀態的儲存,
※當系統回收回收記憶體而將activity銷燬時,就無法儲存其狀態,所以需要呼叫onSaveIntanceState儲存
三十二、Java中的==和equals和哈市Code的區別?
==:基本型別的比較:比較值
物件的比較:比較記憶體地址
equals:重寫了此方法,比較物件的內容是否相同
三十三、String 、StringBuffer、 StringBuilder的區別?
String:字元常量,不適用與經常要改變值的情況,每一次的改變相當於新生成一個新的變數
StringBuffer:字串變數,執行緒比較安全
StringBuilder:字串變數,在單執行緒下效率比較高,執行緒不安全
三十四、什麼是內部類?內部類的作用?
內部類可以直接訪問外部類的屬性,java中的內部類主要分為成員內部類、區域性內部類,匿名內部類,靜態內部類。
內部類最吸引人的地方在於:每個內部類都能獨立地繼承一個介面的實現,無論外圍類是否已經繼承了某個介面的實現,對於內部類都沒有影響。
三十五、程序和執行緒的區別?
※程序是cpu資源分配的最小單位,執行緒是cpu的最小單位※程序之間不能共享資源,而執行緒共享所線上程的地址空間好和其他資源。※一個程序裡面可以擁有多個執行緒,程序可以開啟程序,也可以開啟執行緒。※一個執行緒屬於一個程序,執行緒可直接使用程序的資源,執行緒依賴於程序存在
二十六、final、finally、finallize的區別?
final:用於修飾類,成員變數和方法,類不可被繼承,成員變數不可以改變,成員方法不可以重寫
finally:與try—catch共同使用,確保無論是否出現異常都能夠被呼叫
finalize:類的方法,垃圾回收之前會呼叫此方法,子類可以重寫此方法實現對資源的回收。
三十七、Serializable和Parcelable的區別?
Serializeble是java序列化介面,在硬碟上讀寫過程中有大量臨時變數的產生,內部執行大量的i/o操作,效率比較的低。
Parcelable:是android的序列化介面,效率高,使用麻煩,在記憶體中讀寫,物件不能儲存在磁碟中。
三十八、string轉換成integer的方法及原理?
String->integer intrger.parseint(string);
Integer-> integer.toString();
三十九、JDK是什麼?JRE是什麼?
JDK:java開發工具包。 JRE:java執行時環境
四十、什麼是java的平臺無關性?
Java 原始檔被被編譯成位元組碼的形式,無論在什麼系統環境下面,只要有java虛擬機器就能執行這個位元組碼檔案。
四十一、在一臺電腦上配置java環境,path起什麼作用?如何配置?
在dos環境下面,能在任意位置使用jdk目錄中的bin資料夾中的可執行檔案,用來執行java程式、
在環境變數中找到path變數,把bin資料夾的絕對路徑加上
四十二、什麼是隱式型別轉換?什麼是顯示型別轉換?
當佔位數少賦值給佔位數多的,java自動隱式轉換,反之為顯示轉換
四十三、什麼是類方法和類成員?
使用static修飾的成員變數和成員方法
四十四、什麼是方法過載?
是指一個類中可以有多個方法具有相同的名字,但這些方法的引數個數或者型別不一樣。
四十五、什麼是拆裝箱?
拆:把包裝型別轉換成基本資料型別。裝:把基本型別轉換成包裝資料型別
四十六、java中有沒有指標?
有,但是被隱藏了,開發人員無法直接進行操作,由jvm來操作
四十七、Statice關鍵字的作用?
修飾方法時:方法屬於當前類,使用類名來呼叫。不能再該方法中使用this或者super關鍵字
修飾變數時:被所有的例項共享,共同使用一塊記憶體區域。
修飾程式碼塊:用來做程式優化,只會執行一次,在例項化之前已經分配的區域。
四十八、string str= “aa” string str = new string(“aa”);一樣嗎?
不一樣,前者分配在常量池中,後者分配在堆記憶體中。
四十九、面向物件的特徵有哪些方面?
抽象(關注物件的屬性和行為,將一類物件的共同特徵總結出來構造類的過程),繼承、封裝(將資料和操作資料的方法繫結起來)、多型性(允許不同字型別的物件對同一訊息作出不同的響應)
五十、多型要做的兩件事情:方法重寫、物件構造(使用父類的引用呼叫子類的例項)
五十一、訪問修飾符的區別?
作用域 |
當前類 |
包 |
子類 |
其他 |
Public |
√ |
√ |
√ |
√ |
Protected |
√ |
√ |
√ |
∕ |
Default |
√ |
√ |
∕ |
∕ |
private |
√ |
∕ |
∕ |
∕ |
&和&&的區別?
位運算和邏輯運算。邏輯運算有短路效果
五十四、解釋記憶體中棧(stack)和堆(heap)和靜態儲存區的用法?
答:定義基本型別的變數,物件的引用,函式的呼叫的現場儲存使用內空間中的棧(操作塊,記憶體小),new和構造一個物件使用堆空間(大的物件在堆空間,整個硬碟的虛擬記憶體),放在靜態儲存區
補充:String str = new String(“HELLO”); 堆:str 靜態:HELLO
五十五、Math.round(),的四捨五入是加上0.5以後進行向下取整
五十六、陣列有沒有length()方法?String有沒有?
陣列有length屬性,string有
五十七、equsls滿足的規律?
自反性(x.equals(x)==true)、傳遞性(x.equals(y), y.equals(z), z.equals(z))、對稱性(x.equals(y), y.equals(x))、一致性x.equals(null)==false/
五十八、String是final類,不可以被繼承
五十九、兩個字串在靜態儲存區已經存在,使用+比使用StringBuffer要高效
六十、為什麼不能根據返回值來區分過載?
因為呼叫時不能指定型別資訊沒編譯器不知道要呼叫哪個函式。例如float max(); int max();當呼叫max時不知道要呼叫哪一個.
六十一、char能不能儲存一箇中文字元?
java中char能夠儲存一箇中文字元:因為採用unicode編碼,char 2位元組,轉移到外部的是夠InputStreamteader是位元組流之間的介面卡,承擔了編碼的轉換任務、
六十二、抽象類和介面有什麼異同?
同:都不可以被例項化,一個類如果繼承了某個介面或者某個抽象類,則需要實現其中的抽象方法,否則還是抽象類。
異:抽象類中可以定義構造類,可以定義變數和其他的方法,可以使用修飾符、介面中只能有抽象方法。為public,成員都是常量。
六十三、靜態巢狀類和內部類的不同?
靜態巢狀類可以不依賴外部類被例項化,內部類需要在外部類例項化後才能被例項化。
六十四、java中會存在記憶體洩露嗎?
Java有回收機制理論上是不會的,但是在實際開發中也會存在無用但是可達的物件。例如hiberbate中的session中的物件屬於持久態,垃圾回收機制是不會回收這些物件的,但是這些物件中也有可能存在無用的物件、
六十五、抽象的方法是否可同時是靜態,是否同時是本地法,是否可同時被synchronized修飾?
答:不可以是靜態的,抽象方法需要子類進行重寫,而靜態方法是不可以進行重寫的。不是本地方法,抽象方法在本地類中是沒有實現的,synchronized也與具體的實現細節有關。
六十六、是否可以從一個靜態方法內部對非靜態方法呼叫?
不可以,因為靜態方法可以在物件例項化之間進行呼叫,而非靜態方法是必須等物件例項化之後由物件進行呼叫
六十七、GC是什麼?為什麼要有GC?
答GC是垃圾回收的意思,記憶體處理時程式設計人員最容易出問題的地方,忘記或者錯誤的回收垃圾都有可能造成系統的奔潰。Java的gc功能可以自動的檢測物件是否需要進行回收。
六十八、資料型別之間的轉換。
String-基本資料型別 呼叫型別包裝類的parsexxx或者valueof
基本資料型別-string 呼叫string的valueof或者基本資料型別+“”
六十九、Error和Exception有什麼區別?
Error表示系統級的錯誤和程式不必處理的錯誤,是恢復起來很困難的一種嚴重錯誤。比如記憶體溢位。
Exception:表示需要捕捉或者需要程式進行處理的異常。
七十、try(含return)與finally執行過程?
遇到try中的return時,會臨時儲存return的值,然後跑去執行finally中的語句。Finally中的語句表示一定會被執行的語句。
七十一、如何建立一個物件?
- 使用new運算子和類的構造方法分配記憶體,如果沒有構造方法則使用預設的構造方法
七十二、為什麼可以直接使用類來呼叫類成員和類方法?
當類被載入到虛擬機器的時候,類成員變數就被分配內訓,類方法就被分配地址,所以不用建立物件。
七十三、簡述super關鍵字的作用?
1呼叫父類的構造方法 3呼叫父類隱藏的成員變數和成員發放
七十四、上轉型物件可以操作什麼?不可以操作什麼?它是什麼?
上轉型:是指a類是b類的父類,使用b類建立一個例項,在a類中引用b類的例項,則稱a類是b類物件的上轉型物件
可以操作:子類繼承或者重寫的一些成員變數和方法
不可以操作:子類新增的一些成員變數和成員方法
七十五、char陣列和byte陣列如何轉化成string字串:使用string的構造方法
七十六、已知一個date物件,如何對其進行格式化?
SimpleDateFormat formate = new SimpleDateFormat(“格式”);
Formate.format(new date())
七十七、如何商城一個0-100的隨機整數:(int ) (Math.random()*100)
七十八、簡述try,catch,throw.throws.finally
Try:保護程式碼,如果try中的程式碼出現異常則程式碼不在繼續執行 Catch:捕捉異常,按照順序執行 Throw:丟擲異常 Throws:宣告異常 Finally:無論是否出現異常都會執行
七十九、什麼是i/o流,其作用?
是指資料輸入輸出六,i/o流提供一條通道程式,可以使用這條通道把源中的資料送到目的地
八十、實現多執行緒的兩種方法?
從thread中派生一個新的執行緒類,重寫run方法
實現runnable介面,實現run方法
八十一、執行緒同步?
使用同步方法:synchronized void kkk(){}
使用同步程式碼塊:synchronized(obiect){}
八十二、Throw和Trows的區別?
Throw寫在程式碼塊中,throw都免跟的是一個具體的異常例項
Throws寫在方法的前後,後面跟的是異常類,可以跟多個
八十二、什麼是關係型資料庫?
所謂關係新資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是指由二維表格組成。
八十三、主鍵:能否唯一的確定表中的某個記錄
八十四、外來鍵:用於強制參照完整性
八十五、主外來鍵關聯的作用:保證資料的完整性,消除資料冗餘
八十六、資料庫:指長期儲存在計算機內。有組織的、可以共享的資料集合
八十七、DDMS(資料庫管理系統):把使用者意義下的抽象的邏輯資料轉化成計算機中具體的物理資料處理的軟體
八十八、靜態代理和動態代理的區別,什麼場景使用?
靜態代理類:有程式設計師建立或由特定的工具自動生成原始碼,在對其進行編譯,在程式執行之前,代理的class檔案就已經存在了。
動態代理:在程式執行時,運用反射機制動態建立而成的
八十九、java反射機制:是指在執行狀態中,對於任意的一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫這個物件的屬性和方法
九十、List、set、map的區別?
Set:是一種集合,介面有TreeSet(對物件進行排序),HashSer(速度比較快)
List:線性,元素可以重複:arraylist(可以改變長度,可隨機訪問,插入刪除慢),linkedlist(連結串列儲存)
Map:鍵對,Hashmap(),Lindlist
九十一、run和start的區別?
Run方法 :是thread中的一個普通可以被重複呼叫,如果主執行緒中呼叫執行緒,不會啟用新的執行緒,執行的路徑只有一條,要等run中的方法執行完畢才可以執行下面的程式碼
Start方法:不可以重複呼叫,start中run中的程式碼可以不用執行完就可以執行,
九十二、物件鎖和類鎖
在JAVA虛擬機器中,每個物件和類在邏輯上都是和一個監視器相關聯的。代表任何時候只允許一個執行緒擁有的特權。如果執行緒釋放了鎖,那麼在他釋放這個鎖之前,就沒有其他執行緒可以獲取同樣資料的鎖了。在java中使用synchronized進行標識一個監視區域。
九十三、在java中wait和sleep的區別?
Wait用於執行緒間的通訊,如果等待條件為真且其他執行緒被喚醒時,會釋放鎖。Sleep僅僅釋放cpu或者讓當前執行緒停止一段是假,但不會釋放鎖。
九十四、wait和notify
Wait:讓執行緒進行阻塞,並且釋放鎖,喚醒在等待該物件同步鎖的執行緒(多個喚醒一個)。
Notify:呼叫任意物件的notify方法則導致呼叫該物件的wait方法而阻塞的執行緒中隨機選擇一個解除阻塞(等獲取到鎖之後才可以真正的執行)
什麼導致執行緒阻塞?執行緒如何關閉?
是指程式會一直等待該方法完成期間不做其他的事情、例如:serversicker的accept方法就是一直等待客戶端連線。這裡的阻塞是指呼叫結果返回之前,當前執行緒會被掛起,直到得到結果之後才會返回。
死鎖的四個必要條件?
資源競爭(資源分配不當,資源不足)、互斥條件(一個資源被一個執行緒佔用,其他執行緒只能夠等待)、請求保持(自己有資源,還要新的資源,但是新資源被佔用,自己原本的資源不放手),不可剝奪(資源只能由自己主動釋放)
什麼是執行緒池?
建立執行緒是要花費昂貴的資源和時間,如果執行緒來了在建立執行緒那麼響應時間會變長,一個程序能夠建立的執行緒數量有限。為了避免這個問題有了執行緒池,在程式啟動的時候裡面就已經建立了若干執行緒來響應處理。有單執行緒池,數目固定和快取執行緒池。
執行緒間的通訊?
執行緒是cpu最小排程單位,在android中主執行緒不做耗時操作,子執行緒不做ui更新操作,android通訊使用handler,通過呼叫messagequeue將儲存訊息的message傳送到messagequeue中,而lopper物件不斷的呼叫loop方法,從中取出nessage交個handler
AsyncTask四個方法
是android中本身一種輕量級的非同步任務。線上程池中執行後臺任務,然後把執行的進度和最終的結果給主執行緒。內部使用thread和handler。用於執行緒更新,但是不適用於耗時的後臺任務。
OnpreExecute:在主執行緒中執行,在非同步任務之前執行
doInBackground:執行緒池中執行,執行非同步任務,呼叫publicprogress進行更新任務的進度
onProgressUpdate在主執行緒執行,用於任務進度更新
onPostExecute在主執行緒中執行,在非同步任務執行完畢之後呼叫
HttpClient和HttpUrlConnection的區別?
兩種方式都支援Http協議,都是以流的形式進行上傳下載資料,也可以說是以流的形式進行資料傳輸,還有ipv6,以及連線池的功能。HttpClient擁有很多的API,難於擴充套件,另一個比較的輕量級API少,並且能夠滿足android大部分的資料傳輸。Villey在2.3版本之前為httpClient,以後是httpUrlCnnection
Java虛擬機器和Dalbik虛擬機器的區別?
Java:基於棧,使用指令來載入和操作棧上資料,所需指令更多,執行java位元組,類編譯成.class檔案
Dakvuk:基於暫存器,執行自定義的.dex位元組碼格式,類被編譯成class檔案之後,會通過dx工具將所有的class轉換成.dex檔案,然後從中讀取位元組和指令。一個應用,一個虛擬機器例項。
Context?
Context是抽象類,翻譯為上下文,提供一些程式執行環境的基礎,兩個子類Context
Wrapper上下文的封裝類,三個子類:ContextThemeWrapper(帶主題,子類activity),service,application,ContextImpl是上下文的實現類。GetApplicationContext和getApplication是同一application型別不一樣。
Context有三種類型的的子類application,service,activity,一般是通用的,但是在彈出dialog時必須使用activity,因為android不允許activity或者dialog憑空出現。
理解activity、view、window三者之間的關係?
Activity是控制單元(工人),window承載模型(窗戶),view顯示檢視(窗花),layoutInflater(剪刀),xml圖紙。
過程:activity構造window(phonewindow)-》有一個viewroot(viewGroup)->通過addview新增view
Binder機制?
在android系統中Binder由Client、Service、ServiceManager、Binder驅動程式組成,前三者執行在使用者空間,Binder在核心空間
ServiceManager:提供輔助管理,用來管理service,向client提供查詢dervice介面的能力,service和Client是在serviceManager的基礎上進行C/S的通通訊。
Binder:將上面的四種元件聯合在一起,提供裝置檔案和使用者控制元件的互動,實現clicent和service之間的程序通訊,是核心元件,service和client通過open和ioctl檔案操作相應的方法與binder進行通訊
android記憶體洩露。
指記憶體空間不足。原因有:單例模式:將單例模式與app生命週期一致、註冊和反註冊:註冊廣播時要解綁、資源物件沒有關閉:資源不適用是呼叫close,destroy等方法釋放、集合物件沒有及時清理
最頂級的父類:Object
RecyclerView和ListView之間的區別?
RecyclerView可以完成ListView和GridView的效果,還可以完成瀑布流,同時可以設定列表的滾動方向,他的view不用開發者自己寫程式碼,系統封裝好了,可以進行區域性重新整理,提供了API來實現動畫效果。在效能上,頻繁的重新整理資料,需要新增動畫,RecyclerView有很大的優勢,如果只是普通的列表,則兩者之間差別不是很大
為什麼說Http是可靠的協議:因為http中採用tcp/ip進行資料傳輸,tcp/ip是可靠的傳輸協議
Socker建立網路連線的步驟?
建立socket連線至少需要一對套接字,其中一個執行在客戶端ClientSocket,一個執行在服務端ServiceSocket。
- 伺服器監聽:伺服器套接字處於等待連線的狀態,實時監聽網路狀態,等待客戶端的連線請求
- 客戶端請求:客戶端套接字提出連線請求,連線服務端的套接字,必須註明他要連線的伺服器
- 連線確認:當伺服器監聽到連線請求時,響應連線請求,建立一個新的執行緒,把伺服器的的描述傳送給客戶端,客戶端一旦確認描述,便建立正式的連線,而伺服器的套接字繼續處於監聽狀態、
Xutils、Okhttp、Volley、Retrofit對比
Xutils這個框架比較的全面,可以進行網路請求,進行圖片的載入、資料儲存、view的註解。對框架的依賴嚴重一旦框架出現問題呢,整個專案的影響非常的嚴重
Okhttp是android中使用現成的api進行網路請求。Http、HttpUrlConnection進行操作,是一個高效能的網路請求庫,支援同步、非同步、封裝了執行緒池,資料轉換。
Volley是谷歌推出的一套小而巧的非同步請求庫,擴充套件性很強,封裝了ImageLOader,也支援Okhttp,,不支援post傳大資料,不適合上傳檔案,適合頻繁的資料量小的網路請求。
ResSTful:封裝很強大,涉及了一堆的涉及模式,可以使用不同的http客戶端,雖然預設呢使用http,但是可以使用不同的Json Converter來序列化資料,同時提供RX Java的支援。
Volley VS Okhttp:Volley的有事在與封裝的更好,Okhttp要求有在此封裝的能力。Okhttp的效能更好。但是volley同樣支援okhttp
Android專案工程下面的assets目錄的作用是放置一些多媒體檔案。
對於一些資源以及狀態的操作儲存在OnStart()函式裡面。