Почему результат Array (1,2,3) .toString () отличается каждый раз, когда он выполняется, и как определяется результат? - PullRequest
0 голосов
/ 30 октября 2019

Я знаю, что могу получить желаемый результат, используя Array (1,2,3) .mkString (","), но я хочу знать, почему / как определяются результирующие значения, когда вместо него используется .toString ().

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Это дополнительная информация к ответу @robert.

Из Javadoc из Object#hashCode():

Если два объекта равны согласно *Метод 1009 *equals(Object), затем вызов метода hashCode для каждого из двух объектов должен давать один и тот же целочисленный результат.

Столько, насколько это практически возможно, hashCode метод, определенный классом Object, возвращает разные целые числа для разных объектов. ( Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число , но этот метод реализации не требуется языком программирования Java ™.)

java.util.Arraysимеет метод equals. Arrays.equals(a,b) означает для каждого i от 0 до max(a.length, b.length) a(i) == b(i).

Но a.equals(b) означает ссылку на a и ссылку на bравны , согласно Object#equals.

0 голосов
/ 31 октября 2019

Это не отличается каждый раз. Он уникален для конкретного экземпляра 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-объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...