《變態面試官》系列—Java基礎(一)

2021-02-20 九神說編程

0、鍥子

一入編程深似海,編程世界Very深。

這裡是九神說編程,今天給大家說的是一個頂級大佬閒的無聊,在編程世界已經999級,閒來無事去新手村練小號的故事。

大佬本以為只要拿出0.001%的功力就可以輕鬆入職升級了,沒有想到卻遇上了變態面試官!

「看來,我需要使出我1%的功力了!」,大佬明悟道。

介紹一下作者本人,我雖名為九神,但在那場大戰中連觀戰的資格都沒有,以下的一切都是大佬小號口傳於我的。而我,只是以第一人稱口述,記錄下了那場對決的萬分之一!

1、面試開始

我看到一個頭髮濃密,全身西服筆挺的30歲大叔面試官向我走來。

不經意間掃過這位大叔腕上的百達翡麗和標著「LOTOS」字樣的眼鏡。

看著對方這張好像在我長遠記憶中見過的帥氣臉龐,我突然意識到——有殺氣!


1、你好,我們先來幾個簡單問題熱熱身吧,先講講Java有哪幾種基本類型?

認真的回答道:大叔你好!在Java中,一共有8種基本類型。分別是:整數類型:byte,short,int,lon;浮點數類型:float,double;字符類型:char;布爾類型:boolean。

注意:遇到面試官一定要禮貌!回答問題要有邏輯,按照種類歸類比你一口氣說出8種類型好的多。

2、在Java中(2.0-1.1 == 0.9)是true還是false?

是false,因為2.0-1.1最終輸出的是0.89999999,而不是0.9。在Java中,(2.0-1.1 < 0.9)才是true。

3、那為什麼輸出的是0.899999而不是0.9?如何解決?

因為在Java中浮點數值採用二進位表示,而在二進位系統中無法精準表示分數1/10。(就好像十進位沒法精準的表示1/3)。

如果想解決這個問題,就需要使用BigDecimal類而不是使用浮點數。

4、嗯,答得不錯,那你看看下面這個題的答案是什麼?為什麼會是這樣?

大叔不想說話並向我丟我來一道題目:

答案是true,false,false。

因為Integer n1 = 100;這種語句實際上是自動裝箱,把int類型轉換成了int的包裝類Integer。在Integer中,Java為了提高運行效率,需要進行自動裝箱時,如果數字在一個字節內,也就是-128至127之間時,會直接使用緩存中的對象,而不是重新創建一個對象。

100在這個範圍內,所以第一個語句是true;200不在這個範圍內,所以第二個語句是false。

Java中Integer自動裝箱實際調用的是Integer.valueOf()方法,直接new一個並不是自動裝箱,而是新建了一個對象,所以第三個語句是false。

另外,在Java9之後,就不推薦使用new Integer()的做法了。

注意:講完原有知識點,帶出不同Java Version的不同,是很好地加分項。

5、有沒有辦法更改自動裝箱的範圍?

可以通過修改JVM參數-XX:AutoBoxCacheMax=size來更改自動裝箱池的大小。

額,好像開始有點東西了啊!這是1級難度的問題麼?

6、嗯,小夥子看來還可以啊!那麼以下語句輸出的結果是什麼?

我不假思索的回答:第一個是b,第二個是99。

因為'a'在Unicode字符集中的排序位置編碼是97,++之後自增+1變成了b,b的編碼是98,再調用x+1之後是直接被自動類型轉換為int類型,輸出99。

1級的題目就問Unicode編碼位置了,還好我是小號,這面試官誠心的吧?

7、那基本數據類型中自動類型轉換規則是什麼?

是從存儲範圍小的類型到存儲範圍大的類型,也就是:byte ->short(char)->int->long->float->double這樣轉換。

8、不錯,你剛才講到了Unicode,Java中char採用的編碼方式是哪種?

是UTF-16。

9、那Java為什麼會選擇UTF-16呢?

因為歷史上 Java一開始選擇的是 UCS-2,是一個定長的編碼,在當時以單個碼元能表示所有字符,以下標獲取字符的開銷基本等同於在數組中索引一個字符,用起來是最方便的,多佔用的內存大小也是可以接受的。

到了後來 UCS-2 無法表示所有 Unicode 字符的時候,過渡到了兼容它的 UTF-16 上也是最自然以及遷移成本最低的選擇。

好像畫風開始不太對頭了?這是歷史題吧

10、UTF-16是怎麼實現Unicode編碼的?

問道這題我感受到了面試官一陣殺氣,他是想壓住我麼?感覺1級小號不配全答對麼?

哈哈哈,幸虧我只是小號!待我用999級超凡的理解予以回擊!

於是,我鄭重言辭的說道:

這個想法很自然,我先講講設計思路

在2個字節的Unicode字符集中,按道理能存放2的16次方,也就是65536個字符。但是為了擴容,特別的劃出了一片區域不存儲正常的字符

這時候,只要拿兩個Unicode字符拼在一起形成4個字節,如果第一個Unicode字符對應那片本不應該存儲字符的區域,這兩個拼起來的Unicode字符就可以看成一個新的大字符。

這樣就能成倍數的擴增原有的字符集而不需要對原有的整個字符集做任何改動。還擁有看了首位Unicode字符就能判斷屬於哪個擴增類型的好處。

我再來說說具體的做法吧。

我們把Unicode中每個字符對應的16進位的值稱為代碼點(code point),並且加上前綴以示和16進位的區分,比如U+0097代表'a'。我們把擴充後的Unicode字符集劃分為17個代碼級別(code plane)。

第一個代碼級別稱為基本的多語言級別,也就是大家常說的BMP(basic multilingual plane),代碼點從U+0000到U+FFFF,其中包括了原有的經典Unicode字符集;

其餘的16個附加級別,代碼點從U+10000到U+10FFFF,這裡存放的都是輔助字符,也是擴充的部分。

UTF-16採用可變長度的編碼來表示所有Unicode的代碼點。在BMP中,每個都是2位元組字符,我們稱之為代碼單元(code unit);

而輔助字符採用一對連續的代碼單元進行編碼,其中第一個代碼單元採用的範圍正是BMP中空出的代替區域(surrogate area)中的值,即0xD800-0xDFFF這部分。

UTF-16就是通過這種可變長度的辦法來對應了Unicode編碼集中的每個字符的。

而Java中的char類型用UTF-16編碼描述一個代碼單元。

哈哈,這波面試官已經被團滅了吧!

這個回答,完全超越了教科書的回答啊!先講了設計思路,再談實現辦法,妥妥的向面試官證明自己能搞一套類似的字符集出來啊!這肯定直接拉到面試滿分了啊!

NICE!NICE!NICE!NICE!NICE!

11、如果使用UTF-8,UTF-32代替UTF-16分別有什麼利弊?

UTF-8佔用的內存空間最小,根據碼不一樣分別佔據1~4個字節;UTF-32佔用的內存空間最大,每次都佔據4個字節。

對於超過佔用1個字節的Unicode碼時,UTF-8的因為需要運算所以速度就會比UTF-16和UTF-32慢;

對於超過佔用2個字節的Unicode碼時,UTF-16的因為需要運算所以速度就會比UTF-32慢。

因為我們日常使用的都是BMP中的碼,所以UTF-16是一個中庸的選擇。

這面試官還不死心麼?1級還問選型題?

2、面試結束

面試官大叔看了一眼手腕上的百達翡麗,說時間不早了,要不先這樣吧,讓我回去等下次面試的通知。

我問道:那什麼時候下次面試呢?

「等你升到2級的時候吧!」,面試官留下這就話就走了。

這面試官如此變態麼?全對還要等我升級再面?

3、後續

那大佬如何才能升級呢?據大佬透漏,需要有人給他的口述點讚達到一定數量方可升級,只有升級到2級,才能進入第二面!

這就是有幸聆聽大佬口述,我來執筆寫下這篇文章的緣由!

還不給點讚麼?沒下一篇了啊!

4、閒話

在面試過程中,一般面試官都會根據面試者做過的項目為引子,引導面試者說出面試者所有會的內容,而並非隨機發問打地圖炮。

一個優秀的面試官往往是在不經意間已經知道你做的項目是否真實和你的水平。

類似本文中變態面試官持續高壓的提問式常見於年輕的面試官,覺得技術有高低,一定要壓到面試者才是勝利。

九神私以為技術只有是否匹配,並無高下之別。

有高下之別的更可能是每個人trouble shooting和理解學習的能力,招聘是case by case的事情,挖掘自身優秀的點就能進入好公司拿到高薪offer哦!

5、點關注,不迷路

好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是能進大廠的高端人才

我後面會每周都更新幾篇網際網路大廠面試和常用技術棧相關的文章,非常感謝高端人才們能看到這裡。

如果這個文章寫得還不錯,覺得「九神說編程」有點東西的話   求點讚👍求關注❤️  求分享👥  對九神來說真的 非常有用!!!

注意:博文會比公號晚一周哦!

白嫖不好,創作不易, 各位的支持和認可,就是我創作的最大動力,我們下篇文章見!

 

相關焦點

  • 《變態面試官》系列——JVM基礎你會麼
    我愛學習,學習使我媽快樂,我媽快樂全家快樂好看請點讚,不喜請輕噴一入編程深似海,編程世界Very深。這裡是九神說編程,今天給大家說的是一個頂級大佬閒的無聊,在編程世界已經999級,閒來無事去新手村練小號的故事。大佬本以為只要拿出0.001%的功力就可以輕鬆入職升級了,沒有想到卻遇上了變態面試官!
  • Java面試總結之Java基礎
    無論是工作多年的高級開發人員還是剛入職場的新人,在換工作面試的過程中,Java基礎是必不可少的面試題之一。能不能順利通過面試,拿到自己理想的offer,在準備面試的過程中,Java基礎也是很關鍵的。對於工作多年的開發人員來說,Java基礎往往是會被大家所忽略的,但在面試的過程中,確是必不可少的問題。在這篇文章裡就來為大家總結一下經常會被問到的Java基礎題。
  • 我和面試官的博弈:Java 並發編程篇
    日後我會把此系列整理成 PDF 版本,發布給大家。還請大家置頂(標星)本公眾號:Java後端,第一時間接收優質博面試中問的頻率很高的一個是分布式,一個就是並發。而JUC(java.util.concurrent)裡的東西是並發編程的基石。上次的面試已經過去一段時間,在一邊努力工作的同時,我也一邊抽出時間準備 Java 並發編程的部分。今天懷著輕鬆愉快的心情,再次踏上我的大廠面試之旅。
  • String是java的基礎變量嗎?
    面試過的人都知道,面試會隨著時間越來越基礎,但是也不要這麼基礎呀!面試官看似隨意的拋出了下一個問題:「String是java的基礎變量嗎?」此時面試官的問題宛如一句sql,我那可憐的單核大腦超頻的執行著這個單線程任務,同時不斷的列印出日誌:「嗯...」,"應該...","那個...",「我記得...」,"額..."
  • 面試總結——Java高級工程師
    一、獨白之前也面試別人,現在輪到自己找工作,怎麼說呢,每個面試官的看法不一樣,面試的方式就不一樣,比如我面試別人我喜歡問項目中他用到了那些,然後針對用到的技術去問一些問題,或者說對於某些場景的一些技術實現方案是我特別喜歡問的,比如當你的接口服務數據被人截包了,你如何防止數據惡意提交?
  • 一位Java後臺工程師的面試經歷
    因為面試的是Java後臺開發,而且是屬於之前沒看書純粹通過面試學習面試的,可能對於剛剛工作一兩年準備換工作的Java後臺開 發更有借鑑意義吧。 創業公司:小微律政,愛旅行,遊趣科技 小微律政是法務O2O創業公司,在我面試的過程中正在衝擊A輪融資,所以承諾期權,最終給了offer,最終因為自己希望去大公司而最終拒接了offer,不過個人仍然看好他們的產品。
  • 2017年網友京東Java面試經驗:感覺問的比較基礎,大家都是這樣?
    面試官比較好,說你不能來也很正常,我們來進行一個20分鐘的面試吧。0.HTTP TCP UDP 的區別,具體用在哪些場景。1.說一下 java中的隊列 set map 區別,java裡的數據結構。講講它們的實現。
  • 面試題之java基礎
    應部分網友的建議,從今天起會逐步的總結一些java、php相關的面試題,由簡單到複雜歸納一個系列:【金三銀四】,中間部分題目的答案來源於網絡,如若不嚴謹還望諒解。java基礎面試題 1、簡述Java程序編譯和運行的過程:答:①  Java編譯程序將Java源程序翻譯為JVM可執行代碼--字節碼,創建完源文件之後,程序會先被編譯成 「.class」 文件。
  • 夯實Java基礎系列16:一文讀懂Java IO流和常見面試題
    本文參考並發編程網 – ifeve.comIO概述在這一小節,我會試著給出Java IO(java.io)包下所有類的概述。比如,一次讀取一個字節是很慢的,所以可以從磁碟中一次讀取一大塊數據,然後從讀到的數據塊中獲取字節。為了實現緩衝,可以把InputStream包裝到BufferedInputStream中。
  • 學了1年java的程式設計師面試,掛在了這道基礎算法題!
    這都是java的算法題,應該來講都是些比較簡單的算法題,但是我敢說很多基礎的學習的,或者想去面試的人都會不能完整的寫出來,現在
  • 程序汪幫公司面試3年1萬8的Java程式設計師,基礎的問題沒回答好啊
    這個面試者項目經驗是銀行的積分商城項目,只少需要把積分怎麼產生的或從哪裡來,然後怎麼對外提供查詢,這之間經過多少個系統,技術亮點在什麼地方,面試官一般比較關心亮點,如果你把項目說成一個簡單的CURD薪資肯定要不高了介紹項目建議1 業務的全鏈路邏輯清晰都表達出來2 一定把技術的亮點展示出來
  • java面試系列--J2SE基礎(十二)
    wait是java.lang包的,屬於Object的方法,sleep是屬於Thread的方法;wait的時候,當前線程會釋放資源鎖,然後進入等待鎖定池,只有針對此對象調用notify方法後本線程才會繼續執行,sleep的時候,當前資源鎖並沒有釋放,直到sleep結束然後繼續執行;sleep的時候一般都要對異常進行處理,捕捉或外拋,而且sleep方法是一個靜態方法
  • 面試系列——Java工作6年面試拼多多和阿里經歷附帶面試題
    然後面試官說他們也是這麼做的,所以他說他們的一些操作日誌表有的表已經有分庫分表上萬張了我問面試官的第二個問題是詳情頁的設計,怎麼做的緩存設計?所以這二個問題一提,一面面試官覺得我之前有過思考,就讓我進入了二面。二面二面是hr,聊了薪水,加班,補助等。問我有沒有買房,有沒有在上海買房的打算?如果有的話,二年拼多多就可以湊足首付了。(拼多多二面都是hr,這個是槽點)。
  • 面試官系列 - LeetCode鍊表知識點&題型總結
    >我的掘金:https://juejin.im/user/2207475076966584  github: https://github.com/gdutxiaoxu/  微信公眾號:徐公碼字(stormjun94)  知乎:https://www.zhihu.com/people/xujun94  前言前段時間,寫了面試必備的一系列文章
  • Java 最常見的 200+ 面試題:面試必備
    聊回面試題這件事,這份面試清單原本是我們公司內部使用的,可到後來有很多朋友在微信上聯繫到我,讓我幫他們找一些面試方面的資料,而且這些關係也不太好拒絕,一呢,是因為這些找我,要面試題的人,不是我的好朋友的弟弟妹妹,就是我的弟弟妹妹們;二呢,我也不能馬馬虎虎的對付,受人之事忠人之命,我也不能辜負這份信任。
  • 工作六年總結的Java面試題與經驗
    首先你要知道,面試官的提問和你簡歷上寫的內容是緊密聯繫的,所以你簡歷上寫的技能一定要會。Java基礎、多線程、IO與NIO、虛擬機、設計模式HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底層實現ArrayList、LinkedList、Vector的區別HashMap和ConcurrentHashMap的區別ConcurrentHashMap是怎麼實現線程安全的synchronized、Lock
  • JAVA面試題及答案一百道(SE篇上)——老面試官的經驗之談
    上篇請看這裡-->JAVA面試題及答案一百道(SE篇上)——老面試官的經驗之談本文的面試題裡有部分關於設計模式的題目,但是阿偉要在這裡提醒各位一句話,找工作時面試官的水平可以清晰地反映出這個公司的水平,如果你的面試官抓住設計模式死摳死問,想讓你一成不變的把網上的面試答案背下來
  • 2019 最新 200 道 Java 面試題
    為什麼要公開這些面試題?原因一:身邊從事 Java 開發的人員越來越多,我的表弟表妹們,朋友的表弟表妹們,朋友的朋友的表弟表妹們,每次問我要相同的面試複習材料,已經讓我疲於應付,索性整理出來,直接發連結給他們。
  • Java典型面試題 ——談談你對Java平臺的理解?
    題目本身是非常開放的,往往考察的是多個方面,比如,基礎知識理解是否很清楚;是否掌握 Java 平臺主要模塊和運行原理等。很多面試者會在這種問題上吃虧,稍微緊張了一下,不知道從何說起,就給出個很簡略的回答。對於這類籠統的問題,你需要儘量表現出自己的思維深入並系統化,Java 知識理解得也比較全面,一定要避免讓面試官覺得你是個「知其然不知其所以然」的人。
  • Java面試的的時候你被提過哪些問題?
    同學們在踏出校園那一刻起,邊開始進入了社會,面臨著找工作、面試,那麼,當你被面試的時候,哪些Java題被面試官提問過?下面這些是常被問到的面試題,如果你覺得還有一些經常提到的,我沒有寫出來的,歡迎補充。J2SE基礎:1. 九種基本數據類型的大小,以及他們的封裝類。2. Switch能否用string做參數?3. equals與==的區別。4. Object有哪些公用方法?