面試伪冰,一個老生常談的話題揍堰,相信新手去面試都會灰常的緊張,怎么辦吶诗轻?緊張的原因基本都是沒有準備好钳宪,所以今天代碼君打算結合以往自己的經歷,給大家總結下Android面試中常問的問題扳炬,希望對你們有幫助吏颖。
Java部分總結
-
靜態(tài)內部類、內部類恨樟、匿名內部類區(qū)別
- 靜態(tài)內部類:使用static修飾的內部類
- 內部類:就是在某個類的內部又定義了一個類半醉,內部類所嵌入的類稱為外部類
- 匿名內部類:使用new生成的內部類
-
String、StringBuffer與StringBuilder的區(qū)別
- String 類型和 StringBuffer 類型的主要性能區(qū)別其實在于 String 是不可變的對象
- StringBuffer和StringBuilder底層是 char[]數(shù)組實現(xiàn)的
- StringBuffer是線程安全的劝术,而StringBuilder是線程不安全的
-
Java有哪幾種引用
- 強引用:如果一個對象具有強引用缩多,它就不會被垃圾回收器回收。即使當前內存空間不足养晋,JVM 也不會回收它衬吆,而是拋出 OutOfMemoryError 錯誤,使程序異常終止绳泉。如果想中斷強引用和某個對象之間的關聯(lián)逊抡,可以顯式地將引用賦值為null,這樣一來的話零酪,JVM在合適的時間就會回收該對象
- 軟引用:在使用軟引用時冒嫡,如果內存的空間足夠,軟引用就能繼續(xù)被使用四苇,而不會被垃圾回收器回收孝凌,只有在內存不足時,軟引用才會被垃圾回收器回收蛔琅。
- 弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當 JVM 進行垃圾回收,一旦發(fā)現(xiàn)弱引用對象罗售,無論當前內存空間是否充足辜窑,都會將弱引用回收。不過由于垃圾回收器是一個優(yōu)先級較低的線程寨躁,所以并不一定能迅速發(fā)現(xiàn)弱引用對象
- 虛引用:顧名思義穆碎,就是形同虛設,如果一個對象僅持有虛引用职恳,那么它相當于沒有引用所禀,在任何時候都可能被垃圾回收器回收。
Java回收機制是怎么樣的放钦?
Java的垃圾回收機制是Java虛擬機提供的能力色徘,用于在空閑時間以不定時的方式動態(tài)回收無任何引用的對象占據(jù)的內存空間。-
ArrayList與LinkedList的區(qū)別
- ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結構操禀,LinkedList基于鏈表的數(shù)據(jù)結構褂策。
- 對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList颓屑,因為LinkedList要移動指針斤寂。
- 對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢揪惦,因為ArrayList要移動數(shù)據(jù)遍搞。
Android 部分總結
-
Android 線程間通信有哪幾種方式
- 共享內存(變量);
- 文件,數(shù)據(jù)庫;
- 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時都會創(chuàng)建Activity實例蒂培,并放入任務棧中再愈。使用場景:大多數(shù)Activity。
- singleTop 模式:如果在任務的棧頂正好存在該Activity的實例护戳,就重用該實例( 會調用實例的 onNewIntent() )翎冲,否則就會創(chuàng)建新的實例并放入棧頂,即使棧中已經存在該Activity的實例媳荒,只要不在棧頂抗悍,都會創(chuàng)建新的實例。使用場景如新聞類或者閱讀類App的內容頁面钳枕。
- singleTask 模式:如果在棧中已經有該Activity的實例缴渊,就重用該實例(會調用實例的 onNewIntent() )。重用時鱼炒,會讓該實例回到棧頂衔沼,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中指蚁。使用場景如瀏覽器的主界面菩佑。不管從多少個應用啟動瀏覽器,只會啟動主界面一次凝化,其余情況都會走onNewIntent稍坯,并且會清空主界面上面的其他頁面。
- singleInstance 模式:一個新棧中創(chuàng)建該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卡頓的原因,如何進行性能優(yōu)化奏路?
- 重用converView: 通過復用converview來減少不必要的view的創(chuàng)建畴椰,另外Infalte操作會把xml文件實例化成相應的View實例,屬于IO操作鸽粉,是耗時操作斜脂。
- 使用 RecycleView 代替listview: 每個item內容的變動,listview都需要去調用notifyDataSetChanged來更新全部的item触机,太浪費性能了帚戳。RecycleView可以實現(xiàn)當個item的局部刷新玷或,并且引入了增加和刪除的動態(tài)效果,在性能上和定制上都有很大的改善
-
如何避免內存泄漏片任?
- 適配器里的Item復用
- 廣播注冊后不用及時關閉
- 長時間持有垃圾對象庐椒,導致回收不了
- 盡量使用application里的context
-
常用的設計模式有幾種?
- 單例模式
- 建造者模式
- 裝飾模式
- 動態(tài)代理
- 適配器模式
- 策略模式
- 工廠模式
圖片加載框架有幾種蚂踊,各自的優(yōu)缺點?
- Glide的優(yōu)點
- Glide默認bitmap格式是GB565笔宿,內存占用小
- Glide更易用除了傳遞context犁钟,還可以傳遞activity和fragment
- Glide存儲的是imageview的大小,就省了重新調整圖片大小的步驟泼橘,加載速度會變快
- glide是基于Picasso的涝动,進行大量的優(yōu)化改進
- Fresco
- 優(yōu)點:圖片漸進式呈現(xiàn) ,通過在Native做處理大大減少OOM
- 缺點:功能強大但是相比于其他體積過大炬灭,除非需要圖片社交醋粟,不然大材小用,使用比較復雜
- Picasso 圖片過期采用LRU淘汰算法 glide完勝他
總結
找工作是每個人都會遇到的難題重归,代碼君前幾天出了一篇如何寫簡歷的文章米愿,今天又寫了一篇面試問題總結,相信結合著兩篇文章鼻吮,應該會對職場新人找工作有很大幫助的育苟,最后祝大家找到理想的工作。