Scala中的对象平等
在编程语言中,比较两个值是否相等是无处不在的。我们为 Scala 类定义了一个 equals 方法,以便我们可以相互比较对象实例。然而,在 Scala 中,表示对象身份的等式方法并没有被大量使用。
在 scala 中,提供了三种不同的相等方法 -
- 等于方法
- == 和 != 方法
- ne 和 eq 方法
注意: eq的行为与==运算符在Java、C++ 和 C# 中的行为相同,但在 Ruby 中与 == 不同。 ne方法是eq 的否定,即它等价于!(x eq y) 。在Java、C++ 和 C# 中, ==运算符测试引用,而不是值相等。相比之下,Ruby 的==运算符测试值相等。但是在 Scala 中, ==是在测试值是否相等。
让我们通过例子来理解。
例子 :
Scala
// Scala program of Equals
// Creating a case class of
// Subject
case class Subject (LanguageName:String, TopicName:String)
// Creating object
object GFG
{
// Main method
def main(args: Array[String])
{
// Creating objects
var x = Subject("Scala", "Equality")
var y = Subject("Scala", "Equality")
var z = Subject("Java", "Array")
// Displays true if instances
// are equal else false
println(x.equals(y))
println(x.equals(z))
println(y == z)
}
}
Scala
// Scala program to illustrate how
// hashCode() and equals() methods work
// Creating class
class Subject (name: String, article: Int)
{
// Defining canEqual method
def canEqual(a: Any) = a.isInstanceOf[Subject]
// Defining equals method with override keyword
override def equals(that: Any): Boolean =
that match
{
case that: Subject => that.canEqual(this) &&
this.hashCode == that.hashCode
case _ => false
}
// Defining hashcode method
override def hashCode: Int = {
val prime = 31
var result = 1
result = prime * result + article;
result = prime * result +
(if (name == null) 0 else name.hashCode)
return result
}
}
// Driver code
object GFG
{
// Main method
def main(args: Array[String])
{
// Creating the Objects of Geek class.
// Subject g1 = new Subject("aa", 1);
val g1 = new Subject("Scala", 28)
val g2 = new Subject("Scala", 28);
// Comparing above created Objects.
if(g1.hashCode() == g2.hashCode())
{
if(g1.equals(g2))
println("Both Objects are equal. ");
else
println("Both Objects are not equal. ");
}
else
println("Both Objects are not equal. ");
}
}
输出:
true
false
false
- equals 方法:用于测试值相等性的 equals 方法。如果 x 和 y 具有相同的值,则如果 x 等于 y,则为真。它们不需要引用相同的实例。因此, Java中的 equals 方法和 Scala 中的 equals 方法的行为相同。
- == 和 != 方法:虽然 == 是多种语言中的运算符,但 Scala 保留了 == 相等性,用于每种类型的自然相等性。它是 Scala 中的一种方法,在 Any 中定义为 final。价值平等将由此检验。在这里,如果 x 和 y 具有相同的值,则 x == y 为真。
- ne 和 eq 方法:引用相等性将通过 eq 方法进行测试。这里,如果 x 和 y 都指向内存中的相同位置,或者 x 和 y 引用相同的对象,则 x eq y 为真。这些方法仅为 AnyRef 定义。
如果两个对象根据equals方法相等,那么对两个对象中的每一个调用哈希码方法必须产生相同的整数结果。 equals (and, ==) 默认情况下与 eq 相同,但我们可以通过覆盖我们定义的类中的 equals 方法来改变它的行为。 Scala 将 == 视为在 Any 类中定义如下:
下面是equals方法和对应的hashCode方法的例子:
例子 :
斯卡拉
// Scala program to illustrate how
// hashCode() and equals() methods work
// Creating class
class Subject (name: String, article: Int)
{
// Defining canEqual method
def canEqual(a: Any) = a.isInstanceOf[Subject]
// Defining equals method with override keyword
override def equals(that: Any): Boolean =
that match
{
case that: Subject => that.canEqual(this) &&
this.hashCode == that.hashCode
case _ => false
}
// Defining hashcode method
override def hashCode: Int = {
val prime = 31
var result = 1
result = prime * result + article;
result = prime * result +
(if (name == null) 0 else name.hashCode)
return result
}
}
// Driver code
object GFG
{
// Main method
def main(args: Array[String])
{
// Creating the Objects of Geek class.
// Subject g1 = new Subject("aa", 1);
val g1 = new Subject("Scala", 28)
val g2 = new Subject("Scala", 28);
// Comparing above created Objects.
if(g1.hashCode() == g2.hashCode())
{
if(g1.equals(g2))
println("Both Objects are equal. ");
else
println("Both Objects are not equal. ");
}
else
println("Both Objects are not equal. ");
}
}
输出:
Both Objects are equal.
在上面的示例中,Eclipse 为类似的Java类生成的 hashCode 方法的修改版本。它还使用 canEqual 方法。通过定义 equals 方法,我们可以将Subject的实例与 == 进行比较。