子曰:“父母之年熟吏,不可不知也距糖。一則以喜玄窝,一則以懼∩隹穑”《論語》
見過很多的人為了家庭放棄工作哆料。你是螺絲釘,你可能一輩子就在一個(gè)地方吗铐,離開了你的地方东亦,就成了廢鐵。 你是金子唬渗,鉆石呢典阵??
面試的時(shí)間一般是半個(gè)小時(shí)到一個(gè)小時(shí)左右镊逝,時(shí)間很是寶貴壮啊,建議只做自己最擅長的那一部分
基礎(chǔ)知識(shí)要配合著項(xiàng)目經(jīng)驗(yàn)來進(jìn)行講述,這樣才會(huì)給面試官最大的尊重撑蒜,也給自己一個(gè)發(fā)光的機(jī)會(huì)
Java基礎(chǔ)
TCP (Transmission Control Protocol歹啼,傳輸控制協(xié)議)
1. 一種面向連接的、可靠的座菠、基于字節(jié)流的傳輸層通信協(xié)議
2. TCP層是位于IP層之上狸眼,應(yīng)用層之下的中間層
3. 三次握手
1. 客戶端發(fā)送SYN(SEQ=x)報(bào)文給服務(wù)器端,-> SYN_SEND浴滴。
2. 服務(wù)器端收到SYN報(bào)文拓萌,回應(yīng)一個(gè)SYN (SEQ=y)ACK(ACK=x+1)報(bào)文,->SYN_RECV升略。
3. 客戶端收到服務(wù)器端的SYN報(bào)文微王,回應(yīng)一個(gè)ACK(ACK=y+1)報(bào)文,-> Established(已建立的)品嚣。
4. 這一過程與打電話很相似炕倘,先撥號(hào)振鈴,等待對(duì)方摘機(jī)說“喂”翰撑,然后才說明是誰罩旋。在一個(gè)TCP連接中,僅有兩方進(jìn)行彼此通信额嘿。
4. 握手以后,進(jìn)行傳(yue)遞(hui)
5. 可靠性保證
1. 應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊(報(bào)文)
2. 當(dāng)TCP發(fā)出一個(gè)段后劣挫,它啟動(dòng)一個(gè)定時(shí)器册养,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn)压固,將重發(fā)這個(gè)報(bào)文段球拦。
3. 既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來傳輸,而IP數(shù)據(jù)報(bào)的到達(dá)可能會(huì)失序,因此TCP報(bào)文段的到達(dá)也可能會(huì)失序坎炼。(自動(dòng)調(diào)整順序)
4. .TCP還能提供流量控制(緩沖區(qū)大欣颉)。
UDP (User Data Protocol谣光,用戶數(shù)據(jù)報(bào)協(xié)議)
1. 不面向連(fu)接(ze)
2. 全力發(fā)送
3. 一個(gè)可以給多個(gè)發(fā)送
4. 不保證順序
5. 數(shù)據(jù)報(bào)模式
6. 丟包 [ping就是用的這個(gè)檩淋,所以網(wǎng)不好就丟包]
- 新浪面試題
寫一個(gè)函數(shù),計(jì)算兩個(gè)文件的相對(duì)路徑的遞歸算法
String aPath = "/P/y/z/a/b/a/g/e.php";
String bPath = "/P/y/z/a/b/a/g/c.php";
情況的時(shí)候貌似不對(duì)萄金。
代碼可改成:
public String pathARelativePathB(String pathA, String pathB, int i) {
// A相對(duì)于B ../g/e.php
if (pathA.contains(pathB)) {
if (i == 1) {
return pathA.replaceAll(pathB + "/", "");
} else {
StringBuffer sb = new StringBuffer();
for (int j = 1; j < i; j++)
sb.append("../");
return sb.append(pathA.replaceAll(pathB + "/", "")).toString();
}
} else {
return pathARelativePathB(pathA, pathB.substring(0, pathB.lastIndexOf("/")), ++i);
}
}
-
編寫一個(gè)函數(shù)用來實(shí)現(xiàn)輸入任意一個(gè)字符串蟀悦,實(shí)現(xiàn)對(duì)該字符串進(jìn)行反轉(zhuǎn)
- 轉(zhuǎn)換成char數(shù)組,倒著輸出即可[英文數(shù)字均可] [簡(jiǎn)單(la)粗暴(ji)]
- 如果是中文串氧敢,編碼問題就不是那么善良了
- 這時(shí)候日戈,使用字符串截取類,倒著一個(gè)一個(gè)的截取即可
- 也可以使用整個(gè)串長度的For循環(huán)孙乖,輸出指定位置的字符即可
- 小技巧split("")可以讓整個(gè)串按字符分割
- 數(shù)據(jù)結(jié)構(gòu)高手的想法浙炼,整個(gè)串分割后壓入棧中,進(jìn)行彈出就是反轉(zhuǎn)
- 首尾交換法 比如原長度是10唯袄,那么 [0][10] | [1][9]進(jìn)行交換弯屈,for循環(huán)只用跑 1/2,效率也是非吃铰瑁可觀
- 歡迎大家對(duì)以上算法進(jìn)行效率排序季俩,可以在公眾號(hào)中給我留言
Android 基礎(chǔ)
-
場(chǎng)景 [Context]
- 源碼分析 Activity、Service梅掠、Application都是Context的子類
- 分類 Activity ApplicationContext
- 兩個(gè)有什么區(qū)別酌住,需要顯示東西的時(shí)候,就用Activity中的Context就可以阎抒,不需要顯示的時(shí)候酪我,那么使用ApplicationContext就行,當(dāng)然且叁,注意對(duì)象的引用都哭,發(fā)生內(nèi)存泄漏也不好,軟引用空指針了也不好
- 場(chǎng)景逞带,就是前臺(tái)小蜜要不停的穿梭在老板的辦公室欺矫,前臺(tái)等地方,所以不同的場(chǎng)景下展氓,小蜜能做的事情也不同
- 所以穆趴,要分場(chǎng)合的使用你的小蜜
-
四大組件
- 活動(dòng)(Activity)
- 生命周期方法調(diào)用,四種啟動(dòng)方式
- 服務(wù)(Service)
- 生命周期遇汞,綁定方法
- 廣播接收者(BroadcastReceiver)
- 動(dòng)態(tài)注冊(cè)(onDestroy中解綁)和靜態(tài)注冊(cè)的區(qū)別未妹,優(yōu)先級(jí)
- 廣播分類 有序(優(yōu)先級(jí)大的有權(quán)利截?cái)鄰V播)/無序
- 廣播分類 本地/全局
- 廣播分類 Sticky 粘性廣播簿废,延遲廣播 權(quán)限 android.permission.BROADCAST_STICKY
- 粘性廣播保證后注冊(cè)的接收者也可以接收到,但只保持最后一條廣播
- 粘性廣播已經(jīng)很少用
- 內(nèi)容提供者(Content Provider)
- Uri格式 [scheme:] [//host:port] [path] [?query][#fragment]
- 當(dāng)外部應(yīng)用需要對(duì)ContentProvider中的數(shù)據(jù)進(jìn)行添加络它、刪除族檬、修改和查詢操作時(shí),可以使用ContentResolver類來完成化戳,要獲取ContentResolver對(duì)象单料,可以使用Context提供的getContentResolver()方法。
- 怎么描述他的功能呢迂烁,就是給別人開的后門吧
- 活動(dòng)(Activity)
5. 內(nèi)容觀察者(ContentObserver)(提供者的小弟)
1. 觀察短信看尼、通話記錄、是否飛行模式
2. 需要頻繁檢測(cè)的數(shù)據(jù)庫或者某個(gè)數(shù)據(jù)是否發(fā)生改變盟步,如果使用線程去操作藏斩,很不經(jīng)濟(jì)而且很耗時(shí)
3. 在用戶不知曉的情況下對(duì)數(shù)據(jù)庫做一些事件,比如:悄悄發(fā)送信息却盘、拒絕接受短信黑名單等
4. 比如狰域,只接受指定用戶的信息
5. 建議和Handler配合使用更新UI
-
OOM [out of memory 內(nèi)存溢出]
- 一般一個(gè)應(yīng)用使用的內(nèi)存不能超過默認(rèn)值 32M ,小米150M..
- 國內(nèi)的黑科技APP就不要吐槽了黄橘,大的能占你的手機(jī) 1G 運(yùn)存
- 為什么能占這么多還不OOM兆览,解決方式很多
- 保持不重要的內(nèi)存進(jìn)行軟引用,讓系統(tǒng)的gc自己動(dòng)起來
- 大圖加載(10M以上的大圖) 得到bitmap之前先利用BitmapFactory.Options的inSampleSize的值得到壓縮圖片塞关。
- 數(shù)據(jù)需要的時(shí)候再進(jìn)行加載
- LruCache 設(shè)計(jì)自己的緩存去 數(shù)據(jù)單獨(dú)進(jìn)行管理 底層使用LinkedHashMap在使用一個(gè)對(duì)象的時(shí)候就把這個(gè)對(duì)象移動(dòng)到隊(duì)列頭部抬探,而且線程安全
- AsyncTask 它封裝了Thread和Handler
- 內(nèi)存泄漏 (占用的內(nèi)存只增不減)-> 合理的使用你的內(nèi)存
先簡(jiǎn)單的泄漏一下
第一種 [JAVA] 泄漏
1. 創(chuàng)建一百個(gè)對(duì)象
2. 把這一百個(gè)對(duì)象放入集合中,放入后把原對(duì)象引用置為空
3. 使用完集合后帆赢,這些對(duì)象還是會(huì)繼續(xù)存在小压,造成泄漏
4. 將對(duì)象也置為空,系統(tǒng)就會(huì)自動(dòng)GC
第二種 [上下文的泄漏]
1. 靜態(tài)類中使用的Context
2. 如果靜態(tài)類的生命周期長于Context生命周期 -> 泄漏
3. 可以使用ApplicationContext 在Application中添加一個(gè)靜態(tài)工廠方法椰于,返回ApplicationContext.
4. Handler 造成的內(nèi)存泄漏 Handler怠益、Message 和 MessageQueue 都是相互關(guān)聯(lián)在一起的
5. 如果Handler還有沒處理完的東西Activiy已經(jīng)被關(guān)閉了
6. Handler 中還繼續(xù)持有這個(gè) Activity 的引用 -> 泄漏
7. 解決方案,Handler 對(duì) Activity 使用軟引用
8. 使用前判斷非空
- 原因瘾婿,在內(nèi)存中有一個(gè)無法訪問也無法清除的對(duì)象
- 危險(xiǎn)蜻牢,小的泄漏無所謂,每次泄漏一點(diǎn)偏陪,時(shí)間久了抢呆,手機(jī)的內(nèi)存就被啃光了,明顯感覺到卡頓和發(fā)熱的時(shí)候笛谦,早就積少成多了
- 避免這些問題是高端開發(fā)人員的核心技能之一
- 盡量避免使用 static 成員變量抱虐,這些東西和APP生命周期一樣,極其浪費(fèi)系統(tǒng)資源
- 將內(nèi)部類改為靜態(tài)內(nèi)部類
- 靜態(tài)內(nèi)部類中使用弱引用來引用外部類的成員變量
- Handler 更新UI使用弱引用
-
ANR [Application Not Responding]
- 喜歡玩舊手機(jī)的人揪罕,經(jīng)程萋耄看到這個(gè)
- 經(jīng)常會(huì)問你,xx失去響應(yīng)好啰,該不該把它關(guān)了
- Activity 5s broadCastReceiver 10s Service 20s
- 為什么轩娶,你卡到UI線程了
- 好的應(yīng)用是不允許這個(gè)問題出現(xiàn)
- 所以,[耗時(shí)/聯(lián)網(wǎng)/數(shù)據(jù)庫] 等操作就放到工作服務(wù)和子線程中
- 最好辦法框往,異步數(shù)據(jù)處理鳄抒,多用緩存機(jī)制
- 微小的卡頓保持在100-200ms中,放心沒人發(fā)現(xiàn)
- 使用進(jìn)度條來保持耗時(shí)的不尷尬