一面:
1.activity和service怎么通信
(回答了啟動service的方式。。但是面試官說讓我說怎么通信不是問啟動。。。我就從兩種啟動方式說了一下不同的啟動方式怎么通信了,但是面試官問我還有嗎答不出了,扯了一下activity和service的跨進程的通信)
2.因為扯到了跨進程通信,就讓我說一下安卓上有什么跨進程的通信方式
(答了廣播,socket,基于binder那些,剪貼板,文件,管道。。。都是下意識說的,沒答全)
3.說到了管道,讓我說一下在Android的時候會用到管道嗎
(我說了平時沒有用到,但是linux下敲命令行的時候會用到"|",這個實際上會用到管道,后面還補充說Android的Handler機制是用到管道的。。面試官說平時基本不怎么用到的)
4.Java 兩個整型相加怎么知道有沒有溢出
(我說如果是int相加,就用long保存結(jié)果,然后與Integer.MAX_VALUE和Integer.MIN_VALUE比較。然后如果long都存不下的話,可以用Java提供的一些數(shù)值類來表示數(shù)字,進行運算(回來查了一下,BigInteger和BigDecimal可以提供這種大數(shù)字的運算)。面試官說如果不用這些呢,如果是兩個正數(shù)相加呢,我沒答上來,但我說了一下正數(shù)相加溢出的話符號位會改變。。。問了面試官,也是這個答案,他正數(shù)相加溢出會變成負數(shù))
5.Java怎么停止線程
(這是我之前面試沒回答上來的問題似乎,但那時問的是安全地停止一個線程。。。我就答了捕獲InterruptException和isInterrupt()標志位那些。。(跑題)然后面試官說不是這個,就說怎么停止線程就好。。。于是回答了線程池的shutdownAll()方法那些;還說了一下設置標志位,作為循環(huán)停止的條件;然后還說如果是有l(wèi)ooper的線程,可以停止looper。。。感覺不是答得很好)
(1.標記位;2.Thread類的interrupt()方法(stop()已廢棄);3.線程池使用shutDownAll();4.Looper的quit方法或quitSafely方法)
6.假如有4個線程同步開始,其中第4個線程要等前面三個線程執(zhí)行完進行些統(tǒng)計操作,要怎么操作呢。
(說了CountDownLatch和那個柵欄CyclicBarriy(不會拼)?但是說得不太好,因為我用得少不是特別理解,面試官看出來我回答得不好,讓我說說它們的區(qū)別,這個應該回答得沒什么大問題?(后來發(fā)現(xiàn)問題大了!我把countDownLatch說成信號量了,給記串了,但是面試官看起來也沒發(fā)現(xiàn)?))
7.如果不通過使用Java的并發(fā)包的現(xiàn)成類庫來實現(xiàn)一個CountDownLatch,怎么實現(xiàn)?
((嗯這個也是描述信號量的,所以是錯誤回答)我回答是(感覺基本是下意識回答的,沒有腦子了),維護一個volatile的數(shù)字,然后通過++和--操作來控制數(shù)字的大小,并用sychronized塊保證++和--操作的原子性;然后當一個線程要調(diào)用countdown操作的時候,發(fā)現(xiàn)這個值為0,那么就主動調(diào)用wait()方法;如果一個線程調(diào)用++的操作,那么當從0加到1的時候,就調(diào)用鎖上的notifyAll(),來通知沉睡的線程。因為使用notifyAll喚醒的線程可能有多個,所以被喚醒的線程還需要再次檢查數(shù)字是不是為0,應該需要一個循環(huán)檢查的邏輯)
8.那么使用你這個CountDownLatch的這3+1個線程,一共需要幾個鎖呢?
(一個呀,因為只有在同一個鎖上才能保證互斥呀)
9.知道大頂堆和小頂堆嗎,一個數(shù)組建堆,時間復雜度是多少呢?
(原地建堆O(n),但是數(shù)學證明沒搞懂,如果逐個插入,則是O(nlogn)(這個回答的時候不是很清晰,這個答案不太自信))
10.在堆中找指定的一個元素復雜度是多少?
(答了O(n)。。。我說又不是二叉搜索樹這種更加有序的結(jié)構,如果找的不是根元素,那么也只有遍歷查找了)
11.看你簡歷上也有寫網(wǎng)絡方面的知識,https的過程說一下
(這是我之前面試跪過的題目。。。但是我這次不怕了。。給他說了一下ssl層的握手過程,然后面試官有問我ssl握手生成的這幾個隨機數(shù)有什么用,我說了這幾個隨機數(shù)是用來生成真正的對稱密鑰的,還可以防止重放攻擊,并且三個偽隨機數(shù)更接近真正的隨機)
二面:
1.Unicode和ASCII的區(qū)別
(說實話這個我不記得,我就說了一下Java是Unicode編碼,然后占用16bits,然后說ASCII編碼范圍應該比Unicode要小)
2.Unicode有哪些種類?Java是哪種?
(不知道。。面試官說是utf-8就是一個。。(我知道Java不是標準的UTF,但是我沒說))
3.json這種格式知道嗎,是怎樣的,有什么用?
(存儲一些鍵值對(屬性)吧,可以用花括號表示一個json對象,還有方括號表示json數(shù)組;json這種格式可以用來表示一個序列化的對象)
4.序列化除了json還有什么可以使用?
(xml格式也可以吧)
5.說說Android上的序列化?
(serializable和Parcelable,使用方式講了一下)
6.Java的serializable有個Id,你知道是有啥用的嗎?
(類的版本吧,定義之后可以最大限度恢復對象,說了一下serializable可以用于深拷貝)
7.深拷貝淺拷貝說說?
(描述了一下定義吧)
8.Object的hashcode()用來干嘛,怎么自己實現(xiàn)hashcode?
(頭條之前問過我這個問題,但是我沒講好(所以才會掛嘛)。
這次的話,我說了一下
hashcode的作用(用在hashmap這種數(shù)據(jù)結(jié)構中的散列和查找);
-
我認為一個好的hashcode定義的要求:(
(1)不能經(jīng)常改變,因為改變會導致無法找到原本的key對象;
(2)最好跟對象的一些數(shù)據(jù)相關,能夠唯一標識一個對象(比如你每個對象都有不會改變的名字的話,就可以根據(jù)對象名字生成);
(3)在一個整型中0和1分布盡可能均勻,不能前面都是000后面才有幾個數(shù)字,這樣比較容易產(chǎn)生碰撞)
-
談談根據(jù)以上要求怎么生成hashcode)
(復盤:個人感覺可以吹吹哈希洪范攻擊?還有怎么解決哈希洪范攻擊)
9.JNI講講?
(講了一下System.load之類的加載.so庫的兩個方法,還有Java方法和cpp方法的簽名匹配)
10.一個a包里的B類的c方法,cpp代碼中的方法一定要a_B_c()這樣嗎
(也可以自定義映射,我有看到別人的代碼中有這樣的映射)
11.Java的泛型講講,有啥用?咋實現(xiàn)的
(有泛型方法和泛型類;實現(xiàn)就是編譯期的時候進行了轉(zhuǎn)型,有對應的虛擬機指令;一般來說運行時不可以獲取泛型參數(shù)的類型,但是有一種情況可以)
12.在什么情況下可以在運行時獲取泛型參數(shù)
(在父類是一個泛型類,子類繼承這個父類并實現(xiàn)這個泛型參數(shù)的時候,可以通過反射getGenxxxType()的方法獲取泛型參數(shù)列表具體的泛型)
13.上界通配符和下界通配符講講
(這個講得不太好,就是說了一下寫法,還有每個寫法表示的是什么)
(List<? extends T>:get:T;put :任何都不行;List<? super T>:get:Object;put:T)
14.兩個方法,一個方法的參數(shù)是泛型的,一個參數(shù)是正常的類(如String),會怎么樣?
(我認為不會報錯吧,因為泛型參數(shù)可以匹配所有類型參數(shù),應該會優(yōu)先調(diào)用更準確的方法……面試官覺得會報錯,因為編譯器會分不清應該調(diào)用哪個方法;我還是認為不會報錯……他們是包含與被包含的關系,就像一個方法有Object參數(shù)和String參數(shù),調(diào)用的時候如果傳入一個String類型的參數(shù),靜態(tài)委派也是優(yōu)先調(diào)用String的那個方法)
(回到宿舍實測,不會報錯)
15.輸入網(wǎng)址到返回ip的過程
(講了一下DNS服務的請求過程)
16.假設你你緩存的ip地址過時了,怎么辦
(我猜測說,要是ip過期的話,會無法響應請求,那客戶端就可以再走一次DNS請求的流程(這個答案不好哈哈哈哈))
17.你認為DNS機制是怎么解決這個問題的,你可以嘗試參考http的緩存機制想想
(每次使用之前與DNS服務器對比一下?(is_modify_since?)或者定義一個過期時間,過期之前都可以直接使用這個ip地址)
18.廣播有幾種,有序和粘性講講
(粘性不記得了,有序講了一下優(yōu)先級)
19.注冊廣播的方式,你覺得靜態(tài)注冊廣播這個是什么時候執(zhí)行的呢
(靜態(tài)注冊和動態(tài)注冊?執(zhí)行應該是開機之后相關服務啟動之后吧(猜測))
20.本地廣播
(只能在進程內(nèi)傳播消息,使用handler實現(xiàn),工作機制就是……說了一下廣播過濾那些吧,然后再發(fā)消息到指定的廣播接收器去處理)
21.線程進程區(qū)別
(1.進程是系統(tǒng)分配資源的單位;2.線程是系統(tǒng)分配和調(diào)度cpu資源的單位;3.線程獨立性沒有進程高;4.一個進程可以有多個線程……等等)
22.講到內(nèi)存資源,線程有什么數(shù)據(jù)是私有的
(虛擬機棧,以及上面的方法參數(shù)?還有ThreadLocal的話可以定義一個線程私有的對象,之后說我知道ThreadLocal的實現(xiàn)方式,然后就跟他說了一下ThreadLocal以及它的ThreadLocalMap那些……以及它不會內(nèi)存泄漏的原因)
(面后復盤補充,jvm中虛擬機棧、程序計數(shù)器、本地方法棧都是線程私有的)
23.算法:二叉樹的右視圖
(思路是層次遍歷最后一個,但是連層次遍歷都寫錯了)
24.算法:兩個棧實現(xiàn)隊列
(寫出來了,但是面試官說可以優(yōu)化,沒說好)
25.講講實習項目遇到的問題
(項目的長時間運行崩潰的問題:
1.描述程序的整個結(jié)構運作過程;
2.問題處理思路:
(1)如何探究原因;
(2)找到原因后嘗試解決,嘗試提出解決方案;
(3)無法解決,寫好日志分析報告交給leader;
面試官:那最后這個問題解決了嗎?
我:我離職了不知道情況了。
面試官:這個問題你可以問問他們解決了沒有。
我:那我想問一下您認為有什么解決辦法嗎?
面試官:沒有接觸這一類的問題,我也不清楚。)
26.有什么想問我的:
工作氛圍(哪方面的氛圍?學習氛圍、加班情況);
程序員職業(yè)發(fā)展建議以及如何快速融入工作。
三面:(記不全)
自我介紹
內(nèi)核態(tài)用戶態(tài)的區(qū)別
用戶態(tài)可以訪問內(nèi)核態(tài)的內(nèi)存嗎,你說的一些有風險的指令,具體是怎么阻止用戶態(tài)程序去執(zhí)行有風險的指令的
既然用戶態(tài)不可以訪問內(nèi)核態(tài)的內(nèi)存,那么在做一些比如網(wǎng)絡連接的操作的時候肯定需要內(nèi)核態(tài)內(nèi)存,用戶態(tài)程序怎么做到使用內(nèi)核態(tài)內(nèi)存的
說到跨進程通信方式,你知道有什么跨進程通信方式嗎?
你說到的共享內(nèi)存,管道,消息隊列,binder他們之間有什么區(qū)別嗎?
你說到廣播、內(nèi)容提供器也有使用binder與AMS通信,那他們與binder之間有什么區(qū)別嗎(廣播、內(nèi)容提供器的實質(zhì)是不是就是binder)?
為什么要寫這樣一個測速的程序?
兩個Activity,一個顯示商品列表,一個實現(xiàn)商品詳情頁,在商品詳情頁點了關注之后,怎么使得返回商品列表之后也更新了關注狀態(tài)呢?
你說的發(fā)布訂閱模式,你知道有什么框架使用了這個設計模式嗎?
假如兩個Activity數(shù)據(jù)量比較大呢,要更新相當多的東西呢?
你把model層設置為單例的話,那這個列表不斷下滑,加載更多內(nèi)容,最后導致占用相當多的內(nèi)存怎么辦?liveData、ViewModel你可以了解下
算法題:"www.toutiao.cn"轉(zhuǎn)成"cn.toutiao.www"
有什么想問我的?(在頭條工作的體驗?這個你可以問hr)
四面:(記不全)
你是哪里人?為什么選擇投上海的崗位?除了上海,還有什么意向的城市嗎?為什么不喜歡北京?上海也是這樣啊?
問專業(yè)。與程序相關的課程有多少?有學計算機組成原理、計算機網(wǎng)絡嗎?
除了看書以外學習途徑?你在安卓的群上一般討論什么東西?印象深刻的是什么?
你在wifi是上海的實習嗎?你這個在wifi的部門不是專門做安卓的吧?有沒有安卓方面導師?都是靠你自己摸索的嗎?項目有幾個人在負責,都是你在負責嗎?
因為什么而接觸安卓?你在這個團隊里負責什么角色?貢獻了多少代碼比如有多少頁面是你寫的?
有沒有什么社團之類的讓你接觸安卓?
有什么想問我的?(問了對應屆生的期望)
hr面:(記不全)
你認為你前面的面試表現(xiàn)怎么樣?
你是女生為什么要來上海這么遠工作?
你覺得抖音(還是字節(jié)跳動來著)怎么樣?
你提到技術驅(qū)動型,你認為怎么樣才是技術驅(qū)動型公司?
你提到你是抖音的用戶,但是使用頻率不高,是因為什么,因為抖音的內(nèi)容質(zhì)量不好嗎?
你提到抖音是音視頻相關,你對音視頻開發(fā)是比較感興趣嗎?
實習工作中有沒有遇到什么較大的問題?這個問題是什么原因有沒有探究?
大學期間有沒有遇到什么比較大的挫折?
你提前批有投過頭條沒有通過,是因為沒有準備好嗎?
如果通過了面試,你會提前來實習嗎?
有什么想問我的?(在頭條工作的體驗?我這個崗位的發(fā)展空間?)