1、寫出幾種常見的設計模式,並詳細列舉出一種。前端
單例模式、建造者模式、適配器模式、裝飾模式、模板方法模式、觀察者模式
餓漢模式java
· 懶漢模式
android
· 懶漢線程安全sql
2、描述下tcp接收數據的過程。數據庫
· 第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認
· 第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求創建鏈接,Server將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認鏈接請求,Server進入SYN_RCVD狀態
· 第三次握手:Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,若是正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否爲K+1,ACK是否爲1,若是正確則鏈接創建成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間能夠開始傳輸數據了後端
3、xml的幾種解析方式,並寫出他們的優缺點。設計模式
Dom解析:將XML文件的全部內容讀取到內存中(內存的消耗比較大),而後容許您使用DOM API遍歷XML樹、檢索所需的數據
因爲DOM在內存中以樹形結構存放,所以檢索和更新效率會更高。可是對於特別大的文檔,解析和加載整個文檔將會很耗資源。數組
Sax解析:Sax是一個解析速度快而且佔用內存少的xml解析器,Sax解析XML文件採用的是事件驅動,它並不須要解析完整個文檔,而是按內容順序解析文檔的過程
SAX解析器的優勢是解析速度快,佔用內存少。很是適合在Android移動設備中使用。緩存
Pull解析:PULL解析器的運行方式和SAX相似,都是基於事件的模式。不一樣的是,在PULL解析過程當中,咱們須要本身獲取產生的事件而後作相應的操做,而不像SAX那樣由處理器觸發一種事件的方法,執行咱們的代碼。PULL解析器小巧輕便,解析速度快,簡單易用,很是適合在Android移動設備中使用,Android系統內部在解析各類XML時也是用PULL解析器。
PULL解析器小巧輕便,解析速度快,簡單易用,很是適合在Android移動設備中使用,Android系統內部在解析各類XML時也是用PULL解析器。安全
4、什麼是JSON解析
一對」[]「表示一個數組,「[]」中間每個「{}」都是數組的一個元素。
{}表示一個對象,{}內每個」:」和其先後組成對象的一個屬性:」age:18「
String str=」{‘class’:’1’,‘students’:’[{‘name‘:’張三’,‘age’:‘12’,’sex‘:’男‘},{’name‘:’李四’,‘age‘:’13‘,’sex‘:‘女’}]‘}」
5、Java中的JVM和Android中的DalvikVM有什麼區別
一、Dalvik 基於寄存器,而 JVM 基於棧。基於寄存器的虛擬機對於更大的程序來講,在它們編譯的時候,花費的時間更短。
二、Dalvik主要是完成對象生命週期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
三、Dalvik負責進程隔離和線程管理,每個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。
四、不一樣於Java虛擬機運行java字節碼,Dalvik虛擬機運行的是其專有的文件格式Dex,ex文件格式能夠減小總體文件尺寸,提升I/o操做的類查找速度。
五、全部的Android應用的線程都對應一個Linux線程,虛擬機於是能夠更多的依賴操做系統的線程調度和管理機制。
6、簡述SharedPreference的使用,並說明存儲位置。
SharedPreferences是一種輕型的Android數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,一般用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象自己只能獲取數據而不支持存儲和修改,存儲修改是經過Editor對象實現。
7、簡述Android中sqlite數據庫操做方法,並寫出方法名字和方法內作哪些操做
在android中當須要操做SQLite數據庫的時候須要獲得一個SQLiteOpenHelper對象,而SQLiteOpenHelper是一個抽象類,用戶須要繼承這個類,並實現該類中的一些方法。
getReadableDatabase() 建立或者打開一個查詢數據庫
getWritableDatabase()建立或者打開一個可寫數據庫
他們都會返回SQLiteDatabase對象,用戶經過獲得的SQLiteDatabase對象進行後續操做
onCreate(SQLiteDatabase):在數據庫第一次建立的時候會調用這個方法,通常咱們在這個方法裏邊建立數據庫表。
onUpgrade(SQLiteDatabase,int,int):當數據庫須要修改的時候,Android系統會主動的調用這個方法。通常咱們在這個方法裏邊刪除數據庫表,並創建新的數據庫表,固然是否還須要作其餘的操做,徹底取決於應用程序的需求。
8、Activity生命週期
· onCreate()
· onStart()
· onResume()
· onPause()
· onStop()
· onDestroy()
· onRestart()
9、Activity啓動模式
· Standard:默認模式,能夠不用寫配置。在這個模式下,都會默認建立一個新的實例。所以,在這種模式下,能夠有多個相同的實例,也容許多個相同Activity疊加。
· Singletop:能夠有多個實例,可是不容許多個相同Activity疊加。即,若是Activity在棧頂的時候,啓動相同的Activity,不會建立新的實例,而會調用其onNewIntent方法。
· Singletask:只有一個實例。在同一個應用程序中啓動他的時候,若Activity不存在,則會在當前task建立一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。
· Singleinstance:只有一個實例,而且這個實例獨立運行在一個task中,這個task只有這個實例,不容許有別的Activity存在。
10、String和StringBuffer、StringBuilder的區別
一、可變性
String類是用字符數組保存字符串,即private final char value[],因此String對象不可變
StringBuffer類與StringBuilder類都是繼承AbstractStringBuilder類,AbstractStringBuilder是用字符數組保存字符串,即char value[],因此StringBuffer與StringBuilder對象是可變的
二、線程安全性
String類對象不可變,因此理解爲常量,線程安全
StringBuffer類對方法加了同步鎖,線程安全
StringBuilder類對方法未加同步鎖,線程不安全
三、性能
String類進行改變的時候,都會產生新的String對象,而後將指針指向新的String對象
StringBuffer進行改變的時候,都會複用自身對象,性能比String高
StringBuilder行改變的時候,都會複用自身對象,相比StringBuffer能得到10%~15%左右的性能提高,可是得承擔多線程的不安全的風險
11、進程和線程的區別
進程:
進程之間不共享任何狀態,進程的調度由操做系統完成,每一個進程都有本身獨立的內存空間,進程間通信主要是經過信號傳遞的方式來實現的,實現方式有多種,信號量、管道、事件等,任何一種方式的通信效率都須要過內核,致使通信效率比較低。
線程:
線程之間共享變量,解決了通信麻煩的問題,可是對於變量的訪問須要鎖,線程的調度主要也是有操做系統完成,一個進程能夠擁有多個線程,可是其中每一個線程會共享父進程像操做系統申請資源,這個包括虛擬內存、文件等,因爲是共享資源,因此建立線程所須要的系統資源佔用比進程小不少,相應的可建立的線程數量也變得相對多不少。線程時間的通信除了可使用進程之間通信的方式之外還能夠經過共享內存的方式進行通訊,因此這個速度比經過內核要快不少。另外在調度方面也是因爲內存是共享的,因此上下文切換的時候須要保存的東西就像對少一些,這樣一來上下文的切換也變得高效。
12、什麼是反射,及使用步驟
在運行狀態中,對於任意一個類,均可以得到這個類的全部屬性和方法,對於任意一個對象,都可以調用它的任意一個方法和屬性
步驟:
1. 獲取類的字節碼(getClass()、forName()、類名.class)
2. 根據類的方法名或變量名,獲取類的方法或變量
3. 執行類的方法或使用變量,若是不使用,也能夠建立該類的實例對象(經過獲取構造函數執行newInstance方法)
13、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
不能,一個對象的一個synchronized方法只能由一個線程訪問。
14、是否能夠繼承String類?
String類是final類故不能夠繼承。
15、List, Set, Map是否繼承自Collection接口?
List,Set是,Map不是
16、String s = new String(「xyz」);建立了幾個String Object?
兩個
17、final, finally, finalize的區別。
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示老是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。
Collection 和 Collections的區別。
Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。
18、談談android大衆經常使用的五種佈局。
19、Adapter有什麼做用?常見的Adapter有哪些?
Adapter是鏈接後端數據和前端顯示的適配器接口。常見的Adapter有ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter等
20、ListView的優化方案
一、若是自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否爲null,若是爲null就建立contentView並返回,若是不爲null則直接使用。在這個方法中儘量少建立view。
二、給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,能夠達到圖像數據異步加載的效果。
三、若是listview須要顯示的item不少,就要考慮分頁加載。好比一共要顯示100條或者更多的時候,咱們能夠考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。
21、請介紹下Android的數據存儲方式。
一.SharedPreferences方式
二.文件存儲方式
三.SQLite數據庫方式
四.內容提供器(Content provider)方式
五. 網絡存儲方式
22、請寫出你最多見到的5個runtime exception。
NullPointerException - 空指針引用異常 ClassCastException - 類型強制轉換異常。 IllegalArgumentException - 傳遞非法參數異常。 ArithmeticException - 算術運算異常 IndexOutOfBoundsException - 下標越界異常 NumberFormatException - 數字格式異常 SecurityException - 安全異常 FileNotFoundException - 文件未找到異常 IOException - 輸入輸出異常 NoSuchMethodException - 方法未找到異常