JAVA1.GC是什麼? 為什麼要有GC?GC是垃圾收集的意思(Gabage Collection),記憶體處理是編程人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過範圍從而達到自動回收記憶體的目的,Java語言沒有提供釋放已指派記憶體的顯示操作方法。 2.XML包括哪些解釋技術,區別是什嗎?DOM和SAXDOM將文檔解析成一顆文檔樹,可在節點上進行遍曆、增加、修改和刪除。一次性讀入記憶體,對記憶體消耗大。SAX至上而下解析文檔,以事件進行驅動。不會一次性讀入記憶體,對記憶體消耗小,不能任意讀取節點,並且不能對節點進行增加、修改和刪除。 3.switch語句能否作用在byte上,能否作用在long上,能否作用在String上?switch能作用在byte、char、short和int上,JDK1.7後可以作用在String上。 4."=="和equals方法究竟有什麼區別?==和equals都可以比較地址。==是運算子,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字串內容。 5.構造方法能否被重寫和重載?構造方法不能被重寫但是能被重載。 6.物件導向的特徵有哪些?封裝、繼承、多態和抽象。7.抽象類別和介面的區別?1).抽象類別是abstract class修飾,介面是interface修飾。2).抽象類別可以有任意類型的屬性,介面只能有靜態常量修飾的屬性。3).抽象類別可以有普通方法和抽象法方法,介面的方法都是抽象方法。4).抽象類別和介面都不能執行個體化,但是抽象類別有構造方法,介面沒有構造方法。5).抽象類別只能單根繼承,介面可以多重實現。 8.內部類可以引用它的包含類的成員嗎?有沒有什麼限制? 可以引用。如果需要指定當前類時要用外部類.this來引用。如果引用局部變數,需要將局部變數指定為final。 9.String s = new String("xyz");建立了幾個String Object? 二者之間有什麼區別?2個對象。"xyz"建立在字串常量池中,new String()建立在堆中。 10.try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後? 會在return前執行。 11.Integer與int的區別Integer為封裝類,int是基礎資料型別 (Elementary Data Type)。封裝類擁有方法和屬性,基礎資料型別 (Elementary Data Type)不具備。封裝類可以通過intValue來轉換成基礎資料型別 (Elementary Data Type),也可以通過new Integer()將基礎資料型別 (Elementary Data Type)轉換為封裝類。在JDK1.5後,封裝類和基礎資料型別 (Elementary Data Type)可以實現自動轉換。 12.sleep()和wait()有什麼區別?sleep是Thread類的方法,wait是Object類的方法。sleep是自動喚醒,wait需要其他線程來喚醒。sleep不會釋放同步鎖,wait會釋放同步鎖。sleep可以用在任意方法中,wait只能用在同步方法或同步塊中。 13.Sleep() 不會釋放對象鎖 到時自動回復 wait()會釋放對象鎖 進入等待此對象的等待鎖定池 發出notify()方法後 才進入等待鎖定池準備對象鎖的擷取進入運行狀態 14.同步和非同步有何異同,在什麼情況下分別使用他們?同步指同一時間只能一個線程執行該方法,其他線程需要等待。非同步指多個線程可以同時執行某個方法,並共用同一資源。同步可以讓訪問的資源具有安全性,因為同一時間只能一個線程對其進行訪問。但是效率不高。非同步對訪問的資源會造成不穩定性,比如多個線程同時訪問一個資源,一個在修改、一個在刪除、一個在讀取,這樣可能會造成資源的混亂。但是由於同時運行,執行效率得到提高。 15.啟動一個線程是用run()還是start()? start()方法啟動線程,run方法是線程執行的主方法。 16.java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類別以供繼承,請說出他們分別是哪些類?java中有三種流,分別是位元組流(InputStream、OutputStream)、字元流(Reader、Writer)、物件流程(ObjectInputStream、ObjectOutputStream)。 17.位元組流與字元流的區別?位元組流用於讀取或寫出位元據,比片、影像等資料。字元流用於讀取或寫出字元資料,比如傳輸字串。所有的資料都可以通過位元組流來進行處理,不過如果是字元資料,用位元組流還需要進行轉換後傳輸,如果使用字元流可以方便資料的轉換。 18.error和exception有什麼區別?error是系統錯誤,代碼不能處理的錯誤,比如記憶體溢出、堆疊溢位等。exception是程式異常,可以通過代碼try-catch進行處理,比如null 指標異常,數組越界等。 19.談談final,finally,finalize的區別?final是修飾符,可以修飾類(不能被繼承)、屬性(常量)、和方法(不能被重寫)。finally是異常處理塊中的代碼塊,表示無論如何都會執行的代碼塊。finalize是Object類的方法,該方法在對象被記憶體回收之前執行的方法。 20.當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?如果其他方法沒有加synchronized的話是可以進入的。 21.當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?java中只有值傳遞,如果傳遞的對象,實際也是傳遞該對象的地址。 22.範圍public,private,protected,以及不寫時的區別public公用修飾符,表示任意類都可以訪問。protected為受保護的修飾符,表示同類、同包以及不同包但是父子關係的是可以訪問。不寫表示預設修飾符,或者稱為package修飾符,該修飾符表示只有同類或同包下的類可以訪問,出了這個包就不能訪問了。private為私人修飾符,表示只有同類中可以訪問,出了這個類就不能訪問了。 23.用最有效率的方法算出2乘以8等於幾 2《 3將2的二進位向左移3位。java中用<<來移位。 24.heap和stack有什麼區別。heap表示堆,stack表示棧。堆中放對象,棧中放引用變數。堆空間是一個無序的空間,棧是先進後出的結構。 25.運行時異常與一般異常有何異運行時異常是指繼承於RuntimeException的異常,這些異常在編譯時間可以不進行處理,當運行時如果出現問題才會拋出。如NullPointException、ArrayIndexOutOfBoundsException一般異常也稱為編譯時間異常,這些異常是繼承Exception但又不屬於RuntimeException的子類,如果程式中出現這些異常,在編譯時間必須進行捕獲或拋出,否則編譯無法通過。如IOException、FileNotFoundException 26.記憶體回收的優點和原理。並考慮2種回收機制Java語言中一個顯著的特點就是引入了記憶體回收機制,使c++程式員最頭疼的記憶體管理的問題迎刃而解,它使得Java程式員在編寫程式的時候不再需要考慮記憶體管理。由於有個記憶體回收機制,Java中的對象不再有"範圍"的概念,只有對象的引用才有"範圍"。記憶體回收可以有效防止記憶體泄露,有效使用可以使用的記憶體。記憶體回收行程通常是作為一個單獨的低層級的線程運行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程式員不能即時的調用記憶體回收行程對某個對象或所有對象進行記憶體回收。回收機制有分代複製記憶體回收和標記記憶體回收,增量記憶體回收。 27.描述一下JVM載入class檔案的原理機制?JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時尋找和裝入類檔案的類。 28.是否可以從一個static方法內部發出對非static方法的調用?不能,除非先建立非static方法所在類的對象。 29.什麼是java序列化,如何?java序列化? 30.使用serializable關鍵字 使用一個輸出資料流構造一個物件流程流對象 然後使用物件流程對象的writeObject()就可以將參數為obj的對象寫出 31.Anonymous Inner Class(匿名內部類)是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?匿名內部類可以繼承類或實現介面,但不是顯示的使用extends或implements來繼承或實現。 32.ArrayList和Vector的區別,HashMap和Hashtable的區別?ArrayList是JDK1.2的集合類並且線程不安全,Vector是1.0的集合類並且安全執行緒,二者用法類似。HashMap線程不安全且能放空鍵或空值,Hashtable安全執行緒且不能放空鍵或空值。 33.String 和StringBuffer有什麼差別?在什麼情況下使用它們?String字串的基本類,該字串是不可變的。StringBuffer是利用堆來儲存字串,並且可以對字串的內容進行改變。 34.new一個類對象和使用類名建立一個對象有什麼區別?二者使用時應該注意什嗎?new對象是最常見的建立對象的方式,利用類模板是通過反射來建立對象。雖然new對象時在底層也會通過類模板來建立對象,但是new對象的效率要比直接通過類模板建立對象的方式要高。但是使用類模板的方式可以讓程式的靈活性提高。 35.LinkedList和ArrayList的區別?1)LinkedList是鏈表結構的集合,ArrayList數組結構的集合。2)LinkedList在中間或前面增加或刪除資料時效率比ArrayList高。3)LinkedList在最後添加或刪除資料時效率比ArrayList低。4)遍曆資料時ArrayList效率高於LinkedList。 36.介紹JAVA開發中常用的Collection FrameWork(集合架構)?Java中集合架構分為Collection和Map介面,Collection介面下的集合每個元素都由一個值組成,Map介面下的集合類每個元素都是由索引值對組成。Collection介面下面有List和Set介面,List介面下常見的類有ArrayList、LinkedList、Vector。它們中的元素可以重複,並且是有序的。Set介面下常見的類有HashSet、TreeSet。它們中的元素不能重複,並且是無序的。 37.在異常當中 throw和throws 有什麼區別和聯絡?throw是在代碼中拋出一個異常,後面跟的是異常對象,虛擬機器運行到這裡時會立即引發一個異常。throws是寫在方法聲明上的,表示聲明該方法可能會拋出異常,後面跟的是異常類型。調用該方法的時候可以選擇處理它或繼續往外拋。 38.重載和重寫的區別重載是指在一個類中,兩個或兩個以上的方法具有相同方法名和不同參數列表,則表示這些方法為重載方法。重寫是指在父類和子類中,子類的方法和父類的方法具有相同方法名、相同參數列表、相同傳回型別、子類的存取修飾詞範圍不小於父類的存取修飾詞範圍,異常的類型和個數不大於或多於父類的異常類型和個數,則表示該方法為重寫方法。換句話說重載方法是區分同一個類中相同方法名的方法,重寫方法是找到父類相同方法名的方法並重新改變方法的行為。 Android 39.activity、Service、BroadcastReceiver的作用(android)Activity:Activity是Android程式與使用者互動的視窗,是Android構造塊中最基本的一種,它需要為保持各介面的狀態,做很多持久化的事情,妥善管理生命週期以及一些跳轉邏輯service:後台服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的指令,定義好需要接受的Intent提供同步和非同步介面BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關訊息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型 40.描述一個完整的Android activity lifecycleactivity的生命週期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory(); 41.顯式intent和隱式intent的區別是什麼(android)Intent定義:Intent是一種在不同組件之間傳遞的請求訊息,是應用程式發出的請求和意圖。作為一個完整的訊息傳遞機制,Intent不僅需要發送端,還需要接收端。顯式Intent定義:對於明確指出了目標組件名稱的Intent,我們稱之為顯式Intent。隱式Intent定義:對於沒有明確指出目標組件名稱的Intent,則稱之為隱式Intent。說明:Android系統使用IntentFilter 來尋找與隱式Intent相關的對象。 42.Android中線程同步的方法線程同步的方法可以採用同步方法和同步塊。 43.怎麼將一個Activity封裝成對話方塊的樣子? 怎樣將Activity封裝成長按Menu菜單的樣子?簡單你只需要設定 一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的地方一句話: Xml代碼 android :theme="@android:style/Theme.Dialog" android:theme="@android:style/Theme.Dialog" 這就使你的應用程式變成對話方塊的形式彈出來了,或者 Xml代碼 android:theme="@android:style/Theme.Translucent" android:theme="@android:style/Theme.Translucent" 就變成半透明的。重寫OnCreateOptionMenu方法來處理按下menu後的行為,然後再該方法中彈出對話方塊形式的Activity。也可以利用事件監聽來監聽menu按鍵,並在該按鈕按下後彈出對話方塊形式的Activity。 44.介紹一下Android系統的體繫結構應用程式層:android的應用程式通常涉及使用者介面和互動。應用程式框架層:UI組件、各種管理器等。函數庫層:系統C庫、媒體庫、webkit、SQLite等。linux核心庫:linux系統啟動並執行組件。 *45.描述下橫豎屏切換時候 activity 的生命週期不設定Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次. 設定Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次. 設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法. 46.android 中的動畫有哪幾種,它們的特點和區別是什麼 ?兩種,一種是補間動畫(Tween)動畫、還有一種是幀動畫(Frame)動畫。Tween動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。 47.一條最長的簡訊息約佔多少 byte?140byte,70個漢字。 48.描述handler 機制的原理andriod提供了 Handler 和 Looper 來滿足線程間的通訊。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的訊息交換(Message Exchange)。 1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程裡的Message Queue(訊息佇列)。 2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新訊息到Message Queue裡;或者接收Looper從Message Queue取出)所送來的訊息。 3) Message Queue(訊息佇列):用來存放線程放入的訊息。 4)線程:UI thread 通常就是main thread,而Android啟動程式時會替它建立一個Message Queue。 49.如何將 SQLite 資料庫 (dictionary.db 檔案 ) 與 apk 檔案一起發布 ?可以將dictionary.db檔案複製到Eclipse Android工程中的res\raw目錄中。所有在res\raw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。 使用openDatabase方法來開啟資料庫檔案,如果該檔案不存在,系統會自動建立/sdcard/dictionary目錄,並將res\raw目錄中的 dictionary.db檔案複製到/sdcard/dictionary目錄中 50.說說 android 中 mvc 的具體體現mvc是model,view,controller的縮寫,mvc包含三個部分:模型(model)對象:是應用程式的主體部分,所有的商務邏輯都應該寫在該層。視圖(view)對象:是應用程式中負責產生使用者介面的部分。也是在整個mvc架構中使用者唯一可以看到的一層,接收使用者的輸入,顯示處理結果。控制器(control)對象:是根據使用者的輸入,控制使用者介面資料顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應使用者出發的相關事件,交給m層處理。android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:1)視圖(view):一般採用xml檔案進行介面的描述,使用的時候可以非常方便的引入。2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫過多的代碼,要通過activity交割model商務邏輯層處理,這樣做的另外一個原因是android中的acitivity的回應時間是5s,如果耗時的操作放在這裡,程式就很容易被回收掉。3)模型層(model):對資料庫的操作、對網路等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。 51.請介紹下 Android 中常用的五種布局幀布局(FrameLayout)線性布局(LinearLayout)表格版面配置(TableLayout)相對布局(RelativeLayout)絕對布局(AbsoluteLayout) 52.如何啟用 Service ,如何停用 Service1)startService用於啟動Service、stopService停止Service。2)bindService綁定Service,unbindService解除Service的綁定。 53.如何最佳化ListView1、如果自訂配接器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就建立contentView並返回,如果不為null則直接使用。在這個方法中儘可能少建立view。2、給contentView設定tag(setTag()),傳入一個viewHolder對象,用於緩衝要顯示的資料,可以達到映像資料非同步載入的效果。3、如果listview需要顯示的item很多,就要考慮分頁載入。比如一共要顯示100條或者更多的時候,我們可以考慮先載入20條,等使用者拉到列表底部的時候再去載入接下來的20條。 54.描述4 種 activity 的啟動模式1)standard :系統的預設模式,一次跳轉即會產生一個新的執行個體。假設有一個activity命名為MainActivity,執行語句:startActivity(new Intent(MainActivity.this, MainActivity.class))後,MainActivity將跳轉到另外一個MainActivity,也就是現在的Task棧裡面有MainActivity的兩個執行個體。按返回鍵後你會發現仍然是在MainActivity(第一個)裡面。2)singleTop:singleTop 跟standard 模式比較類似。如果已經有一個執行個體位於Activity棧的頂部時,就不產生新的執行個體,而只是調用Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的執行個體。例:當MainActivity為 singleTop 模式時,執行跳轉後棧裡面依舊只有一個執行個體,如果現在按返回鍵程式將直接退出。3)singleTask: singleTask模式和後面的singleInstance模式都是只建立一個執行個體的。在這種模式下,無論跳轉的對象是不是位於棧頂的activity,程式都不會產生一個新的執行個體(當然前提是棧裡面已經有這個執行個體)。這種模式相當有用,在以後的多activity開發中,經常會因為跳轉的關係導致同個頁面產生多個執行個體,這個在使用者體驗上始終有點不好,而如果你將對應的activity聲明為 singleTask 模式,這種問題將不複存在。4)singleInstance: 設定為 singleInstance 模式的 activity 將獨佔一個task(感覺task可以理解為進程),獨佔一個task的activity與其說是activity,倒不如說是一個應用,這個應用與其他activity是獨立的,它有自己的上下文activity。 55.什麼是Intent,如何使用?Android基本的設計理念是鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的訊息系統,它允許在你的應用程式與其它的應用程式間傳遞Intent來執行動作和產生事件。使用Intent可以啟用Android應用的三個核心組件:活動、服務和廣播接收器。通過startActivity() orstartActivityForResult()啟動一個Activity;過 startService() 啟動一個服務,或者通過bindService() 和後台服務互動;通過廣播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())發給broadcast receivers 56.Android用的資料庫是什麼樣的?它和sql有什麼區別?為什麼要用ContentProvide?它和sql的實現上有什麼差別?Adnroid用的是SQLite資料庫。它和其他網路資料庫類似,也是通過SQL對資料進行管理。SQLite的操作非常簡單,包括資料類型在建表時也可以不指定。使用ContentProvider 可以將資料共用給其他應用,讓除本應用之外的應用也可以訪問本應用的資料。它的底層是用SQLite 資料庫實現的,所以其對資料做的各種操作都是以Sql實現,只是在上層提供的是Uri。 57.通過Intent傳遞一些位元據的方法有哪些?1)使用Serializable介面實現序列化,這是Java常用的方法。2)實現Parcelable介面,這裡Android的部分類比如Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換資料也很常見的。 58.對一些資源以及狀態的操作儲存,最好是儲存在生命週期的哪個函數中進行?onResume()恢複資料、onPause()儲存資料。 59.如何一次性退出所有開啟的Activity編寫一個Activity作為入口,當需要關閉程式時,可以利用Activity的SingleTop模式跳轉該Activity,它上面的所有Activity都會被銷毀掉。然後再將該Activity關閉。或者再跳轉時,設定intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這樣也能將上面的Activity銷毀掉。 60.說說Service的生命週期?啟動Service的方式有兩種,各自的生命週期也有所不同。一、通過startService啟動Service:onCreate、onStartCommand、onDestory。二、通過bindService綁定Service:onCreate、onBind、onUnbind、onDestory。 61.什麼是AIDL?AIDL是如何工作的?AIDL(Android介面描述語言)是一種介面描述語言; 編譯器可以通過aidl檔案產生一段代碼,通過預先定義的介面達到兩個進程內部通訊進程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉化成AIDL可識別的參數(可能是多個參數), 然後使用AIDL來傳遞這些參數, 在訊息的接收端, 使用這些參數組裝成自己需要的對象。AIDL是基於介面的,但它是輕量級的。它使用代理類在用戶端和實現層間傳遞值.。 62.Android如何把檔案存放在SDCard上?在AndroidManifest.xml中加入訪問SDCard的許可權如下:<!– 在SDCard中建立與刪除檔案許可權 –><uses-permission android:name=”android.permission.MOUNT_UNMOUNT_FILESYSTEMS”/><!– 往SDCard寫入資料許可權 –><uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>要往SDCard存放檔案,程式必須先判斷手機是否裝有SDCard,並且可以進行讀寫。注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權。Environment.getExternalStorageState()方法用於擷取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。Environment.getExternalStorageDirectory()方法用於擷取SDCard的目錄。 63.註冊廣播有幾種方式,這些方式有何優缺點?兩種。一種是通過代碼註冊,這種方式註冊的廣播會跟隨程式的生命週期。二種是在AndroidManifest.xml中配置廣播,這種常駐型廣播當應用程式關閉後,如果有資訊廣播來,程式也會被系統調用自動運行。 64.什麼是ANR 如何避免它? 在Android上,如果你的應用程式有一段時間響應不夠靈敏,系統會向使用者顯示一個對話方塊,這個對話方塊稱作應用程式無響應(ANR:Application Not Responding)對話方塊。使用者可以選擇讓程式繼續運行,但是,他們在使用你的應用程式時,並不希望每次都要處理這個對話方塊。因此,在程式裡對響應效能的設計很重要,這樣,系統不會顯示ANR給使用者。要避免它,應該盡量少在主線程做耗時太長的操作,應該將這些操作放線上程當中去做。 65.Android本身的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決? 有可能,比如null 指標異常、數組下表越界等異常,這些異常拋出後可能會導致程式FC。在編寫代碼時應該做好檢測,多考慮可能會發生錯誤的情況,從代碼層次解決這些問題。 66.為什麼要用 ContentProvider?它和 sql 的實現上有什麼差別?使用ContentProvider 可以將資料共用給其他應用,讓除本應用之外的應用也可以訪問本應用的資料。它的底層是用SQLite 資料庫實現的,所以其對資料做的各種操作都是以Sql實現,只是在上層提供的是Uri。 67.談談 UI 中, Padding 和 Margin 有什麼區別?padding指內邊距,表示組件內部元素距離組件邊框的距離。marin指外邊距,表示組件與組件之間的距離。 68.請介紹下 Android 的資料存放區方式。Android 提供了5種方式儲存資料:1)使用SharedPreferences儲存資料;2)檔案儲存體資料;3)SQLite資料庫儲存資料;4)使用ContentProvider儲存資料;5)網路儲存資料;