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