前言
面試是類似演講演說的過程,網(wǎng)上的資料都是文字的购岗,沒法讓面試者直觀的體驗到面試過程汰聋,本人已經(jīng)將相關內容制作成音頻節(jié)目,我還不能在簡書上傳音頻喊积,有興趣的朋友可以去喜馬拉雅搜索《2020年Java面試208題》收聽音頻版節(jié)目烹困。
《2020年Java面試208題》整理了208個Java程序員的面試題,主要是針對三年以內開發(fā)經(jīng)驗的JAVA程序員提出的問題乾吻。
題目
今天要說的是《2020年Java面試208題》的第2題髓梅,面試官提問:請說一下 == 和 equals的區(qū)別。
那么就由我來演示一下面試绎签,我會這樣來回答:
演示面試
你好枯饿,面試官,我來說一下 == ?和 equals的區(qū)別诡必。
== 和 equals都是用來做比較的鸭你,不準確的說都是判斷兩個變量是否相等的。
個人認為一般程序員在使用 == 的時候都用的不太對擒权,都應該采用equals袱巨,因為 == 是比較兩個變量的地址是否是同一個,這里借用C的指針來說明更容易碳抄,也就是 == 是判斷左右兩邊的變量的指針是否指向內存中的同一個地址愉老,再說明白點兒就是 == 判斷的是左右兩邊是否是同一個東西起了兩個不同的名字。
因此剖效,我就發(fā)現(xiàn)有很多程序員都在不正確的使用 == 嫉入,比如在庫存管理的時候焰盗,判斷庫存是否為100, 這時候使用== 咒林,盡管返回的是 true熬拒,在判斷結果上是符合業(yè)務邏輯的正確性的垫竞,但在技術層面其實只能算是蒙對了澎粟。
因為100作為常量是放在常量區(qū)的,而保存庫存數(shù)量的變量的值也是放在常量區(qū)的欢瞪,常量區(qū)的特點是相同的值不會有多份活烙,也就是說你定義一個變量a賦值為100,又定義了一個變量b也賦值為100遣鼓,在程序層是兩個變量啸盏,但在常量區(qū)里面,這兩個變量是存在同一個地址的骑祟,當然回懦,你又給b賦值為99,這時候常量區(qū)會檢測是否存在99這樣的常量次企,如果有的話就直接將變量b指向那個99的地址粉怕,否則,會分配空間寫入99抒巢,然后把b指向這個新分配的空間贫贝。
那么再說回來剛剛那個庫存判斷的問題,定義了庫存變量蛉谜,假設變量名為k稚晚,并賦值為實際的庫存量,然后拿k與常量100比較型诚。程序員的思維邏輯是有一個數(shù)為k客燕,有又另一個數(shù)100,然后比較這兩個數(shù)的值是否相同狰贯。但如果采用的是 == 進行比較也搓,其實做的是拿出變量k的在常量區(qū)的地址,和 100這個常量區(qū)的地址涵紊,比較一下是不是其實是相同的地址傍妒。
還有一種情況,這樣比較會出問題摸柄,就是定義一個整型對象 k1賦值100颤练,再定義個整型對象k2賦值100,這時候用 == 做比較就錯了驱负,因為從普通人的視角看嗦玖,100 和100 肯定相等嘛患雇,并且按照前面說的,兩個100在常量區(qū)其實是相同的地址宇挫,那肯定是相同的啊苛吱。但這里還多出了一個整型對象的封裝,100這個值確實是放在常量區(qū)沒有錯器瘪,但整型對象k1和k2定義出來后可沒放在常量區(qū)翠储,這時候==做比較的時候,其實不是比較值的地址是否相同娱局,而是比較k1和k2的地址是否相同彰亥,這樣就會出錯了咧七。
為了避免 == 造成的這種問題衰齐,java在最基礎的類Object中定義了equals方法,任何類在實現(xiàn)的時候都繼承自Object继阻,也就可以重寫equals方法耻涛,按照類的功能需要進行值比較判斷。比如Integer類瘟檩,就是整型類的equals方法將整型對象包裝的整數(shù)值取出來抹缕,然后做 == 比較,這樣其實就是判斷整型值在常量區(qū)的地址是否相等墨辛。
還有浮點數(shù) Float對象卓研,是將浮點數(shù)按照IEEE規(guī)范轉換為整型,具體的這個算法我確實不太了解睹簇,但一定是一個浮點數(shù)最后只會計算得到唯一的整數(shù)值奏赘,因為浮點數(shù)占內存 32位,整型也占內存32位太惠,如果把一個浮點數(shù)的內存空間直接當做是整型讀出來磨淌,那就一定是一個唯一的整數(shù)。Float的equals方法就是這樣凿渊,把浮點數(shù)轉成唯一整數(shù)值梁只,然后再用 == 比較兩個整數(shù)的常量區(qū)地址是否相同的。
字符串則是順序的從最后一個字符做比較埃脏,我們知道字符類型與整型是可以互換的搪锣,所以字符串就是一個字符一個字符的比較每個字符轉成整數(shù)后,在常量區(qū)地址是否相同彩掐。
好了淤翔,以上就是我的演示面試,不知道是否讓你滿意佩谷。
自我點評:
在這個問題的解答中旁壮,我自己加入了對源代碼的分析监嗜,如果有機會讀源代碼,一定要多讀源代碼抡谐,面試的時候能盡可能從源代碼層面做解釋裁奇,還是那句話,逼格比較高麦撵,你把面試官侃暈了你也就成功了刽肠。
下期再見
本人技術有限,憑借熱情希望給程序員面試提供一點幫助免胃,必有不足之處音五,希望業(yè)內人士積極批評指正,在留言區(qū)留言就是對我最大的鼓勵羔沙。希望批評中肯一些躺涝,不要存在人身攻擊,更不要波及到家人扼雏,善意中肯的批評我都能夠虛心接受坚嗜。 我們下期再見。