Scala對(duì)象的相等性比較
如果你想比較一下看看兩個(gè)Scala對(duì)象是否相等,可以使用或者==,或它的反義!=。下面舉幾個(gè)例子:
這些操作對(duì)所有對(duì)象都起作用,而不僅僅是基本類型。例如,你可以用他比較列表:
- scala> 1 == 2
- res24: Boolean = false
- scala> 1 != 2
- res25: Boolean = true
- scala> 2 == 2
- res26: Boolean = true
進(jìn)一步,你還可以比較不同類型的兩個(gè)對(duì)象:
- scala> List(1, 2, 3) == List(1, 2, 3)
- res27: Boolean = true
- scala> List(1, 2, 3) == List(4, 5, 6)
- res28: Boolean = false
你甚至可以比較null,或任何可能是null的東西。不會(huì)有任何異常被拋出:
- scala> 1 == 1.0
- res29: Boolean = true
- scala> List(1, 2, 3) == "hello"
- res30: Boolean = false
如你所見,==已經(jīng)被仔細(xì)地加工過,因此在許多情況下你都可以得到你想要的相等性的比較。這只是用了一個(gè)非常簡(jiǎn)單的規(guī)則:首先檢查左側(cè)是否為null,如果不是,調(diào)用equals方法。由于equals是一個(gè)方法,因此比較的精度取決于左手邊的參數(shù)。又由于已經(jīng)有一個(gè)自動(dòng)的null檢查,因此你不需要手動(dòng)再檢查一次了。自動(dòng)檢查機(jī)制不會(huì)檢查右手側(cè)的參數(shù),但是任何合理的equals方法都應(yīng)在參數(shù)為null的時(shí)候返回false。
- scala> List(1, 2, 3) == null
- res31: Boolean = false
- scala> null == List(1, 2, 3)
- res32: Boolean = false
這種類型的比較對(duì)于不同的對(duì)象也會(huì)產(chǎn)生true,只要他們的內(nèi)容是相同的并且它們的equals方法是基于內(nèi)容編寫的。例如,以下是恰好都有五個(gè)同樣字母的兩個(gè)字串的比較:
Scala的==與Java的有何差別
- scala> ("he" + "llo") == "hello"
- res33: Boolean = true
Java里的既可以比較原始類型也可以比較參考類型。對(duì)于原始類型,Java的==比較值的相等性,如Scala。然而對(duì)于參考類型,Java的==比較了參考相等性:reference equality,也就是說這兩個(gè)變量是否都指向于JVM堆里的同一個(gè)對(duì)象。Scala也提供了這種機(jī)制,名字是eq。不過,eq和它的反義詞,ne,僅僅應(yīng)用于可以直接映射到Java的對(duì)象。
【相關(guān)閱讀】