圖文并茂解釋Kotlin == 和 === 之間的差異

Kotlin最近風(fēng)頭正勁僚饭,作為一個(gè)去年就關(guān)注這門語言,并且向朋友安利這門語言的小司機(jī)終于揚(yáng)眉吐氣了一回胧砰,自己選擇沒有錯鳍鸵。

最近在一個(gè)Kotlin群里,看到大家在討論一個(gè)問題尉间,是關(guān)于 == 和 === 的問題偿乖,看官方文檔解釋的意思大概是這樣子的

兩個(gè)等號==

== 兩個(gè)等號意思與Java中的 equals 意思一樣,就比如

var a = "字符串"

print(a == "字符串")

這段代碼在Kotlin中打印出來值就是true

三個(gè)等號===

=== 三個(gè)等號的意思乌妒,則比較的是內(nèi)存地址:就比如:

var a = "字符串"

var b = a

var c = a

print(b === c)

那么打印出來的值就是true

有人問了這么一句話:為什么我用Int得到的結(jié)果好好像有點(diǎn)不對汹想??

我重現(xiàn)了這位兄弟的場景:

這是執(zhí)行代碼:

輸入圖片說明

這是執(zhí)行結(jié)果:

輸入圖片說明

看到這里可能大家就看出一點(diǎn)端倪了撤蚊,明明是兩個(gè)變量古掏,兩次初始化,兩個(gè)等號相等為true可以理解侦啸,但是三個(gè)等號為true是為什么呢槽唾?

然后群里又有人說,在類型后面加個(gè)問號就可以了光涂,就是聲明成可選值就是可以達(dá)到我們預(yù)期的結(jié)果

然后我又試了一遍:

輸入圖片說明

很明顯庞萍,答案還是一樣的,為什么呢忘闻?明明把值聲明成可選值了啊钝计。

又有人說,我把值稍微調(diào)大一點(diǎn),結(jié)果就不一樣了私恬。

然后我再次試了一遍:


輸入圖片說明

看到這里就覺得好奇怪了债沮,為啥?為什么不加問號兩個(gè)值地址相等本鸣?加了問號 值小的情況下 兩個(gè)地址相等疫衩,值大的情況下,兩個(gè)地址不等荣德?闷煤?Kotlin是不是煞筆啊涮瞻?鲤拿?是不是有問題啊饲宛?帶著疑問我們繼續(xù)往下看:

然后我使用kotlin插件自帶的一個(gè)工具皆愉,直接查看Kotlin編譯出的class文件,再由class文件反編譯出Java代碼艇抠,來進(jìn)一步分析:

輸入圖片說明

輸入圖片說明

我們先看不加問號的情況:

輸入圖片說明

看來反編譯還是有點(diǎn)問題的幕庐,但是并不影響我們分析,我們看到我在截圖中標(biāo)記出來的部分家淤,原來kotlin在內(nèi)部當(dāng)不加問號的時(shí)候异剥,就是基本類型,而在Java中絮重,兩個(gè)基本類型進(jìn)行地址進(jìn)行比較冤寿,地址是一樣的,所以kotlin直接編譯成兩個(gè)等號的意思青伤。

我們看加了問號督怜,值小的情況:

輸入圖片說明

看到這里可以看到有點(diǎn)不一樣了,我們重點(diǎn)看一下標(biāo)記出來的部分狠角,這個(gè)看名字的意思應(yīng)該就是 equals 的意思号杠。

我們再看加了問號,值大的情況:

輸入圖片說明

總結(jié)

到了這里丰歌,我們其實(shí)應(yīng)該有一種想法了姨蟋。

其實(shí)當(dāng)你不聲明為?可選值的時(shí)候立帖,就當(dāng)成Java基本數(shù)據(jù)類型進(jìn)行比較

而Java基本數(shù)據(jù)類型比較的話眼溶,地址與值都是相等的,為了節(jié)省這個(gè)比較地址的開銷晓勇,

kotlin直接編譯成JVM執(zhí)行的 == 的意思堂飞,

而當(dāng)你加了問號灌旧,聲明為可選值的時(shí)候,

意思就是可以為null酝静,也就是說节榜,就必須編譯為 Integer 只有integer才是既可以有數(shù)值羡玛,又可以為 null 别智。

integer包裝類的話,就是對象了稼稿,那么對象與對象進(jìn)行比較的話薄榛,地址是會不一樣的,那么為什么在值小的時(shí)候相等让歼,值大的時(shí)候不相等呢敞恋?

這個(gè)可能就與JVM的機(jī)制有關(guān)系了,【據(jù)說在JVM里面有一個(gè)常量池谋右,如果是這個(gè)值存在于這個(gè)常量池里硬猫,那么jvm會直接拿常量池里的對象進(jìn)行替換。所以你值小的時(shí)候得到的結(jié)果是相等的】改执。真的只是據(jù)說啸蜜,因?yàn)槲乙膊恢肋@句話是真的假的。有知道的請告訴我一下辈挂。我也學(xué)習(xí)學(xué)習(xí)衬横。

對Kotlin感興趣的可以加我的群:559259945


追加

群里老司機(jī)跟我說了,是JVM虛擬機(jī)的的優(yōu)化终蒂,范圍 -128 到 127之間有緩存

輸入圖片說明
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜂林,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拇泣,更是在濱河造成了極大的恐慌噪叙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霉翔,死亡現(xiàn)場離奇詭異睁蕾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)早龟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門惫霸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葱弟,你說我怎么就攤上這事壹店。” “怎么了芝加?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵硅卢,是天一觀的道長射窒。 經(jīng)常有香客問我,道長将塑,這世上最難降的妖魔是什么脉顿? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮点寥,結(jié)果婚禮上艾疟,老公的妹妹穿的比我還像新娘。我一直安慰自己敢辩,他們只是感情好蔽莱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戚长,像睡著了一般盗冷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上同廉,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天仪糖,我揣著相機(jī)與錄音,去河邊找鬼迫肖。 笑死锅劝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咒程。 我是一名探鬼主播鸠天,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帐姻!你這毒婦竟也來了稠集?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤饥瓷,失蹤者是張志新(化名)和其女友劉穎剥纷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呢铆,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晦鞋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棺克。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悠垛。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖娜谊,靈堂內(nèi)的尸體忽然破棺而出确买,到底是詐尸還是另有隱情,我是刑警寧澤纱皆,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布湾趾,位于F島的核電站芭商,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搀缠。R本人自食惡果不足惜铛楣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艺普。 院中可真熱鬧簸州,春花似錦、人聲如沸衷敌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缴罗。三九已至,卻和暖如春祭埂,著一層夾襖步出監(jiān)牢的瞬間面氓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工蛆橡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舌界,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓泰演,卻偏偏與公主長得像呻拌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子睦焕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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