面試崗位
Java開發(fā)工程師(校招)
一面(2021.0914)
快手不知道為啥沒有統(tǒng)一筆試,直接發(fā)起的面試。問的八股文很全面,算法題出的也讓我感覺很好。
基礎題
-
Java基礎數(shù)據(jù)類型有哪些绞愚,占多少位?
答:共有8種颖医,分別是:- boolean 布爾:1位
- byte 字節(jié):8位
- short 短整數(shù):16位位衩,2字節(jié)
- char 字符:16位,2字節(jié)
- int 整型:32位熔萧,4字節(jié)
- float 單精度:32位糖驴,4字節(jié)
- long 長整數(shù):64位,8字節(jié)
- double 雙精度:64位佛致,8字節(jié)
double運算時需要注意什么贮缕?為什么
答:精度丟失,比方說當比較時俺榆,可以用差的絕對值小于一個極小值來說明兩個變量相等感昼。原因是做計算時十進制會先轉(zhuǎn)換成二進制,但是有的十進制轉(zhuǎn)換成二進制是無限小數(shù)罐脊,必然會有精度舍棄巧颈。
你知道
float
是怎么存儲小數(shù)的嗎蝎毡?
答:以6.5432
為例串前,整數(shù)部分用模二取余法:
6 / 2 = 3 …… 0
3 / 2 = 1 …… 1
1 / 2 = 0 …… 1
得到6
的二進制表示110
度硝。小數(shù)部分用乘二取整法:
0.5432 * 2 = 1 + 0.0864
0.0864 * 2 = 0 + 0.1728
0.1728 * 2 = 0 + 0.3456
0.3456 * 2 = 0 + 0.6912
0.6912 * 2 = 1 + 0.3824
0.3824 * 2 = 0 + 0.7648
0.7648 * 2 = 1 + 0.5296
可以得到
組合得到二進制為
左移兩位,使小數(shù)點前只有一位1
上炎,即恃逻,則存儲時指數(shù)為
則最終6.5432
存儲結(jié)果為0(符號位) 10000001(指數(shù)) 1010001 01000000 00000000
-
volatile關鍵字作用
參考資料《【Java線程】volatile的適用場景》
答:volatile具有可見性和有序性,但是沒有原子性藕施。他可以使得它修飾的變量寇损,每次修改時先同步到主存,每次使用前都從主存直接獲取铅碍。這個操作保證了它的可見性润绵。同時他的引入將避免指令重排的現(xiàn)象,保證了有序性胞谈。
適用場景:- 用來標記某一個一次性狀態(tài)已發(fā)生
- 單例模式取消指令重排
- 獨立觀察
- volatile bean
- 開銷較低的讀-寫鎖策略
泛型了解嗎,他有什么用處?
答:在集合類實現(xiàn)的時候烦绳,如果想實現(xiàn)一個通用的可以處理不同類型的類卿捎,需要使用Object作為屬性和方法參數(shù)。然后具體操作時再去做強制轉(zhuǎn)換径密,一來是使用時不方便午阵,二來是只有運行時才能知道傳入集合的值類型是否正確。因此在JDK 1.5之后享扔,引入了泛型的概念底桂。
泛型的本質(zhì)是參數(shù)化類型,把要操作的數(shù)據(jù)類型當做一個參數(shù)傳入惧眠,這樣在編譯時就可以對存放的內(nèi)容的類型做安全判斷籽懦。private關鍵字作用
答:加了之后的變量和方法,只有在類內(nèi)部才能使用氛魁,外部不能直接調(diào)用暮顺,子類也不會繼承。想調(diào)用的話可以配套寫一對get秀存,set捶码。反射了解嗎?他是在編譯階段還是運行階段或链。
答:運行階段惫恼,反射就是在運行時才知道要操作的類是什么,并且可以在運行時獲取類的完整構造澳盐,并調(diào)用對應的方法尤筐。
比如正常的調(diào)用應該是先new
一個對象,然后使用對象的一些屬性和方法做一些操作洞就。但是反射中可能是先獲得類盆繁,然后通過getConstructor
方法和newInstance
方法來創(chuàng)建一個對象以供使用。反射可以獲得 private 屬性嗎旬蟋?他們倆是不是沖突的油昂。
答:確實可以用getDeclaredField
獲得包含私有變量在內(nèi)的所有成員變量。
private
最主要的目的實際上是為了實現(xiàn)封裝性倾贰,為類內(nèi)的public
方法提供一些支持冕碟,同時不希望被外部直接調(diào)用,或是繼承匆浙。
反射如果單獨的使用某個private
方法或?qū)傩园菜拢蟾怕适菦]有什么作用的,因為本身private
變量可能就已經(jīng)配套有get
和set
首尼;而單獨調(diào)用private
方法可能導致程序異常挑庶;同時原本繼承該類的子類依然不能繼承得到private
成員變量言秸。因此我們可以認為反射對我們希望實現(xiàn)的封裝性(及一個父類的一些內(nèi)部使用方法不影響外部環(huán)境),基本沒有影響迎捺。線程池了解嗎举畸?
答:由于每次創(chuàng)建、銷毀凳枝、或是管理線程都有一定的資源消耗抄沮,因此使用線程池,對線程做統(tǒng)一管理岖瑰,當程序需要線程時叛买,只需要向線程池申請,如果某個線程異常掛掉蹋订,那線程池還可以及時補充率挣。ThreadPoolExecutor
知道哪些?
答:SingleThreadExecutor
:返回一個只有一個線程的線程池辅辩,多余的任務會被放到消息隊列里慢慢執(zhí)行难礼。
FixedThreadPoolExecutor
:返回一個固定線程數(shù)的線程池,任務來時玫锋,如果有空閑線程就立刻執(zhí)行蛾茉,否則同樣存放在消息隊列中;如果線程掛掉撩鹿,及時重新創(chuàng)建線程谦炬。
CachedThreadPoolExecutor
:可以動態(tài)調(diào)整線程池線程數(shù),只要JVM
能支持节沦,可以無限開線程键思,同時如果沒有任務需要也會自動回收。
ScheduledThreadPoolExecutor
:周期性執(zhí)行任務ThreadPoolExecutor
有哪些參數(shù)甫贯?
答:(當時并沒有答出來)
corePoolSize
:核心線程數(shù)吼鳞,及最小同時運行線程數(shù)量。
workQueue
:當新任務來時先判斷線程數(shù)是否到核心線程數(shù)叫搁,若達到赔桌,則放進任務隊列中。
maximumPoolSize
:當隊列達到容量上限時渴逻,將同時運行線程數(shù)變?yōu)樽畲缶€程數(shù)疾党。
keepAliveTime
:若當前實際任務數(shù)不超過核心線程數(shù),但運行中的線程數(shù)超過了時惨奕,等待keepAliveTime
時間后雪位,才進行銷毀。
unit
:keepAliveTime
參數(shù)的實踐單位
threadFactory
:創(chuàng)建新線程的工廠類
handler
:飽和策略:線程容量和隊列容量同時飽和時執(zhí)行策略梨撞。包括①拒絕新任務 ②增加隊列容量 ③ 直接丟棄 ④ 丟棄最早任務雹洗。默認使用第一種香罐。GC
了解嗎,怎么判斷某個對象應該被回收队伟?
答:兩種方法:引用計數(shù)法和可達性分析穴吹。
引用計數(shù):對于某個對象幽勒,每有一個地方引用他嗜侮,計數(shù)器加 1,引用時效啥容,計數(shù)器減 1锈颗。當計數(shù)值為 0 時說明對象應該被回收。
可達性分析:從GC root
出發(fā)咪惠,所有不可達的對象會被標記击吱。GC root
有以下幾種: ①虛擬機棧:棧幀中的本地變量表引用的對象 ②native方法引用的對象 ③方法去中的靜態(tài)變量和常量引用的對象-
G1
怎么做的標記和清除,過程是什么遥昧?
答:G1
會將內(nèi)存劃分成若干個小塊覆醇,且標記為老年代、Eden
炭臭、Survivor
永脓,然后執(zhí)行Young GC
,如果對象存活就會被轉(zhuǎn)移到Survivor
上鞋仍,如果存活時間多于閾值常摧,就會晉升老年代。而G1
的老年代垃圾回收威创,就或用到標記清理過程:- 初始標記:
Stop the World
落午,標記可能有引用指向老年代對象的Survivor
區(qū),此操作與一次Young GC
同時肚豺。 - 掃描根區(qū)域:掃描
Survivor
區(qū)中引用到老年代的引用溃斋。 - 并發(fā)標記:在堆上找活著的對象,并標記
- 再次標記:
Stop the World
吸申,完成堆內(nèi)存中存活對象標記梗劫,使用SATB
算法 - 清理:
Stop the World
,統(tǒng)計+擦寫+重置空heap
區(qū) - 拷貝:
Stop the World
呛谜,轉(zhuǎn)移或拷貝存活對象到未使用的heap
區(qū)
- 初始標記:
三次握手四次揮手
答:握手時:甲說嘿我要和你聊天了在跳,乙回復我知道了,甲回復乙我知道你知道了隐岛。此時雙方確認對方可以接收消息猫妙,因此開始建立連接發(fā)送消息。
揮手時:甲說我說完了聚凹,乙說好的我知道了割坠,但此時乙可能還有消息沒有發(fā)送完畢齐帚。等了一會之后乙也發(fā)送完畢了,通知甲自己要中斷連接了彼哼,甲收到之后回信知道了对妄,并中斷連接,乙收到后也中斷連接敢朱。
在兩個過程中剪菱,都是通過比方說一個發(fā)送信號x
,另一個發(fā)送x+1
這樣的形式拴签,驗證對方確實收到自己發(fā)出的信號孝常。TCP是什么?
答:TCP是面向連接的蚓哩,全雙工的构灸,可以提供可靠地連接服務。連接時使用三次握手岸梨,斷連時使用四次揮手喜颁。TCP可以通過確認、重傳曹阔、窗口半开、擁塞控制等機制保證數(shù)據(jù)正確性,但效率較低次兆,且開銷比UDP要大稿茉。MYSQL 索引的數(shù)據(jù)結(jié)構什么樣?
答:B+
樹芥炭,B
樹是在中間節(jié)點及葉子節(jié)點都可以存放信息的一棵樹漓库,而B+
樹則是所有信息均被存放在葉子節(jié)點,且在所有葉子節(jié)點間园蝠,從左至右存在一條鏈表渺蒿,這樣的好處是比方說我們想查一段區(qū)間中的索引值,那我們只需要找到兩端彪薛,然后通過那條鏈表就可以很快的獲取到我們想要的所有數(shù)據(jù)信息茂装。而且B+樹查詢更穩(wěn)定。
算法題
很喜歡這個算法題善延,不難但是考察有沒有刷過題非常好少态。
- 給一個鏈表
1,2,3,4,5,...,n
,把他變成1,n,2,n-1,...
這種形式的鏈表返回
答:先快慢指針找到中間點易遣,然后把右半段鏈表逆序彼妻,然后雙指針兩頭向中間靠近。