- Scala編程(第5版)
- (德)馬丁·奧德斯基等
- 554字
- 2022-05-06 15:51:41
5.8 對(duì)象相等性
如果想要比較兩個(gè)對(duì)象是否相等,則可以用==或與之相反的!=。舉例如下:

這些操作實(shí)際上可以被應(yīng)用于所有的對(duì)象,并不僅僅是基礎(chǔ)類型。比如,可以用==來(lái)比較列表:

沿著這個(gè)方向,還可以比較不同類型的兩個(gè)對(duì)象:

甚至可以拿對(duì)象與null做比較,或者與可能為null的對(duì)象做比較,并且不會(huì)拋出異常:

如你所見(jiàn),==的實(shí)現(xiàn)很用心,大部分場(chǎng)合都能返回給你需要的相等性比較的結(jié)果。這背后的規(guī)則很簡(jiǎn)單:首先檢查左側(cè)是否為null,如果不為null,則調(diào)用equals方法。由于equals是一個(gè)方法,因此得到的確切比較邏輯取決于左側(cè)參數(shù)的類型。由于有自動(dòng)的null檢查,因此我們不必親自做這個(gè)檢查。[10]
在這種比較邏輯下,對(duì)于不同的對(duì)象,只要它們的內(nèi)容一致,且equals方法的實(shí)現(xiàn)也是完全基于內(nèi)容的情況下,都會(huì)交出true答案。舉例來(lái)說(shuō),下面是針對(duì)兩個(gè)恰好擁有同樣的5個(gè)字母的字符串的比較:

Scala的==與Java的==的不同
在Java中,可以用==來(lái)比較基本類型和引用類型。對(duì)基本類型而言,Java的==比較的是值的相等性,就像Scala的一樣。但是對(duì)引用類型而言,Java的==比較的是引用相等性(reference equality),意思是兩個(gè)變量指向JVM的堆上的同一個(gè)對(duì)象。Scala也提供了用于比較引用相等性的機(jī)制,即名稱為eq的方法。不過(guò),eq和與它對(duì)應(yīng)的ne只對(duì)那些直接映射到Java對(duì)象的對(duì)象有效。關(guān)于eq和ne的完整細(xì)節(jié)會(huì)在17.1節(jié)和17.2節(jié)給出。關(guān)于如何編寫(xiě)一個(gè)好的equals方法,請(qǐng)參考第8章。
- 手機(jī)安全和可信應(yīng)用開(kāi)發(fā)指南:TrustZone與OP-TEE技術(shù)詳解
- Learning Java Functional Programming
- Python機(jī)器學(xué)習(xí):數(shù)據(jù)分析與評(píng)分卡建模(微課版)
- Redis Applied Design Patterns
- Mastering KnockoutJS
- Apex Design Patterns
- INSTANT Passbook App Development for iOS How-to
- 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對(duì)之道(修訂版)
- ElasticSearch Cookbook(Second Edition)
- Mastering ArcGIS Enterprise Administration
- Building Serverless Web Applications
- Mastering AWS Security
- 微前端設(shè)計(jì)與實(shí)現(xiàn)
- Kotlin進(jìn)階實(shí)戰(zhàn)
- 軟件開(kāi)發(fā)中的決策:權(quán)衡與取舍