Jaka jest różnica między ` # # ' A 'hashCode'?
Jaka jest różnica między metodami ##
i hashCode
?
Wydają się wysyłać te same wartości bez względu na to, jakiej klasy lub hashCode
przeciążenia używam. Google też nie pomaga, ponieważ nie może znaleźć symbolu ##
.
3 answers
"podklasy" z AnyVal
nie zachowują się prawidłowo z perspektywy hashowania:
scala> 1.0.hashCode
res14: Int = 1072693248
Oczywiście, że jest to boxed to a call to:
scala> new java.lang.Double(1.0).hashCode
res16: Int = 1072693248
Możemy wolelibyśmy:
scala> new java.lang.Double(1.0).##
res17: Int = 1
scala> 1.0.##
res15: Int = 1
Powinniśmy się tego spodziewać, biorąc pod uwagę, że int
1 jest również double
1. Oczywiście ten problem nie pojawia się w Javie. Bez niego mielibyśmy ten problem:
Set(1.0) contains 1 //compiles but is false
Na szczęście:
scala> Set(1.0) contains 1
res21: Boolean = true
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-30 18:10:06
##
został wprowadzony, ponieważ {[1] } nie jest zgodny z operatorem ==
w Scali. If a == b
then a.## == b.##
niezależnie od typu A i b (Jeśli własne implementacje hashCode
są poprawne). To samo nie dotyczy hashCode
, co widać na przykładach podanych przez inne plakaty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 11:43:59
Chcę tylko dodać do odpowiedzi innych plakatów, że chociaż metoda ## stara się utrzymać umowę między równością a kodami hashowymi, to najwyraźniej nie jest wystarczająco dobra w niektórych przypadkach, np. gdy porównujesz duble i Longi (scala 2.10.2): {]}
> import java.lang._
import java.lang._
> val lng = Integer.MAX_VALUE.toLong + 1
lng: Long = 2147483648
> val dbl = Integer.MAX_VALUE.toDouble + 1
dbl: Double = 2.147483648E9
> lng == dbl
res65: Boolean = true
> lng.## == dbl.##
res66: Boolean = false
> (lng.##, lng.hashCode)
res67: (Int, Int) = (-2147483647,-2147483648)
> (dbl.##, dbl.hashCode)
res68: (Int, Int) = (-2147483648,1105199104)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-29 16:12:12