面試,一個老生常談的話題,相信新手去面試都會灰常的緊張,怎么辦吶?緊張的原因基本都是沒有準備好,所以今天代碼君打算結合以往自己的經歷,給大家總結下Android面試中常問的問題,希望對你們有幫助。
Java部分總結
-
靜態內部類、內部類、匿名內部類區別
- 靜態內部類:使用static修飾的內部類
- 內部類:就是在某個類的內部又定義了一個類,內部類所嵌入的類稱為外部類
- 匿名內部類:使用new生成的內部類
-
String、StringBuffer與StringBuilder的區別
- String 類型和 StringBuffer 類型的主要性能區別其實在于 String 是不可變的對象
- StringBuffer和StringBuilder底層是 char[]數組實現的
- StringBuffer是線程安全的,而StringBuilder是線程不安全的
-
Java有哪幾種引用
- 強引用:如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM 也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。如果想中斷強引用和某個對象之間的關聯,可以顯式地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象
- 軟引用:在使用軟引用時,如果內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用才會被垃圾回收器回收。
- 弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當 JVM 進行垃圾回收,一旦發現弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。不過由于垃圾回收器是一個優先級較低的線程,所以并不一定能迅速發現弱引用對象
- 虛引用:顧名思義,就是形同虛設,如果一個對象僅持有虛引用,那么它相當于沒有引用,在任何時候都可能被垃圾回收器回收。
Java回收機制是怎么樣的?
Java的垃圾回收機制是Java虛擬機提供的能力,用于在空閑時間以不定時的方式動態回收無任何引用的對象占據的內存空間。-
ArrayList與LinkedList的區別
- ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。
- 對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。
- 對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
Android 部分總結
-
Android 線程間通信有哪幾種方式
- 共享內存(變量);
- 文件,數據庫;
- Handler;
- Java 里的 wait(),notify(),notifyAll()
-
Activity和Fragment生命周期有哪些?
- Activity——onCreate->onStart->onResume->onPause->onStop->onDestroy
- Fragment——onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach
-
Activity的幾種LaunchMode及使用場景
- standard 模式:這是默認模式,每次激活Activity時都會創建Activity實例,并放入任務棧中。使用場景:大多數Activity。
- singleTop 模式:如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例并放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。使用場景如新聞類或者閱讀類App的內容頁面。
- singleTask 模式:如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。使用場景如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,并且會清空主界面上面的其他頁面。
- singleInstance 模式:一個新棧中創建該Activity的實例,并讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在于某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當于多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。使用場景如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用于中間頁面,如果用于中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出后,在此啟動,首先打開的是B。
View的繪制過程
一個View要顯示在界面上,需要經歷一個View樹的遍歷過程,這個過程又可以分為三個過程,也就是自定義View中的三要素:大小,位置,畫什么,即onMesure(),onLayout(),onDraw()。-
Touch事件的傳遞機制
- dispatchTouchEvent(MotionEventev); //用來分派event
- onInterceptTouchEvent(MotionEventev);//用來攔截event
- onTouchEvent(MotionEventev);//用來處理event
-
ListView卡頓的原因,如何進行性能優化?
- 重用converView: 通過復用converview來減少不必要的view的創建,另外Infalte操作會把xml文件實例化成相應的View實例,屬于IO操作,是耗時操作。
- 使用 RecycleView 代替listview: 每個item內容的變動,listview都需要去調用notifyDataSetChanged來更新全部的item,太浪費性能了。RecycleView可以實現當個item的局部刷新,并且引入了增加和刪除的動態效果,在性能上和定制上都有很大的改善
-
如何避免內存泄漏?
- 適配器里的Item復用
- 廣播注冊后不用及時關閉
- 長時間持有垃圾對象,導致回收不了
- 盡量使用application里的context
-
常用的設計模式有幾種?
- 單例模式
- 建造者模式
- 裝飾模式
- 動態代理
- 適配器模式
- 策略模式
- 工廠模式
圖片加載框架有幾種,各自的優缺點?
- Glide的優點
- Glide默認bitmap格式是GB565,內存占用小
- Glide更易用除了傳遞context,還可以傳遞activity和fragment
- Glide存儲的是imageview的大小,就省了重新調整圖片大小的步驟,加載速度會變快
- glide是基于Picasso的,進行大量的優化改進
- Fresco
- 優點:圖片漸進式呈現 ,通過在Native做處理大大減少OOM
- 缺點:功能強大但是相比于其他體積過大,除非需要圖片社交,不然大材小用,使用比較復雜
- Picasso 圖片過期采用LRU淘汰算法 glide完勝他
總結
找工作是每個人都會遇到的難題,代碼君前幾天出了一篇如何寫簡歷的文章,今天又寫了一篇面試問題總結,相信結合著兩篇文章,應該會對職場新人找工作有很大幫助的,最后祝大家找到理想的工作。