具有相同哈希码的两个对象意味着它们指的是同一个对象。

时间:2017-03-31 20:43:53

标签: scala

作为Scala的新手,我创建了一个Object(单例)。并为该对象提供两个不同的变量,如下所示。它们都显示了相同的哈希码。因为“学校”是单身人士。是吗?

 object Main extends  App{

 //we can import within the method as well .
 import Scala_DemoSingletonPackage._

  //See both the objeccts have same hashcode.
  println("The hasshcode for first object is " + aSchool.hashCode())
  println("The Hashcode from second object is " + bSchool.hashCode())

}

object School {


  def Printwhateveryouwant(input:String) {
     println(s"This is a singleton object  $input")


 }

3 个答案:

答案 0 :(得分:5)

您的陈述中有两个误解:

  1. 您认为等于hashCode意味着对象相等。事实并非如此。事实上,它不可能是真的因为只有有限的多个哈希但是无限多的对象,所以必须是无限数量的具有相同{{1}的对象}。 不等 hashCode表示对象不等,但等于 hashCode完全没有告诉您任何内容。但是,“其他方向”是正确的:如果两个对象相等,则它们具有相同的hashCode
  2. 你认为平等意味着身份。那也不是真的。两个对象相等的事实 not 意味着它们也是相同的。同样,“其他方向”(通常)是真的:一个对象等于它自己。
  3. 注意:当然,所有这些实际上都依赖于正确实现的方法。例如,完全可以编写一个违反自反性的等式方法。只是当你做那样的事情时,你就失去了Scala给你的保证。

    所以,你不能从两个hashCode相等的事实得出结论,两个对象是相等的。即使你能够得出结论,你仍然也不能从这两个对象相等的事实中得出结论,即它们实际上是同一个对象。

    尽管如此,确实如此:只存在一个单例对象的实例,这就是它被称为单例对象的原因。因此,您的两个引用必须引用同一个对象,原因很简单,只有一个对象可以开始。但是,您用于得出该结论的测试是错误的。

答案 1 :(得分:2)

具有相同哈希码的两个对象意味着由于哈希的性质它们是相等的(除非你有一个完美的哈希函数)。但是,如果两个对象相等,则具有相同的哈希码。

在scala中,如果您想检查对象是否相等,可以使用以下内容:

aSchool eq bSchool

答案 2 :(得分:1)

如果两个引用引用同一个实例,选择hashCode将在实例上调用该方法。

使用两个变量并不重要,并且指示对象是否为Singleton无关紧要。

scala> val x = new AnyRef
x: Object = java.lang.Object@21fdfefc

scala> val y = x
y: Object = java.lang.Object@21fdfefc

scala> x.hashCode == y.hashCode
res0: Boolean = true