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 ##.

Author: Peter Mortensen, 2012-01-30

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
 34
Author: oxbow_lakes,
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.

 29
Author: Jesper Nordenberg,
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)
 5
Author: starling,
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