一個(gè)Java小白的面試之旅總結(jié)

前言

今天去了一家國內(nèi)領(lǐng)先的可視化智能硬件公司面試。面試的我是技術(shù)總監(jiān)畸颅。為人和藹没炒,和他交談中犯戏,我還有一股緊張笛丙。面試中骨稿,能感覺他功力深厚,同時(shí)也學(xué)到了很多東西形耗。個(gè)人感覺激涤,我對自己的面試結(jié)果不是很滿意倦踢。技術(shù)總監(jiān)問的問題比較深入辱挥,也是我平時(shí)比較疏忽的知識點(diǎn)。


關(guān)于Int類型的理解

面試官問我int類型占幾個(gè)字節(jié)晤碘。我是這樣說的: "占4個(gè)字節(jié),在內(nèi)存中占32位功蜓≡耙可能不同的操作系統(tǒng)占的字節(jié)不一樣。" 我真的是強(qiáng)行裝逼式撼,給自己挖坑童社。面試官說:"為什么不一樣"。 然后我說:"我記得博客上面是這樣說的端衰。"

可能是面試官說的意思是在Java語言中int類型占幾個(gè)字節(jié)叠洗。而我印象中的那篇博客說的是int類型跟OS有關(guān),所以面試的要老老實(shí)實(shí)回答問題旅东。

  • 操作系統(tǒng)是32位/64位灭抑,尋址空間不同。尋址空間一般指的是CPU對于內(nèi)存尋址的能力抵代。也就是最多用到多少內(nèi)存的一個(gè)問題荤牍。32位的CPU一次就能處理4個(gè)字節(jié),64位的CPU一次可以處理8個(gè)字節(jié)同辣。int類型在32位和64位系統(tǒng)中都是4個(gè)字節(jié)。

  • Java程序不是直接運(yùn)行在OS上,而是運(yùn)行在JVM上伏穆,JVMclass程序在不同OS上的基礎(chǔ)類型長度固定涛酗,也就是int類型就是4個(gè)字節(jié)。所有平臺上的JVM向上提供給Java字節(jié)碼程序的接口完全相同,但向下適應(yīng)不同平臺的接口則互不相同。


Int類型的使用

忘記是我主動拋出Int類型的使用聚至,還是面試官給我拋出的贷币。請?jiān)徫业挠浶蕴盍讼就佟K圆灰獜?qiáng)行顯擺自己的實(shí)力亡呵,你在技術(shù)總監(jiān)面前什么都不是。我舉的是二分法,尋找中間元素下標(biāo)的例子。" int mid = (a + b) / 2铸题。int類型的范圍是-2^31 ~ 2^31 - 1驹针。我是這樣說的:a如果是一個(gè)足夠大的int類型數(shù)據(jù),b如果也是一個(gè)足夠大的int類型數(shù)據(jù)。那么a + b 數(shù)據(jù)的范圍肯定超過了int類型的范圍,會造成內(nèi)存泄露。我的做法是改成 int mid = a + (b - a) / 2。這樣可以避免造成內(nèi)存的泄露七蜘,同時(shí)減少了內(nèi)存的開銷损搬。"

說出這個(gè)答案,我心中一陣竊喜。然后面試官又給我拋出了這樣的問題,“那你為什么不用int mid = a /2 + b/2 "吠架。但是我覺得這個(gè)問題還好,不是特別難。我就說: "這種做法的性能沒有我的好,因?yàn)?a / 2 做了一次運(yùn)算赶诊,然后 b / 2 又做了一次運(yùn)算寓调,然后把他們加在一起又做了一次運(yùn)算痛悯,內(nèi)存開銷比較大驯耻。"

然后面試官說可缚,“這種回答并不能說服我,可能你的做法性能上確實(shí)比較好描姚,但是根本原因是內(nèi)存開銷的問題嗎澄步?”武氓。當(dāng)時(shí)我就懵了弱睦,不知道說什么了况木。最后面試官告訴了答案:“計(jì)算機(jī)不擅長做除法運(yùn)算尸疆!”

  • 所有數(shù)字在計(jì)算機(jī)底層都是以二進(jìn)制存在的筐咧。計(jì)算機(jī)以補(bǔ)碼的形式保存所有的整數(shù)。計(jì)算機(jī)不擅長做除法。除法一般都是減法和移位的綜合體碉怔。

  • Java支持的位運(yùn)算符有7個(gè):

    • &:按位與烘贴。當(dāng)兩位同時(shí)為1時(shí)才返回1
    • |:按位或撮胧。只要有一位為1即可返回1桨踪。
    • ~:按位非。單目運(yùn)算符芹啥,將操作數(shù)的每個(gè)位(包括符號位)全部取反锻离。
    • ^:按位異或铺峭。當(dāng)兩位相同時(shí)返回0,不同時(shí)返回1汽纠。
    • <<:左移運(yùn)算符卫键。
    • >>:右移運(yùn)算符。
    • >>>:無符號位右移運(yùn)算符虱朵。比如-5>>>2莉炉,-5無符號右移動2位后,左邊空出2位后碴犬,空出來的2位用0去補(bǔ)充絮宁。
  • 突然想到int mid = a / 2 + b / 2 這種做法還有其他的問題,就是如果ab都是一個(gè)偶數(shù)服协,這樣得出的結(jié)果不會有影響绍昂,這樣假設(shè)a = 2b = 2蚯涮,那么算式1治专,算式2得出的結(jié)論mid都是等于2。 那么假如a = 1, b = 3遭顶,算式1得出的結(jié)論是2张峰,算式2得出的結(jié)論是1。顯而易見棒旗,算式2會造成精度缺失喘批,最后就會導(dǎo)致二分法錯(cuò)誤。


字符型

  • 字符型通常用于表示單個(gè)的字符铣揉,字符型值必須使用單引號括起來饶深,Java語言使用16位的Unicode字符集作為編碼方式,而Unicode被設(shè)計(jì)成支持世界上任何書面語言的字符逛拱,包括中文字符敌厘,因此Java程序支持各種語言的字符。

表單重復(fù)提交

后面朽合,我就不具體講和面試官的細(xì)節(jié)了俱两。直接概要出面試官拋出的問題和復(fù)盤分析。

我們在添加數(shù)據(jù)的時(shí)候曹步,如果表單重復(fù)提交宪彩,肯定會造成數(shù)據(jù)庫表的數(shù)據(jù)重復(fù)。

  • 客戶端生成token讲婚,存在于表單的hidden域尿孔,接著把token存入session中。表單提交后,后臺比較表單的tokensession中的token活合,如果相等的話雏婶,就表示表單沒有重復(fù)提交,如果不相等的話芜辕,證明表單重復(fù)提交尚骄。如果表單沒有重復(fù)提交的話,就把session中的token清空侵续。假如發(fā)送100條請求倔丈,第一條請求肯定是會通過的,后面的99條請求會因?yàn)?code>session中的tokennull状蜗,造成請求失敗需五,從而防止了表單重復(fù)提交。

  • 當(dāng)客戶端輸入的數(shù)據(jù)提交到后臺轧坎,后臺添加的數(shù)據(jù)會與數(shù)據(jù)庫表中的數(shù)據(jù)進(jìn)行比較宏邮,如果不重復(fù)則寫入,可以防止表單重復(fù)提交缸血。如果2個(gè)對象相同的話蜜氨,那么它們的hashCode肯定相同。如果2個(gè)對象的hashCode相同捎泻,那么它們不一定是相同的對象飒炎。重寫equals()方法,必須要重寫hashCode()方法笆豁。

  • 數(shù)據(jù)庫中郎汪,增加一個(gè)int類型的hash值字段,加上索引闯狱。將所有的業(yè)務(wù)信息(排除主鍵id煞赢,create_time之類的字段)計(jì)算hash值。往表里面添加數(shù)據(jù)的時(shí)候哄孤,先計(jì)算hash值照筑,然后用hash值去數(shù)據(jù)庫中查詢,查詢結(jié)果為多個(gè)的時(shí)候瘦陈,可以去做精確比較朦肘。

hashCode()解決數(shù)據(jù)重復(fù),是一個(gè)不錯(cuò)的選擇双饥。


MySQL數(shù)據(jù)庫

基本概念

  • DML(Data Manipulation Language): 數(shù)據(jù)操作語言,主要由insert, delete, update三個(gè)關(guān)鍵字完成弟断。

  • DDL(Data Definition Language): 數(shù)據(jù)定義語言咏花,主要由create, alter, drop, truncate這四個(gè)關(guān)鍵字完成。

  • DCL(Data Control Language):數(shù)據(jù)控制語言,主要由grant(準(zhǔn)許)和 revoke(撤銷)兩個(gè)關(guān)鍵字組成昏翰。

  • primary key : PRIMARY KEY(id), 有2個(gè)作用苍匆,一是約束作用(constraint),用來規(guī)范一個(gè)存儲主鍵和唯一性棚菊,但是同時(shí)也在該key上建立了一個(gè)索引浸踩。

  • unique key: UNIQUE KEY deal_id_uk(deal_id), CONSTRAINT deal_id_uk UNIQUE(deal_id)兩種寫法都可以,有2個(gè)作用统求。一是規(guī)范數(shù)據(jù)的唯一性检碗,建立索引。

  • key : 建立索引码邻。

  • index : create index deal_id_idx on employees(deal_id)折剃。index是數(shù)據(jù)庫的物理結(jié)構(gòu),索引總是屬于數(shù)據(jù)表像屋,當(dāng)它和數(shù)據(jù)表一樣都是屬于數(shù)據(jù)庫對象怕犁。創(chuàng)建索引的唯一作用是加速對表的查詢,索引通過使用快速路徑訪問方法快速定位數(shù)據(jù)己莺,從而減少了磁盤的I/O奏甫。

基礎(chǔ)概念說完了,怎么去規(guī)范的創(chuàng)建數(shù)據(jù)表呢凌受。再此部分引用阿里巴巴Java開發(fā)手冊的的建表規(guī)約索引規(guī)約阵子。

  • 表達(dá)是與否的概率的字段,必須使用is_xxx的方式命名胁艰,數(shù)據(jù)類型是unsigned tinyint(0-255)款筑,1代表刪除,0表示未刪除腾么。任何字段如果是非負(fù)數(shù)奈梳,必須是unsigned

  • char的長度是固定的解虱,而varchar的長度是可變的攘须,比如我存一個(gè)字符串,叫“cmazxiaoma”,對于char(20)來說表示你存儲的字符將占20個(gè)字節(jié)殴泰,其中包括10個(gè)空閑字符于宙,而同樣varchar(20)只會占用10個(gè)字節(jié),20個(gè)字節(jié)只是最大值而已悍汛。

  • varchar是可變長字符串捞魁,不預(yù)先分配空間,長度不要超過5000离咐,如果存儲長度大于此值谱俭,定義字段類型為text奉件,獨(dú)立出來一張表。用主鍵去對應(yīng)昆著,避免影響其他字段的索引效率县貌。

  • 字段允許冗余尤勋,以提高查詢性能锐极,但必須考慮數(shù)據(jù)的一致,冗余字段應(yīng)該遵循:不是頻繁修改的字段橡类,不是varchar超長字段接谨,更不是text字段摆碉。

  • 業(yè)務(wù)上具有唯一特性的字段,即使是多個(gè)字段的組合疤坝,也必須建成唯一索引兆解。不要以為唯一索引影響insert的速度,這個(gè)速度的損耗可以忽略跑揉,但是提高查詢速度是明顯的锅睛,另外,即使在應(yīng)用層做了非常完善的校驗(yàn)控制历谍,只要沒有唯一索引现拒,根據(jù)墨菲定律,必然有臟數(shù)據(jù)的產(chǎn)生望侈。

  • 區(qū)分度與索引長度的權(quán)衡印蔬。索引長度越低,索引在內(nèi)存中占的長度越小脱衙,排序越快侥猬。然而區(qū)分度就很低了,不利于查找捐韩。索引長度越長退唠,區(qū)分度越高,雖然利于查找荤胁,但是索引在內(nèi)存占的空間就越多了瞧预。


數(shù)據(jù)庫三大范式

  • 列名不可再分,保持原子性仅政。
  • 每一個(gè)非主屬性必須依賴于主鍵垢油。消除部分函數(shù)依賴
  • 除了主鍵之外,其他屬性之間不能相互依賴圆丹。消除傳遞依賴滩愁。

尾言

心之所向,素履以往辫封。生如逆旅惊楼,一葦以航玖瘸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市檀咙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌璃诀,老刑警劉巖弧可,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異劣欢,居然都是意外死亡棕诵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門凿将,熙熙樓的掌柜王于貴愁眉苦臉地迎上來校套,“玉大人,你說我怎么就攤上這事牧抵〉殉祝” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵犀变,是天一觀的道長妹孙。 經(jīng)常有香客問我,道長获枝,這世上最難降的妖魔是什么蠢正? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮省店,結(jié)果婚禮上嚣崭,老公的妹妹穿的比我還像新娘。我一直安慰自己懦傍,他們只是感情好雹舀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谎脯,像睡著了一般葱跋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上源梭,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天娱俺,我揣著相機(jī)與錄音,去河邊找鬼废麻。 笑死荠卷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烛愧。 我是一名探鬼主播油宜,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼掂碱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慎冤?” 一聲冷哼從身側(cè)響起疼燥,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚁堤,沒想到半個(gè)月后醉者,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡披诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年撬即,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呈队。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剥槐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宪摧,到底是詐尸還是另有隱情粒竖,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布绍刮,位于F島的核電站温圆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏孩革。R本人自食惡果不足惜岁歉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膝蜈。 院中可真熱鬧锅移,春花似錦、人聲如沸饱搏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推沸。三九已至备绽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鬓催,已是汗流浹背肺素。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宇驾,地道東北人倍靡。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像课舍,于是被迫代替她去往敵國和親塌西。 傳聞我的和親對象是個(gè)殘疾皇子他挎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容