В Java, когда оператор «==» используется для сравнения двух объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. Другими словами, он проверяет, являются ли имена двух объектов в основном ссылками на одно и то же место в памяти.
Класс Java String фактически переопределяет реализацию equals () по умолчанию в классе Object и переопределяет этот метод, чтобы он проверял только значения строк, а не их местоположения в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух объектов String, то, пока действительная последовательность символов равна, оба объекта считаются равными.
Оператор
==
проверяет, являются ли две строки точно одним и тем же объектом.Метод
blockquote>.equals()
проверяет, имеют ли две строки одно и то же значение.
Очень простой эксперимент:
case class A(s: String) { def ++:(a: A) = A(s"(${a.s} + ${s})") }
A("x") ++: A("y") ++: A("z")
дает:
A((x + (y + z)))
, так что это x + (y + z)
, а не (x + y) + z
. Таким образом, ++:
является правоассоциативным, как рекламируется.
Обратите внимание, что это ${a.s} + ${s}
, а не ${s} + ${a.s}
. В случае Queue
это, вероятно, аналогично, что-то вроде:
def ++:(left: Queue[A]): Queue[A] = left ++ this
, поэтому порядок элементов появляется «как и должно быть», когда вы пишете q0 ++: q1
, который десугарсирует в q1.++:(q0)
, а затем расширяется в q0 ++ q1
.