最近一直在杭州面試耿戚,想要寫一寫面試中遇到的技術(shù)問題并總結(jié)一下窒典。主要分為java基礎(chǔ)部分和android基礎(chǔ)部分蟆炊。
java基礎(chǔ):
1.對(duì)抽象,封裝瀑志,繼承涩搓,多態(tài)的理解
抽象:就是把業(yè)務(wù)邏輯用程序代碼表示出來。分為數(shù)據(jù)抽象和過程抽象劈猪,數(shù)據(jù)抽象是對(duì)象的屬性昧甘,行為抽象是對(duì)象的行為特征
封裝:封裝是設(shè)置訪問權(quán)限,只把內(nèi)部的數(shù)據(jù)或方法暴露給可信的類或?qū)ο笳降茫瑢?duì)不可信的進(jìn)行隱藏
繼承:把一些有共性的類稱為父類疾层,不同子類可以通過繼承付類重用這一些共性
多態(tài):允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。方法的重載體現(xiàn)了多態(tài)贡避,向上轉(zhuǎn)型也體現(xiàn)了多態(tài)痛黎。例如:
Animal d = new Dog();
Animal c = new Cat();
在編譯時(shí),并不知道引用的具體對(duì)象是那個(gè)類刮吧,只有當(dāng)程序運(yùn)行時(shí)才能知道湖饱。
2.java中的單例模式怎么寫
餓漢模式
public class Singleton {
//餓漢模式,沒有達(dá)到懶加載的效果杀捻,在類加載時(shí)就會(huì)實(shí)例化井厌,但是是線程安全的
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
3.String和StringBuffer、StringBuilder的區(qū)別
String是不可變的致讥,StringBuffer和StringBuider都是可變的仅仆;StringBuffer是線程不安全的,但是效率會(huì)高一些垢袱;StringBuilder是線程安全的墓拜,但是效率低一些。
4.對(duì)java的泛型的理解
泛型请契,即“參數(shù)化類型”咳榜。
創(chuàng)建集合時(shí)就指定集合元素的類型,該集合只能保存其指定類型的元素爽锥,避免使用強(qiáng)制類型轉(zhuǎn)換涌韩。
5.java中的垃圾回收機(jī)制是怎么樣的
5.1.確定刪除的對(duì)象
java中的GC采用對(duì)象引用遍歷的方式判斷該對(duì)象是否被回收,如果該對(duì)象是不可達(dá)的氯夷,則視為垃圾回收
5.2.GC掃描堆棧臣樱,刪除垃圾
刪除對(duì)象的過程中,會(huì)停止所有其他線程
6.如何實(shí)現(xiàn)對(duì)象排序
實(shí)現(xiàn)comparable接口,然后通過Collections.sort()或者Arrays.sort()進(jìn)行排序
7.java中的反射
Java反射機(jī)制可以讓我們?cè)诰幾g期(Compile Time)之外的運(yùn)行期(Runtime)獲得任何一個(gè)類的字節(jié)碼雇毫。包括接口奢啥、變量、方法等信息嘴拢。還可以讓我們?cè)谶\(yùn)行期實(shí)例化對(duì)象桩盲,通過調(diào)用get/set方法獲取變量的值。
反射機(jī)制詳解
8.java中的設(shè)計(jì)模式
1.單例模式
2.適配器模式
3.觀察者模式
4.builder模式
個(gè)人理解它的優(yōu)點(diǎn)是能把一個(gè)復(fù)雜對(duì)象的每一步的構(gòu)造過程解耦
5.代理模式
android中使用的設(shè)計(jì)模式
9.synchronized關(guān)鍵字的應(yīng)用
10.HashMap工作原理
Android基礎(chǔ):
1.Activity生命周期是怎么樣的
ActivityA跳轉(zhuǎn)到ActivityB:
a.onPause()-->b.onCreate()-->b.onStart()-->b.onResume()-->a.onStop()
ActivityB再回退到ActivityA:
b.onPause()-->a.onRestart()-->a.onStart()-->a.onResume()-->b.onStop()-->b.onDestory()
若在Activity界面按home鍵又返回:
onPause()-->onStop()-->onRestart()-->onStart()-->onResume()
2.Service的生命周期有哪些
通過start方式啟動(dòng):
onCreate()-->onStartCommand()-->onDestory()
通過bind方式啟動(dòng):
onCreate()-->onBind()-->onUnbind()-->onDestory()
3.對(duì)MVP席吴、MVC赌结、MVVM的了解
4.android中handler的使用
//handler綁定looper,并暴露接口,用于實(shí)現(xiàn)
mHandler = new Handler(Looper.myLooper()){
@Override
public void handleMessage(Message msg){
Log.d(TAG, "獲得了message");
super.handleMessage(msg);
}
};
//創(chuàng)建MessageQueue
looper.prepare();
//發(fā)送Message到MessageQueue
Message message = new Message();
message.sendToTarget();
//輪詢MessageQueue
looper.loop();
5.android中touch事件的傳播
6.有沒有用過EventBus
7.談?wù)刟ndroid中的性能優(yōu)化
7.1.對(duì)布局的優(yōu)化
1.使用include標(biāo)簽,能達(dá)到對(duì)布局的重用
2.使用merge標(biāo)簽,他可以刪除多余層級(jí)
3.使用ViewStub孝冒,ViewStub加載布局時(shí)柬姚,占用資源很少。ViewStub的應(yīng)用
關(guān)于include,merge和ViewStub
7.2.使用clipRect用于防止overDraw
7.3.ListView滑動(dòng)卡頓:
可能是因?yàn)榛瑒?dòng)過程中正在下載圖片庄涡,也可能是item布局太復(fù)雜
8.有哪些常用的開源框架量承,說說他們的優(yōu)點(diǎn)
網(wǎng)絡(luò)請(qǐng)求 okhttp:會(huì)從很多常用的連接問題中自動(dòng)恢復(fù)。如果您的服務(wù)器配置了多個(gè)IP地址穴店,當(dāng)?shù)谝粋€(gè)IP連接失敗的時(shí)候撕捍,OkHttp會(huì)自動(dòng)嘗試下一個(gè)IP。OkHttp還處理了代理服務(wù)器問題和SSL握手失敗問題
圖片加載 glide:glide會(huì)根據(jù)imageview的大小來確定要加載的圖片的大小泣洞,磁盤緩存時(shí)忧风,也只緩存控件大小的bitmap
View注入 Butter Knife
數(shù)據(jù)存儲(chǔ) DBFlow ORM
熱修復(fù) tinker 熱修復(fù)的原理是用classloader來加載class文件
事件總線框架 EventBus EventBus使用詳解
9.JNI的使用
10.Android中常用的IPC的方式,以及各自的優(yōu)缺點(diǎn)
1.使用Bundle 數(shù)據(jù)類型支持有限球凰,序列化耗時(shí)
2.使用文件共享 無法即時(shí)通信狮腿,不好處理高并發(fā)
3.使用Messenger 通過Message進(jìn)行傳輸,所以也只能支持bundle數(shù)據(jù)呕诉;適用于輕量級(jí)和地并發(fā) Messenger詳解
4.AIDL AIDL詳解
5.ContentProvider 用于數(shù)據(jù)共享
6.Socket 用于網(wǎng)絡(luò)交換
11.Android中的內(nèi)存泄漏缘厢,內(nèi)存溢出,以及內(nèi)存抖動(dòng)
內(nèi)存泄漏是某些對(duì)象不能被回收
內(nèi)存溢出是由于內(nèi)存不足
內(nèi)存抖動(dòng)是由于頻繁GC
Android性能優(yōu)化典范
12.圖片的處理
13.Fragment與Activity通信甩挫,F(xiàn)ragment之間是怎么通信的
Fragment與Activity之間通過EventBus或者接口的方式通信
Fragment之間通過綁定的Activity中轉(zhuǎn)做通信
14.Fragment的生命周期和Activity生命周期比較
15.android藍(lán)牙開發(fā)流程
Android經(jīng)典藍(lán)牙開發(fā)簡(jiǎn)介
16.android應(yīng)用啟動(dòng)流程
17.android中的緩存策略
分為內(nèi)存緩存(一級(jí)緩存)和磁盤緩存(文件緩存)贴硫,需要特定數(shù)據(jù)時(shí),先去找內(nèi)存中是否存在捶闸,如果沒有再去磁盤中找夜畴,如果都沒有拖刃,則再去進(jìn)行網(wǎng)絡(luò)請(qǐng)求删壮。
18.android組件化開發(fā)
19.兩種注冊(cè)廣播的方法的區(qū)別
清單文件中注冊(cè)廣播是常駐型廣播,不跟隨程序的生命周期兑牡,在代碼中注冊(cè)的廣播正相反