Это не отличается каждый раз. Он уникален для конкретного экземпляра Array:
scala> val a = Array(1,2,3)
a: Array[Int] = Array(1, 2, 3)
scala> a.toString()
res2: String = [I@40499e4f
scala> a.toString()
res3: String = [I@40499e4f
Создание нового массива изменяет результат.
scala> Array(1,2,3).toString()
res4: String = [I@7dd712e8
Строка [I@40499e4f
состоит из двух частей: имени класса Array ихэш-код (CLASS_NAME@HASH_CODE
)
[
объект является массивом Java. I
Указывает, что это массив целых чисел (примитив Java) @
(просто разделяет описание массива) 40499e4f
Это .hashCode()
для этого объекта Java.
Что такое хэш-код Это немного сложно. Это похоже на «идентификатор объекта» для экземпляра Java, но оно не обязательно уникально. Основной смысл хеш-кода состоит в том, чтобы сообщить вам, являются ли два объекта «равными» друг другу.
Например:
scala> case class MyClass(a: Int)
defined class MyClass
scala> val b = MyClass(2)
b: MyClass = MyClass(2)
scala> val c = MyClass(3)
c: MyClass = MyClass(3)
scala> val d = MyClass(3)
d: MyClass = MyClass(3)
scala> b.hashCode()
res5: Int = 369114374
scala> c.hashCode()
res6: Int = 937862449
scala> d.hashCode()
res7: Int = 937862449
scala> d == c
res8: Boolean = true
scala> c == b
res9: Boolean = false
Вы можете видеть, что c
иd
имеют одинаковый hashCode (), хотя на самом деле это разные экземпляры Java-объекта.