为什么每次执行Array(1,2,3).toString()的结果都不同,并且如何确定结果?

时间:2019-10-30 20:11:04

标签: java scala

我知道我可以通过使用Array(1,2,3).mkString(“,”)获得所需的输出,但是我想知道为什么/如何在使用.toString()时确定结果值

2 个答案:

答案 0 :(得分:0)

每次都没有不同。它对于特定的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有两个部分:数组类名称和哈希码(CLASS_NAME@HASH_CODE

  • [该对象是Java数组。
  • I表示这是一个整数数组(Java原语)
  • @(仅分隔数组描述)
  • 40499e4f这是该Java对象的.hashCode()

什么是哈希码 这有点复杂。它有点像Java实例的“对象ID”,但不一定是唯一的。哈希码的要点是告诉您两个对象是否彼此“相等”。

例如:

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

您可以看到cd具有相同的hashCode(),即使它们实际上是不同的Java对象实例。

答案 1 :(得分:0)

这是@robert答案的附加信息。

摘自Object#hashCode()的Javadoc:

  

如果根据 equals(Object) 两个对象相等           方法,然后分别对每个调用 hashCode 方法           这两个对象必须产生相同的整数结果。

     

在合理可行的范围内,hashCode方法由   类Object确实为不同的对象返回不同的整数        对象。 (通常是通过转换内部         对象的地址转换为整数,但是此实现         技术不是必需的         Java™编程语言。)

java.util.Arrays具有方法equalsArrays.equals(a,b)表示从0到i max(a.length, b.length) 中的每个a(i) == b(i)

但是根据a.equals(b)a表示b的链接和与Object#equals的链接是相等的