作为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")
}
答案 0 :(得分:5)
您的陈述中有两个误解:
hashCode
意味着对象相等。事实并非如此。事实上,它不可能是真的因为只有有限的多个哈希但是无限多的对象,所以必须是无限数量的具有相同{{1}的对象}。 不等 hashCode
表示对象不等,但等于 hashCode
完全没有告诉您任何内容。但是,“其他方向”是正确的:如果两个对象相等,则它们具有相同的hashCode
。注意:当然,所有这些实际上都依赖于正确实现的方法。例如,完全可以编写一个违反自反性的等式方法。只是当你做那样的事情时,你就失去了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