轉載出處:http://www.nowcoder.com/discuss/3244?type=2&order=0&pos=1&page=1java
和大多數的面經不一樣,我不是大牛,手頭也沒有3,4個 sp 的 offer 求比較,我只是一個非211,985的本科應屆畢業生,想分享一下本身坎坷的求職歷程,來給更多求職路上迷茫的應屆生一些鼓勵,特別是本科應屆生。另外還要特別感謝北郵信安研二的趙翔,還有研三信安的吳博,清華的羅金輝,雖然只是作了短短一兩個月的同事,可是在以後一直盡其所能的幫助我,鼓勵我。還有研三信安的胡相鐸,很是感謝這位大神在技術學習上對個人指導!面試
8月初就開始準備校招,一直到10月份下旬,一切都結束塵埃落定了。由於家在深圳而人又在北京,因此我一開始就打算在北京參加校招,找回深圳的工做,真正實踐下來,仍是至關有難度。我是非985,211的應屆本科生,像這種技術崗位,在北京,面臨的問題不只僅是你學校是否是重本的問題,還有不少中科院,清北,北郵,北航,北理工的研究生跟你一塊兒競爭,除非你真的很是優秀,拿過ACM獎,或者實習經歷和項目經歷都很是豐富,你的簡歷纔有經過的可能,否則極可能連簡歷篩選這關都沒法經過。若是一些非重本的本科應屆生,想要從事技術崗位的工做,必定要好好豐富本身的履歷,一我的在學校悶頭學和外出實習學習,兩者的能學到的東西,比較起來真的差不少。我運氣比較好,遇到了至關開明的輔導員和系主任,都表示願意放我走,因而大三就開始在已經在三星實習。算法
像我這種非重本的本科應屆畢業生,在不少地方都至關受歧視。有些企業點名就只要211的畢業生,好比華爲,中興等等。我如今仍然記得我最受屈辱的一件事情;當時華爲在北郵的宣講會結束,容許宣講會後找面試官直接投遞簡歷,面試官在收到個人簡歷後,連個人實習經歷都沒多看一眼,直接翻到最後找到我學校,而後露出一副鄙夷的態度,把簡歷打還給我,表示不接受非重本的應屆畢業生。我當時心情沮喪到幾天都沒緩過來,心神恍惚,淋着雨走到了地鐵站,連地鐵都坐過了站。我幾可預見即將到來的2個月是我人生第二個轉折,卻沒想到迎頭就摔了一個大大的跟頭,2個月以後我會去往哪裏,夙願的offer可否拿到,可否回到家人身邊工做,種種矛盾與迷茫,聚集成激流,洶涌而至。數據庫
真正的心態的轉變,是從網易的第一通電話開始的,也算是個人第一次面試的開始。感謝北郵人這個平臺,讓我找到了內推碼,才把簡歷發了出去。網易的內推至關早,基本8月初就已經開始了,你們必定要儘早寫好簡歷,不少好的互聯網公司也是從8月份就開始了內推,我我的認爲整個內推流程下來,感受難度和後期參加的BAT,TMD的(頭條,美團,滴滴)校招差很少,你們不須要擔憂難度會很大,最要緊的仍是儘早複習,準備好基礎知識。編程
回到網易的內推上,電話面試其實也有不少坑,並非全部的面試官都有備而來想好了面試的一系列問題。更多時候他只是想了解你對於項目經歷的深刻程度,須要你主動的講解項目經歷。我曾經聽過在網易電面就掛了的同窗的吐槽,他當時在魅族實習,公司規定進行的項目須要保密,當面試官問他項目經歷時候,他便回答說這個保密不能說,面試官當場就不高興了(可能以前電面太多同窗了有點累了不耐煩了),以爲他在裝逼,沒聊10分鐘就這同窗喪失了興趣掛了電話。因此你們應該在內推前,應該想好如今在公司的項目,什麼該說什麼不應說。另外,在你主動講解項目的時候,不要介紹的太淺,能夠仔細聊聊你在項目中遇到的棘手的技術難題或者難以實現的項目需求,你是怎麼突破實現的,從而引發面試官的興趣,引導他在你熟悉的技術上對你發問。我大概和麪試官聊了45分鐘,順利經過了第一輪面試。數組
第二輪技術面試,由於時間問題趕不到杭州了,我選擇了視頻面試,短信告知要求使用網易的易信進行視頻面試,結果面試過程當中各類聲音延遲,視頻卡頓,面着面着就不得以改爲了語音面試,面試官也叫苦不迭,真是本身人坑了本身人。第二面時間至關緊,說好的10點半結果拖到11點15才面,可能面試官趕着吃飯,見面還沒打招呼問題就上來了,炮彈式發問,答到點上立刻就提出下一問題。面試官那裏應該有個列表的,照着列表提問,根據回答給予不一樣程度的評分。都是 Android 開發題目,問題至關的細,當時問了這麼一個問題:View中onTouch,onTouchEvent,onClick的執行順序,若是隻是簡單的在學校寫下 Demo,是很難把這麼細的問題回到上來的,只有真正的參與到整個 App 開發流程,才能回答上來。面了45分鐘左右,答得七七八八,讓我等 HR 通知瀏覽器
在我很意外的狀況下接到了 HR 面,由於等的時間比較長,我幾乎都認爲個人網易面已經跪了。HR 面也是至關的鬥智鬥勇,上來讓我介紹下我本身,作過什麼項目,我的的職業規劃是什麼,課外興趣有哪些,手頭有別家 Offer 嗎,最後難點來了,問我爲何會選擇來杭州,家人是否有在杭州的,感受這個就被卡住了,臨時急匆匆撒了個慌,感受這個地方答得太蹩腳,最後讓我說下本身的5個缺點,我以本身可能有些冒失悲觀爲由跟她講了一下我參加華爲宣講會簡歷被拒的經歷,她反倒安慰起我,忘記問我後面2個缺點了,不知道要不要感謝華爲。一個 offer 就這個到手了緩存
拿到網易 offer 後已是9月底,手頭也有一家C 輪的北京創業公司的 offer,但是我仍是但願能的找到深圳的工做。與騰訊在北京地區的校招失之交臂後,華爲中興兩家雖在深圳,無奈又卡我學歷。我雖然順利經過幾家互聯網公司的網上筆試,進入面試環節,可是今年互聯網寒冬真的來的太猛了,北京地區競爭又激烈,說是鳳毛麟角都不爲過了,基本上校招的問題的難度已經和社招沒什麼區別的,印象最深的還有一道題目,讓應用防第三方清理的方法,面試官要求我說至少4種,我腦汁絞盡,除了最基本的雙進程守護外,連利用 Android 4.1 的系統漏洞獲取臨時Root權限假裝成系統級應用都說了,才勉強放過我。安全
百度在深圳也有Android 開發的崗位,雖然線上筆試雖然過了,可是我投的時候選擇的是在北京參加面試,應聘的是深圳地區的崗位。我機緣巧合下獲得了深圳地區的 HR 的電話,詢問在深圳地區的Android 開發的崗位的狀況,她回答我說在其餘城市進行校招時已經招滿了。我心情瞬間跌到谷底,在北京找回深圳的工做的但願正式宣告破滅了,我下決心回深圳參加社招拼一拼(深圳幾乎沒有什麼校招宣講會)。性能優化
在深圳海投一波簡歷後,我也確實經過了很多公司的面試,無奈別人是社招的崗位,須要我馬上上崗工做,我學校還有事情要處理,不可能全職工做的。在這裏也給你們提個醒,不到萬不得已,不要參加社招,時間上的確合不來,並且企業也更容易毀約,大部分大規模的公司,用人方面都有規定,只容許應屆生走校招流程進來。
就我認爲我但願再次破滅之際,忽然接到美圖公司的電話,我已經說明我是應屆生,不能馬上報道,他們說沒問題他們這邊有校招名額空缺(以前在北郵有宣講會,沒去成),問我方便過來深圳分公司這邊面試嗎?我一口答應下,次日到公司後,一路筆試,技術面試,HR 面,CTO 面,輕車熟路過關斬將,下午就收到Offer,可能我以前在三星也是作圖像處理類的 App 比較多,技術那邊以爲至關符合指望,薪資比以前談的還要高了一點。瞬間以爲以前受的背運白眼都有了回報,真是苦盡甘來了。
就在答應過幾天去美圖籤三方了,結果求之不得的騰訊忽然打電話來技術面試,想起原來是社招的投的簡歷,問的問題至關有難度,答的磕磕巴巴的,覺得沒戲了,晚上打電話來又要求到總部面。感受本身像個快結婚的人了,忽然學生時代的初戀女神過來撩撥一下你,明知不可能卻又心存僥倖,心情起起伏伏又患得患失,人生的精彩不過如此吧。最後再次與騰訊失之交臂,加入了美圖。
最後分享一下乾貨,是我在面試美團,今日頭條,網易,騰訊等公司時候遇到的面試題,但願能給你們接下來的面試帶來幫助!若是我有哪裏寫得不對的,歡迎知乎私信我!
我的知乎連接http://www.zhihu.com/people/hong-lou
J2EE 部分:
- Switch可否用string作參數?
- equals與==的區別:
- equals是比較兩個對象的值是否相等,而==比較這兩個是不是同一對象
- Object有哪些公用方法?
- 方法equals測試的是兩個對象是否相等
- 方法clone進行對象拷貝
- 方法getClass返回和當前對象相關的Class對象
- 方法notify,notifyall,wait都是用來對給定對象進行線程同步的
- Java的四種引用,強弱軟虛,用到的場景
- 強引用:若是一個對象具備強引用,它就不會被垃圾回收器回收。即便當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。若是想中斷強引用和某個對象之間的關聯,能夠顯式地將引用賦值爲null,這樣一來的話,JVM在合適的時間就會回收該對象
- 軟引用:在使用軟引用時,若是內存的空間足夠,軟引用就能繼續被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用纔會被垃圾回收器回收。
- 弱引用:具備弱引用的對象擁有的生命週期更短暫。由於當 JVM 進行垃圾回收,一旦發現弱引用對象,不管當前內存空間是否充足,都會將弱引用回收。不過因爲垃圾回收器是一個優先級較低的線程,因此並不必定能迅速發現弱引用對象
- 虛引用:顧名思義,就是形同虛設,若是一個對象僅持有虛引用,那麼它至關於沒有引用,在任什麼時候候均可能被垃圾回收器回收。
- 使用場景:
- 利用軟引用和弱引用解決OOM問題:用一個HashMap來保存圖片的路徑和相應圖片對象關聯的軟引用之間的映射關係,在內存不足時,JVM會自動回收這些緩存圖片對象所佔用的空間,從而有效地避免了OOM的問題
- 經過軟可及對象重獲方法實現Java對象的高速緩存:好比咱們建立了一Employee的類,若是每次須要查詢一個僱員的信息。哪怕是幾秒中以前剛剛查詢過的,都要從新構建一個實例,這是須要消耗不少時間的。咱們能夠經過軟引用和 HashMap 的結合,先是保存引用方面:以軟引用的方式對一個Employee對象的實例進行引用並保存該引用到HashMap 上,key 爲此僱員的 id,value爲這個對象的軟引用,另外一方面是取出引用,緩存中是否有該Employee實例的軟引用,若是有,從軟引用中取得。若是沒有軟引用,或者從軟引用中獲得的實例是null,從新構建一個實例,並保存對這個新建實例的軟引用
- Hashcode的做用,與 equal 有什麼區別
- 一樣用於鑑定2個對象是否相等的,java集合中有 list 和 set 兩類,其中 set不容許元素重複實現,那個這個不容許重複實現的方法,若是用 equal 去比較的話,若是存在1000個元素,你 new 一個新的元素出來,須要去調用1000次 equal 去逐個和他們比較是不是同一個對象,這樣會大大下降效率。hashcode其實是返回對象的存儲地址,若是這個位置上沒有元素,就把元素直接存儲在上面,若是這個位置上已經存在元素,這個時候纔去調用equal方法與新元素進行比較,相同的話就不存了,散列到其餘地址上
- String、StringBuffer與StringBuilder的區別
- String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象
- StringBuffer和StringBuilder底層是 char[]數組實現的
- StringBuffer是線程安全的,而StringBuilder是線程不安全的
- Override和Overload的含義去區別
- Overload顧名思義是從新加載,它能夠表現類的多態性,能夠是函數裏面能夠有相同的函數名可是參數名、返回值、類型不能相同;或者說能夠改變參數、類型、返回值可是函數名字依然不變。
- 就是ride(重寫)的意思,在子類繼承父類的時候子類中能夠定義某方法與其父類有相同的名稱和參數,當子類在調用這一函數時自動調用子類的方法,而父類至關於被覆蓋(重寫)了。
- 抽象類和接口的區別
- 一個類只能繼承單個類,可是能夠實現多個接口
- 接口強調特定功能的實現,而抽象類強調所屬關係
- 抽象類中的全部方法並不必定要是抽象的,你能夠選擇在抽象類中實現一些基本的方法。而接口要求全部的方法都必須是抽象的
- 解析XML的幾種方式的原理與特色:DOM、SAX、PULL
- DOM:消耗內存:先把xml文檔都讀到內存中,而後再用DOM API來訪問樹形結構,並獲取數據。這個寫起來很簡單,可是很消耗內存。要是數據過大,手機不夠牛逼,可能手機直接死機
- SAX:解析效率高,佔用內存少,基於事件驅動的:更加簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數作相應動做,而後繼續一樣的掃描,直至文檔結束。
- SAX:與 SAX 相似,也是基於事件驅動,咱們能夠調用它的next()方法,來獲取下一個解析事件(就是開始文檔,結束文檔,開始標籤,結束標籤),當處於某個元素時能夠調用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調用它的nextText()獲取本節點的值。
- wait()和sleep()的區別
- sleep來自Thread類,和wait來自Object類
- 調用sleep()方法的過程當中,線程不會釋放對象鎖。而 調用 wait 方法線程會釋放對象鎖
- sleep睡眠後不出讓系統資源,wait讓出系統資源其餘線程能夠佔用CPU
- sleep(milliseconds)須要指定一個睡眠時間,時間一到會自動喚醒
- JAVA 中堆和棧的區別,說下java 的內存機制
- 基本數據類型比變量和對象的引用都是在棧分配的
- 堆內存用來存放由new建立的對象和數組
- 類變量(static修飾的變量),程序在一加載的時候就在堆中爲類變量分配內存,堆中的內存地址存放在棧中
- 實例變量:當你使用java關鍵字new的時候,系統在堆中開闢並不必定是連續的空間分配給變量,是根據零散的堆內存地址,經過哈希算法換算爲一長串數字以表徵這個變量在堆中的"物理位置」,實例變量的生命週期--當實例變量的引用丟失後,將被GC(垃圾回收器)列入可回收「名單」中,但並非立刻就釋放堆中內存
- 局部變量: 由聲明在某方法,或某代碼段裏(好比for循環),執行到它的時候在棧中開闢內存,當局部變量一但脫離做用域,內存當即釋放
- JAVA多態的實現原理
- 抽象的來說,多態的意思就是同一消息能夠根據發送對象的不一樣而採用多種不一樣的行爲方式。(發送消息就是函數調用)
- 實現的原理是動態綁定,程序調用的方法在運行期才動態綁定,追溯源碼能夠發現,JVM 經過參數的自動轉型來找到合適的辦法。
- JAVA 垃圾回收機制
- 什麼是垃圾回收機:釋放那些再也不持有引用的對象的內存
- 怎麼判斷一個對象是否須要收集?
- 引用計數(最簡單古老的方法):指將資源(能夠是對象、內存或磁盤空間等等)的被引用次數保存起來,當被引用次數變爲零時就將其釋放的過程
- 對象引用遍歷(如今大多數 jvm 使用的方法):對象引用遍歷從一組對象開始,沿着整個對象圖上的每條連接,遞歸肯定可到達(reachable)的對象。若是某對象不能從這些根對象的一個(至少一個)到達,則將它做爲垃圾收集
- 幾種垃圾回收機制
- 標記回收法:遍歷對象圖而且記錄可到達的對象,以便刪除不可到達的對象,通常使用單線程工做而且可能產生內存碎片
- 標記-壓縮回收法:前期與第一種方法相同,只是多了一步,將全部的存活對象壓縮到內存的一端,這樣內存碎片就能夠合成一大塊可再利用的內存區域,提升了內存利用率
- 複製回收法:把現有內存空間分紅兩部分,gc運行時,它把可到達對象複製到另外一半空間,再清空正在使用的空間的所有對象。這種方法適用於短生存期的對象,持續複製長生存期的對象則致使效率下降。
- 分代回收發:把內存空間分爲兩個或者多個域,如年輕代和老年代,年輕代的特色是對象會很快被回收,所以在年輕代使用效率比較高的算法。當一個對象通過幾回回收後依然存活,對象就會被放入稱爲老年的內存空間,老年代則採起標記-壓縮算法
- 講講 Java 中的集合有多少種,區別是什麼?
- ArrayList、LinkedList、Vector的區別:ArrayList 和Vector底層是採用數組方式存儲數據,Vector因爲使用了synchronized方法(線程安全)因此性能上比ArrayList要差,LinkedList使用雙向鏈表實現存儲,隨機存取比較慢
- HashMap的底層源碼實現:當咱們往HashMap中put元素的時候,先根據key的hashCode從新計算hash值,根據hash值獲得這個元素在數組中的位置(即下標),若是數組該位置上已經存放有其餘元素了,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最早加入的放在鏈尾。若是數組該位置上沒有元素,就直接將該元素放到此數組中的該位置上。
- Fail-Fast機制:在使用迭代器的過程當中有其餘線程修改了map,那麼將拋出ConcurrentModificationException,這就是所謂fail-fast機制。這一機制在源碼中的實現是經過modCount域,modCount顧名思義就是修改次數,對HashMap內容的修改都將增長這個值,那麼在迭代器初始化過程當中會將這個值賦給迭代器的expectedModCount。在迭代過程當中,判斷modCount跟expectedModCount是否相等,若是不相等就表示已經有其餘線程修改了Map.
- HashMap和 HashTable 的區別:
- HashTable比較老,是基於Dictionary 類實現的,HashTable 則是基於 Map接口實現的
- HashTable 是線程不安全的, HashMap 則是線程不安全的
- HashMap可讓你將空值做爲一個表的條目的key或value
Android部分:
- 註冊廣播有哪幾種方式,有什麼區別
- 繪製 Activity 的生命流程圖
- 註冊Service須要注意什麼
- Service與Activity怎麼實現通訊
- Handle通訊具體到源碼,是怎麼實現的
- Handle的機制
- 怎麼實現ListView多種佈局?
- ListView與數據庫綁定的實現
- 怎麼實現一個部分更新的 ListView?
- ListView卡頓的緣由與性能優化,說的越多越好
- Android中的動畫有哪些,區別是什麼
- JNI怎麼使用
- 說說內存泄露的狀況有哪些
- OOM是怎麼引發的?怎麼儘可能避免 OOM 問題的出現
- 什麼是 ANR 問題?爲何會引發 ANR 問題?
- Socker編程的步驟
- 設計一個圖片緩存加載機制
- Fragment嵌套多個Fragment會出現bug嗎
- Activity中如何動態的添加Fragment
- 內存不足時,怎麼保持Activity的一些狀態,在哪一個方法裏面作具體操做?
- Scrollview怎麼判斷是否滑倒底部
- ViewPager 的怎麼作性能優化
- Asynctask具體用法?
- Asynctask的Do in background方法是怎麼通知UI線程刷新進度條的?
- Asynctask的Do in background方法默認是返回 true ,表示任務完成,若是想返回具體的數據呢,怎麼作。若是Activity被銷燬了,還會執行到postexcutd方法嗎?
- View中onTouch,onTouchEvent,onClick的執行順序
- 不使用動畫,怎麼實現一個動態的 View?
- Postvalidata與Validata有什麼區別?
- Asset與raw都能存放資源,他們有什麼區別?
- 如何自定義ViewGroup?
- 什麼是 MVC 模式?MVC 模式的好處是什麼?
- JVM 和Dalvik虛擬機的區別
- 應用常駐後臺,避免被第三方殺掉的方法,講講你用過的奇淫巧技?
- 數據持久化的四種方式有哪些?
數據結構與算法部分:
- 給最外層的rootview,把這個根視圖下的所有button背景設置成紅色,手寫代碼,不準用遞歸
- 給一串字符串好比abbbcccd,輸出a1b3c3d1,手寫代碼(注意有個別字符可能會出現十次以上的狀況)
- 一個序列,它的形式是12349678,9是最高峯,經歷了一個上升又降低的過程,找出裏面的最大值的位置,要求效率儘量高
- 二叉查找樹的刪除操做,手寫代碼
- 反轉鏈表,手寫代碼
- 二分查找,手寫代碼
- 有海量條 url,其中不重複的有300萬條,如今但願挑選出重複出現次數最高的 url,要求效率儘量的高
- 一篇英語文章,去掉字符只留下k個,如何去掉才能使這k個字符字典序最小
- 弗洛伊德算法和 Dijkstra算法的區別?複雜度是多少?講講 Dijkstra算法的具體過程
- 反轉字符串,要求手寫代碼,優化速度、優化空間
- 給出兩個無向圖,找出這2個無向圖中相同的環路。手寫代碼
- 單例模式,手寫代碼
- 生產者與消費者,手寫代碼
- 二叉樹鏡像,手寫代碼
- 最長不重複子串(最長重複子串),手寫代碼
操做系統部分:
- 分別從操做系統的內存角度與進程線程角度解釋分析堆,棧兩者的區別
- 什麼是事務?
- OSI七層模型有哪些,各層次的做用
- TCP的三次握手過程,四次揮手過程,爲何須要三次?
- 說說操做系統中進程的通訊方式
- 瀏覽器輸入地址以後,以後的過程
- 談談 HTTP 中Get 和 Post 方法的區別?