看他死皮賴臉跟在后面沒有要走的意思,也索性由他去了。
打開門,鄭飛揚跟自己家一樣,關(guān)了門,而且還檢查了一下門關(guān)的嚴實不嚴實,檢查完之后,打量著房間,踱步到沙發(fā)前,坐了下來,掃了一下桌子,懶洋洋地說:“不給我倒杯水嗎?你就是這樣招待客人的嗎?”
我看了看桌子瞥了眼他,笑道:“我大包小包風(fēng)塵仆仆過來住的酒店,哥哥,還能帶著吃的喝的嗎?”
“那水總有吧?妹妹?”
“沒有,他這壺不知道多少人用過了,我不想用?!?p> “那你給我找個啥喝行嗎?剛喝完酒,嗓子疼?!彼笠谎?,尋了個舒適的位置,扶著額頭,食指輕點太陽穴。
“?。磕俏蚁氯ソo你買點兒吧,你想喝什么?”我站到他面前。
“算了,別下去了,你出去萬一找不回來咋辦?”
“沒事,我自己想喝,順便給你帶,別想太多,你喝什么?”
“那你看著買吧?!彼托?,好似看穿了我的掩飾和局促。
我按電梯下樓,腳步軟綿綿的,像踩在棉花上,一切都像一場夢,我在腦海里設(shè)想過很多再次見面的場景,沒想到在我毫無準備的時候就匆匆見了,晃了晃腦袋,走進商店,看到五顏六色琳瑯滿目的飲料,我不知道該選什么,誰讓我是個天秤座呢,選擇恐懼癥,如果選不了要不都不買,要不全買了,這種情況下,明顯只能選擇后者咯,想了想先拿了一瓶農(nóng)夫山泉,想了想他好像喜歡喝茉莉蜜茶,我喜歡茉莉清茶,一樣一瓶,對了,他好像喝了酒,買個酸奶吧,喝了酒是不是得頭疼,還是再那個維生素飲料吧,不知不覺,懷里已經(jīng)摟了一大堆了,付了賬回去,我也是一天沒喝水了,打開茉莉清茶,邊走邊喝,進屋把東西往他面前一放。
“你咋買了這么多,有錢人就是不一樣啊?!?p> “喝吧,喝完早點兒走吧,我困了,想早點兒睡覺了?!?p> 他剛擰開瓶蓋,喝了一口,聽見我說的話,放下飲料,不滿道:“你這是攆我呢?這么不歡迎我。本來還想著說我現(xiàn)在在做面試官,也面試了不少人,想看看幫你看看簡歷,再給你說說重點知識呢,哎呀,主人既然趕人了,那我也不得不走啊?!?p> 話雖這樣說,但是他連一點兒要走的意思都沒有。
“怎么會呢?我這剛剛喝了口茶,忽然就精神了好多,一點兒睡意也沒有。我們快開始吧?!蔽艺0椭劬?,裝作無辜的樣子。
他也不搭理我,我趕忙上前又拿了一瓶飲料獻殷勤。
可他根本不理我這茬,“我這瓶還有呢?!?p> “那...我們從哪兒開始呢?”
“你站這兒?”我趕緊繼續(xù)坐到我的落地窗上。
“那先給你圈一下重點吧,你好好聽啊?!?p> “好的呢,鄭老師。”
“其實也沒啥重點知識,首先你要知道集合框架都有哪些?”半天沒動靜,問:“問你呢?”
“啊,問我啊,有List、Map、Set,list有ArrayList和linkedlist,map有hashmap、treemap、hashtable,set有hashset、treeset、sortedset?!?p> “嗯,可以。那你知道ArrayList和linkedlist的區(qū)別嗎?”
“對于隨機訪問get和set(查詢方法),ArrayList優(yōu)于LinkedList,因為LinkedList要移動指針。對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。ArrayList底層是數(shù)組實現(xiàn)的,linkedlist底層是雙鏈表。ArrayList線程不安全,效率高;linkedlist線程安全,效率低?!边@個很基礎(chǔ),我還是知道的。
“答得挺好的嘛?!彼⑽⒁恍Γ跋乱粋€,hashmap和hashtable的區(qū)別呢?”
“HashMap和Hashtable都實現(xiàn)了Map接口主要的區(qū)別有:線程安全性,同步synchronization,以及速度。HashMap可以接受為null的鍵值key和值value,而Hashtable則不行。HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable,Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。另一個區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。由于Hashtable是線程安全的也是synchronized,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。HashMap不能保證隨著時間的推移Map中的元素次序是不變的。
hashMap和Hashtable的區(qū)別都實現(xiàn)了Serializable接口,都支持序列化,實現(xiàn)了Cloneable接口,能被克隆。 HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子默認都是0.75。 HashMap擴容時是當(dāng)前容量翻倍,Hashtable擴容時是容量翻倍+1 HashMap是非線程安全的,只是用于單線程環(huán)境下,多線程環(huán)境下可以采用concurrent并發(fā)包下的concurrentHashMap。HashTable是線程安全的。 HashMap中key和value都允許為null。在HashMap 中,null 可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應(yīng)的值為null。 Hashtable 的鍵值都不能為null。”
“可以啊,小腦瓜可以記這么多東西,有點兒東西啊?!彼谎鄄徽?粗?,繼續(xù)問:“hashmap底層的實現(xiàn)原理呢?”
“HashMap是Map接口的實現(xiàn)類,鍵值對存儲,并允許null作為鍵的值,線程不安全,即方法為非同步方法。jdk7.0中的HashMap采用數(shù)組+鏈表形式進行存儲,但是如果一個數(shù)組對應(yīng)的鏈表長度過大時,通過key進行查詢時效率較低;為了提高效率,jdk8.0中HashMap最大的優(yōu)化亮點就在于采用了數(shù)組+鏈表+紅黑樹的存儲方式。jdk8.0的HashMap 底層結(jié)構(gòu)依然是一個數(shù)組(默認長度為16)也稱為哈希表,同樣的數(shù)組元素是一個單向的鏈表,每一個數(shù)組存儲的元素代表的是每一個鏈表的頭結(jié)點;一個鏈表長度>=8,數(shù)組的長度不小于 64 時,會將此鏈表轉(zhuǎn)換為紅黑樹的存儲方式?!蔽覂?nèi)心還是有點兒開心的,勞資背了那么久,還算是有點兒用呢。
“可以,mysql隔離級別呢?有幾種?”
“四種,讀提交,讀未提交,重復(fù)度,可串行化?!?p> “這個很簡單吧,其實面試也就很簡單的。樂觀鎖悲觀鎖知道嗎?”
“樂觀鎖CAS,悲觀鎖synchronized、ReentrantLock?!?p> “那synchronized和lock你知道有什么區(qū)別嗎?”
“Lock 能完成 synchronized 所能實現(xiàn) Lock 相對 synchronized 線程有更直觀的語義和更好的性能。 Lock 是重入鎖,即一個線程可以多次獲取同一個鎖,重入鎖的性能相對 synchronized 較高;不過從 JDK6.0開始,JDK 在 synchronized 做了大量的優(yōu)化,使得兩者性能差距縮減。Lock 需要利用 unlock()方法在 finally 中手動釋放鎖標記;而 synchronized 可以自動釋放鎖標記。”
“死鎖要怎么處理?”
“改變加鎖的順序,利用 Lock 中的 tryLock()方法試圖獲取鎖標記,盡可能避免鎖的嵌套使用?!?p> “內(nèi)存模型知道嗎?”
“嗯......”我冥思苦想半天,忘記了,這個太難背了,“我記不起來了。”
他嘴角微揚,反而比剛才更高興,“虛擬機棧:描述的是 java 方法執(zhí)行的內(nèi)存模型,每個方法被執(zhí)行的時候,都會創(chuàng)建一個“棧幀”用于存儲局部變量,操作棧,方法出口等信息。每個方法被調(diào)用到執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機棧中從入棧到出棧的過程。聲明周期與線程相同,是線程私有的。堆內(nèi)存:也叫 java 堆,CG 堆。是 JVM 中所管理的內(nèi)存中最大的一塊內(nèi)存區(qū)域,是線程共享的,在 JVM 啟動時創(chuàng)建。存放了對象的實例及數(shù)組。方法區(qū):用于儲存虛擬機加載的類信息,常量,靜態(tài)變量,是各個線程共享的內(nèi)存區(qū)域運行時常量池:方法區(qū)的一部分,Class 文件中除了有類的版本,字段,方法,接口等描述信息外,還有一項信息就是常量池,用于存放編譯器生成的各種符號引用,這部分內(nèi)容將在類加載后放到方法區(qū)的運行時常量池中。”他頓了頓,“我能抽根煙嗎?”
“不能。一會兒就睡覺了,一股煙味沒法睡?!?p> 他還是自顧自地拿了根煙點著了,“我就抽一根。”他抽了兩口,繼續(xù)說:“程序計數(shù)器是最小的一塊內(nèi)存,它的作用是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,在虛擬機的模型里,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支,循環(huán),異常處理,線程恢復(fù)等基礎(chǔ)功能都需要依賴計數(shù)器完成。直接內(nèi)存:直接內(nèi)存并不是虛擬機內(nèi)存中的一部分,也不是 JVM 規(guī)范中定義的內(nèi)存區(qū)域。jdk1.4中新加入的 NIO,引入了通道與緩沖區(qū)的 IO 方式,它可以調(diào)用 Native 方法直接分配堆外內(nèi)存,即本機內(nèi)存,不會影響到對內(nèi)存的大小。設(shè)計模式你都知道哪些?”
“單例模式,多例模式,工廠模式,適配器模式,代理模式?!?p> “嗯,你知道單例模式有哪幾種嗎?”
“懶漢模式,餓漢模式?!?p> “他倆有什么區(qū)別呢?”他說著又點了一根煙。
“誒?你不是說好了就抽一根嗎?”
他撒嬌似的眼神看了我一眼,說:“說區(qū)別呢?”
“懶漢模式的話是剛開始只聲明不創(chuàng)建,使用的時候才創(chuàng)建,餓漢模式是剛開始在聲明的時候直接創(chuàng)建對象。”
“其實也就這么多東西,細節(jié)你在看看,spring那些注解你看看,AOP、IOC?!彼戳搜凼謾C,好像有什么急事,也不提問了,“你簡歷呢?我給你看看?!?p> “電腦上?!?p> “電腦呢?”
“包里?!?p> “趕緊拿啊,不然讓我咋看?”
我趕緊打開電腦包,啟動電腦。
“還可以,沒啥大問題,但是你這項目寫的太詳細了,你可以稍微簡略一點兒,不然你都寫了人家到時候看簡歷就行了,還問你啥啊,而且你這寫的這么詳細,倒時候面試你一緊張答不上來,人家也知道你哪些沒答上來,你不寫他們很多不知道細節(jié),并不會問太多的?!蔽野央娔X放在落地窗上,我倆湊在電腦屏幕前,可以聞到他身上淡淡的酒味,我正跑了神,他忽然道:“你又漂亮了?!?p> “一直很好看?!?p> “追你的人不少吧?!彼ゎ^看著我。
感受到他灼熱的目光,我隨口答:“還行還行?!?p> 他忽然打我胳膊一下,嚇了我一跳,“你還可以可以,你還嘚瑟上了?!?p> “你打我?!蔽抑钢?,一臉不可置信。
“我就打你,怎么?”
我也打了他一下,說:“讓你打我?!?p> 打裝作不經(jīng)意對我說:“你剛才出去我看了一下,你上面兩張床,我就睡你這兒了?!?p> “啥?不行?!?p> “就睡一覺我就走了,我爸媽和我姐在我那兒呢,明天一早租了車去舟山,我五點就走。你看看幾點了?”
“十二點十分。”
“太晚了,我在你這兒睡一晚上,明天就走,就這樣說定了?!闭f完徑直穿過客廳走上了樓梯,在上面喊:“我睡哪邊?”
“有一張床我上面放有衣服,你睡另一張吧?!笨此@樣子也不準備走了,也趕不走,我洗了個臉也就上了樓。
拉上隔簾和窗簾,空調(diào)溫度設(shè)置到二十四°,就換了睡衣,蓋上被子,準備睡覺。
那邊傳來聲音,“我們聊聊天吧,好久不見了?!?p> “困了,不聊,睡覺?!蔽曳瓊€身,打開手機。
“我這邊好冷啊,你空調(diào)沒開嗎?”
“開了啊,空調(diào)在我這邊,要不我們換換,你睡這張床?”
“不用了?!焙鋈缓熥右焕?,他走過啦,坐到我床邊的吊椅上,“我們聊聊天吧?!?p> “你咋過來了?”
“那邊太冷了?!彼Z氣里好像有點兒撒嬌的感覺。
“那我睡那邊吧?!蔽艺f完起身就要走。
他淡淡來了句,“別走,以后可能就沒這機會了?!?p> 我頓住,繼續(xù)躺了下來。
“你最近還好嗎?”他幽幽來這么一句。
“還好?!蔽夷帽蛔游孀〈蟀肽?,使勁兒往被子里鉆。
“我這段時間每天就學(xué)學(xué)英語,下班回家偶爾周末打打游戲,有空了周末偶爾和朋友出去吃個飯。其實這段時間也有幾個女生追我,朋友知道我單身也給我介紹了女生讓我認識,可是我沒有什么興趣,也不想耽誤了別人,要是以前,我可能就收了他們,隨便玩玩,但是現(xiàn)在年紀大了吧,沒啥意思感覺。”
“給我講這些干什么?”
“咱們不是聊天呢嗎?”
“我不想知道你私生活,跟我有啥關(guān)系?!蔽矣滞桓C鉆了鉆。
“好冷啊。”他忽然鉆進我被窩。
“你干啥?孤男寡女的?!蔽彝硪贿吙苛丝?。
“別騙自己了?!彼麥惤叶?,“其實你內(nèi)心是期待的,不是嗎?不然你也不會讓我睡你這兒吧?!?