如何看待問“a = a + b和a += b有什麼區別”的Java面試官?

黃鑫


如果面試中大量的問題和考驗糾結於這種所謂的基礎知識,我只能替這家公司感到擔憂。在項目實踐過程中,使用a=a+b還是a+=b,不會影響關鍵程序邏輯的構造。是否能講出所謂的區別,也根本無法評估一個開發人員的能力高低。如今的軟件開發行業技術迭代日新月異,各種語言、框架、開發理念設計模式層出不窮,而作為開發者需要時刻保持對新技術的學習掌握使用,根本沒有過多的時間再去計較每一種技術的細微特性,並且是否瞭解這些細節特性實際上並不會對工作質量產生多大的影響。現代的軟件開發人員在很多時候,碰到問題只求快速找到解決方案,以求及時解決當前面臨的問題。例如本人非常頻繁地使用MD5算法,但是自從接觸編程以來,我就沒有認真分析過MD5算法的具體實現過程。在早起的JDK1.4的年代基本類庫中並沒有提供直接的MD5加密工具類,我就谷歌上找了一段現成的代碼。後來apache commons組件庫提供了現成的各種加密算法工具包,我就直接使用這些組建工具進行日常開發。因為我個根本不需要掌握著這些加密算法的實現原理,這種加密解密方法在我眼裡就是一種無需掌握細節便可滿足日常工作的基礎工具包。


微捷Kevin


說實話,如果你的面試官喜歡問這種問題,你可以得到一個結論和做一個決定了!

這個結論是:這個面試官水平應該不算高!

這個決定是:這家公司不要去了吧!

中國大學編程基礎教學最大誤區之一:糾結於各種a++和++a等遊戲

我曾經大學的時候,學習C語言的時候,就是用的某著名教授的暢銷千萬冊的書籍,那時候給我的感覺就是這本書我真的是看不懂,感覺看得是迷迷糊糊的,完全不知道在講什麼,到了重點的指針什麼的也感覺都是猶抱琵琶半遮面。

那時候我的C語言老師,最喜歡搞這種a++和++a的遊戲,而且幾乎每一次上機測驗一定會有一個題目是關於這個的題。

甚至一度我都懷疑是我自己不行,因為聽不懂,感覺老師講的都是天書,而且感覺老師總是要花時間講一些奇奇怪怪知識點,這就是我那時候對於C語言這門課最大的感覺。甚至一度連我這個曾經中學時代就看過一些VB書籍,而且自認為中學時代數學、物理好到爆的學生,都開始懷疑自己,是不是我邏輯思維有問題。

關鍵是按照老師的做,居然還能考高分,更可怕的是考了高分以後都不知道自己為什麼考到的高分,是真的C語言學好了嗎?顯然不是!

後來我實在感覺已經快失去對C語言的最後一點信心了,只是覺得這樣下去不行,我只好自己去百度、去Google,然後自己找資料,現在想想應該感謝這麼課,然後我自己找到了C Primer Plus,最後找到了K&R C,讓我明白不要過分糾結於語法遊戲,對於真正學會編程到底是有多重要。

並且因為這門課讓我沒有被禁錮住,養成了我大學幾年堅持用GitHub、stack overflow、Google、以及學會使用查官方文檔的好習慣。

中國大學編程基礎教學最大誤區之二:萬年不變VC6.0

這是我學生時代經歷的又一大痛楚!

那個年代macOS不能用VC,Windows7上安裝VC6.0也是極為痛苦的,我記得第一次上機實驗的時候,我用codeblocks寫了程序然後交上去,老師又讓我用VC6.0重寫了,於是我只好跑到機房去用那個windows XP上的VC6.0又把作業重新做了一遍提交上去。

我當時就在想,為什麼我們的老師不能為了適應一下時代,就算是不用Xcode這種,用一下比較新版本的codeblocks/devc++,或者是用新一點的visual studio 2008也行啊,要知道VC6.0從1998年發佈到現在足足二十年了!

總之,我覺得編程,應該更多的關注到編程本質上來,而不是糾結於那些對於編程水平並沒有實質性提高的語法細節,多關注關注算法、數據結構我覺得價值更高!


EmacserVimer


在Java中a= a+b與a += b在特定的情況是有區別的,只要有Java常識的都應該知道這些點吧。既然問到了,我看到很多人的回答就是給個demo演示一下,那麼在這裡詳細的講一下吧。

分析具體原因之前有必要先了解一下Java的4個基本知識點,瞭解之後還是不懂,可以來噴我。1、基本數據類型轉換。Java的基本數據類型轉換包含自動類型轉換(也叫隱式類型轉換)強制類型轉換(也叫顯性類型轉換)

自動類型轉換:當把小數據範圍類型的數值或者變量賦給另一個大數據範圍類型的變量,系統可自動完成轉換

強制類型轉換:當把大範圍類型的數值或變量賦給另一個小範圍類型的變量時,此時系統不能自動完成類型轉換,需要加上強制轉換符。但這樣的操作可能造成數據精度的降低或者溢出,所以使用時要格外的注意。

2、我們還得了解基本數據類型在Java中佔位情況。如下圖所示:

3、表達式類型的自動提升當一個算術表達式中包含多個基本數據類型(boolean除外)的值時,整個算術表達式的數據類型將在數據運算時出現類型自動提升。

4、Java中的基本數據類型中整型我們默認都是int型。

當我們清楚的知道基本數據類型的佔位與數據類型的轉換之後,還要知道在賦值符號 =、+=、-=等,它們其實都包含自動類型轉換,但不能進行強制類型轉換

下面是我寫的一個demo,大家看了之後應該能完全明白吧。

上面我註釋中已經說明了隱式類型轉換其實與強制類型轉換差不多,不過只能把小數據範圍類型轉換為大數據範圍的類型。當short b=30,b = b+30;30我們默認是int型,結合我上述的第三點表達式類型的提升,那麼b+30的結果數據類型自動為int,而b的數據類型是short,int不能自動轉為short,所以編譯出錯,編譯出錯說明語法錯誤。

而b += 30,其實是在底層就已經悄悄的給我做了自動轉換,把數據類型轉換為short。但是在轉換時也是有前提的,最大的前提條件就是賦值符右邊的運算結果是否超出左邊變量的數據類型的最大數據範圍。如果超出也是出錯,這時候的出錯我們成為數據紊亂。我還是以一個demo來演示一下吧:

說到這裡,大家應該明白了所有的原理了吧。只要最後紊亂為什麼是-127,不明白的可以在評論區留言交流,也可以私信我。希望我的講解可以給你面試帶來幫助,如果還是不明白的話,直接噴我吧,我也沒辦法啦。明白的人點個贊支持一下!


軟件工程師胡八一


哼哼哼,本姑娘,被Java吊打了兩年的計算機專業學生來告訴你:千萬別以為a=a+b和a+=b是一樣的!

事實上,它們有一些類型和精度上的差異。

這兩種形式的主要區別在於是否進行數據類型的自動轉換,當兩個操作數同類型時這兩種形式的運算結果是沒有差別的,當兩個操作數數據類型不同時,且左操作數即保存結果的操作數的數據精度要低,此時這兩種形式就有區別了。

上面這段話有點繞,舉個例子:

public classDemo

{

public static void main(String[] args) {

short a=4;

int b=5;

a+=b;

System.out.println(a);

}

}

看這個簡單的小程序,定義a是short型的變量,b是int型的變量,當執行a+=b時,能輸出答案為9,程序沒有問題的。

但是!!!

如果把代碼稍微變一變:

public classDemo

{

public static void main(String[] args)

{

short a=4;

int b=5;

a=a+b;

System.out.println(a);

}

}

變成a=a+b之後,就會產生錯誤:



類型不匹配。

原因是:“+=”這個運算符在Java中是一個運算符,而不是兩個,程序在執行“+=”時,會自動向高精度進行數據類型轉換。所以第一個程序在執行時編譯器沒有報錯。

而“=”呢,它要求=兩邊類型一致!我們的代碼中,因為a是short類型的變量,而b為int類型的變量,short類型+int類型結果肯定會自動轉換成int類型啦,此時就存在數據類型不一致的問題,用short類型的變量去保存int類型的變量編譯器當然會報錯了。

就好比你用裝一兩水的杯子去裝二兩水,當然是裝不下的,如果你非要用裝一兩水的杯子去裝二兩水,肯定可以硬到進去,但是肯定會灑掉一部分水。所以如果這裡非要用short類型的變量去裝int類型的數據,可以用強制轉換,確定是會丟失精度。

以下是強制轉換後的結果:

public classDemo

{

public static void main(String[] args)

{

short a=4;int b=5;

a=(short)(a+b);

System.out.println(a);

}

}

強制轉換之後,還是可以的了啦。

看到這裡,你明白這兩者的區別了嗎?

沒有明白的話,紅紅火火恍恍惚惚,問吧,還有哪裡不明白!!!


hello程序媛


在java語言中,a+=b和a=a+b的主要區別是在運算的精度上。類似的有“-= 、 *= 、/= 、%= ”,這裡以a+=b 與 a=a+b 舉例說明一下。

1. 下面是一串代碼,我們試一下a=a+b的形式:

public class TestDemo {

public static void main(String[] args) {

byte a=1;

a=a+4;

System.out.println(a);

}

}

從圖中可以看出出現了錯誤,根本無法運行。報錯原因我也貼出來了,說是“類型不匹配:不能從int轉換為byte”,

裡因為a是byte類型,而數字4默認是int 類型。在java中,在a+4時,會進行 自動類型轉換 ,所以a+4 會轉換成int類型。而變量a還是byte類型,將int 類型的a+4賦值給byte類型的a ,無疑會報錯。

當然,我們也可以進行強類型轉換,將已經轉換成int類型的a+4強制轉換為byte類型,這樣也是可以的。但是這種轉換可能會導致溢出或者精度的下降,如果容忍可能出現的誤差,可以使用這種轉換。

下面是轉換的結果:

public class TestDemo {

public static void main(String[] args) {

byte a=1;

a=(byte)(a+4);

System.out.println(a);

}

}

(2)下面試一試a+=b的形式

public class TestDemo {

public static void main(String[] args) {

byte a=1;

a+=4;

System.out.println(a);

}

}

我們發現結果是正確的,程序也沒毛病。大家需要明確的是“+=”是java中的一個運算符,而不是兩個,所以在運算時 會進行自動類型轉換。所以在編譯時沒有報錯。

(3),總結一下,在兩個變量的數據類型一樣時:a+=b 和a=a+b 是沒有區別的。

但是當兩個變量的數據類型不同時,就需要考慮一下數據類型自動轉換的問題了。

也就是涉及到精度了。

————————————————

原文鏈接:https://blog.csdn.net/m0_38022029/article/details/79606104


弈城


如果僅僅從知識上來說,a = a+b 和 a += b 是不同的,前幾天剛好看到有說這個問題的:

// s1是short類型, 1是int類型, s1 + 1 向上轉型為 int 類型, 無法直接賦值給 short 類型, 需要強制類型轉換

// short s1 = 1; s1 = s1 + 1;

// 顯式賦值操作

short s1 = 1;

s1 = (short) (s1 + 1);


// 能通過編譯, 隱式類型轉換

// 計算操作, 直接轉換

short s2 = 1;

s2 += 1;

System.out.println(s2);


總的老說,就是 a = a+b 會涉及到類型轉換時,必須強制,強制,強制,就是(short)這種才行,否則IDE會提示編譯本身就錯誤;但是 a += b 卻不會,會進行影式類型轉換,不要強制指定即可編譯通過。


面試有時候就是看緣分,有些很基礎的東西,老鳥也未必不被坑。編程中,很多東西還是要靠規範,而不是用一些特殊的操作行為來保證結果符合預期,這樣是會被自己坑死的。面試問到了,想起來就說說,忘記了或者不確定就說不知道,不丟人。不必要耗費太多的精力在裡面,這家不行,就趕緊騰出時間來去下一家。能一起共事,是緣分,不能,就是職場碰面,勤面試就好。


有骨有度


你好,技術面試的話,針對java面試,我是深有體會的,因為我被別人面試過,反過來,我也面試過別人,這種面試既是對參加面試者的考驗,也有很大程度是對面試官的一個考驗,因為作為java面試官,一般他已經坐到了技術經理的位置,或則是一個公司的資深研發級別了。接下來我們從幾個方面分析下問a+=b這種問題的java面試官。

1.技術經理

java面試其實也分幾種初中高級別,作為一個公司的技術經理的話,如果是這種位置的人去面試你,問你這種a=a+b和a+=b區別的問題,一般他就是想看看你基礎紮實不,如果他問出你這樣的問題,那麼在他心裡他都會給你事先定好了一個級別了,初級,如果好一點的話,最多能給你定箇中級java開發。技術經理是有這個權利的。你不要去想面試你的人水平怎麼樣,你作為應聘者,只管回答好面試官的問題好了。

2.資深研發

面試你的人也有可能是一個公司的資深研發,他看完你的簡歷,當你介紹完你的工作經歷後,如果還問你這種a+b的問題,那麼他很有可能只是想緩解下緊張的氣氛,以這種他認為很簡單的問題去打開你們之間的交流,讓你不要那麼緊張而已,這種情況,你就放平心態,好好回答就行了,當然了,這個問題也直接關乎你們接下來他會問你什麼難度的問題,如果你答得很符合他的預期,他對你就很滿意了,接下來也不會多麼的難為你,可能會問你更加深入的問題,但是你答出個大概,加上他的提示你能繼續下去,這個面試也就八九不離十了,當然,他是沒權利給你定級別的,他會把你的面試情況反饋給上級,由上級決定你的級別。

其他情況,面試官問你這種問題,在中小型公司他也有可能只是一箇中高級開發,或則是個項目經理也是有可能出現的。只是這種情況相對較少,我們就不多做描述了。

本人閱歷有限,如各位看官有其他看法,歡迎多多指教,不勝感激。


IT講壇


說實話,如果你的面試官喜歡問這種問題,你可以得到一個結論和做一個決定了!

這個結論是:這個面試官水平應該不算高!

這個決定是:這家公司不要去了吧!


如果硬要說他們兩者之間的區別:在java語言中,a+=b和a=a+b的主要區別是在運算的精度上。


通常在兩個變量的數據類型一樣時:a+=b 和a=a+b 是沒有區別的。

但是當兩個變量的數據類型不同時,就需要考慮一下數據類型自動轉換的問題了,也就是涉及到精度了。


互聯網技術小站


Java中a = a + b和a += b有倆點區別

  • 如果“=”或者“+=”倆邊的數據類型不一樣,那麼“a += b”會進行自動類型從高向低轉換,而“a = a + b”不會。

  • “a=a+b”多了一層中間變量的操作,導致執行效率低於“a+=b”,然而java編譯期默認會對該操作進行優化,最終二者執行效率是一樣的。

我覺得面試官問這個問題屬於正常現象

相信很多初級開發人員對這個問題答案的認知停留在沒有區別的層次上,雖然自己平時這倆種方法可能都用過,但也不會去細究二者的區別,而面試官問這個問題,應該是想對你的java基礎知識的紮實程度做一個瞭解,要知道工作經驗的長短並不是衡量一個人技術高低的標準,也有很多5年工作經驗的開發,技術很差而想要渾水摸魚的情況。畢竟開發也分低級、中級和高級,每個級別的薪資水平不一樣,面試題目當然也不一樣,低級和中級問的比較多的是java基礎的一些問題,而高級開發則會問ssm的源碼、基本原理、高併發、多線程等。

很多人可能對面試官的問題表示不屑一顧,感覺這麼簡單的問題拿來考我簡直是對我的侮辱,亦或是覺得這種工作中根本用不到的問題拿來問簡直是多此一舉,甚至有幾年工作經驗的程序員直接拒絕筆試,我覺得這些都是一種錯誤的態度,真的的技術大牛應該是能夠在任何問題面前寵辱而不驚,用自己的真正實力去證明自己。


以上為個人觀點,歡迎在評論中發表自己不同的觀點,喜歡的加個關注,謝謝。


架構師的成長史


前言:雖然我的專業沒有專門學習過Java語言,但是學習過由清華大學出版社出版的C程序設計和C語言版的數據結構與算法,我能理解提問中Java面試官問到的“a=a+b和a+=b有什麼區別”的問題,可以為您解答,希望對您有實際性或啟發性的幫助。

a=a+b和a+=b有什麼區別”準確來說應該是“a=a+b;和a+=b;有什麼區別”,因為在無論是在Java語言還是在C語言中,分號都是程序代碼必不可少的組成成份,每個分號是一個語句,沒有分號只是一個表達式,表達式是沒有比較意義的,而語句卻可以比較,但a=a+b;和a+=b;”兩個語句並沒有嚴格意義上的區別,二者實現的功能都是把a+b的值賦值給a。前者簡單、通俗,一般用於初學者的教學活動,後者可以體現出較強的專業性。在我學習過的C程序設計中有簡單提到,但並沒作區別介紹,只是建議初學者慎用“a+=b;”。

當面試官問到“a=a+b;和a+=b;有什麼區別”的問題時,面試官想要的答案也許並不是要讓您說出具體的區別,而是問您在敲代碼時會使用哪一種語句來判斷您的專業性。如果是我,我會簡單說一下兩個語句的功能作用,然後如實的告訴HR我更習慣使用“a=a+b;”語句來實現賦值,因為該賦值語句更通俗易懂,方便他人的閱讀和理解。

結語:程序,是寫給人看的計算機語言,除了分號是程序代碼必不可少的組成成份外,註釋也佔有很重要的地位。一個具有可讀性的程序代碼註釋是不可或缺的,如果不瞭解又想了解“//”和“/* */”兩種註釋方法的同學請給個贊和關注唄。


分享到:


相關文章: