我知道我可以通过使用Array(1,2,3).mkString(“,”)获得所需的输出,但是我想知道为什么/如何在使用.toString()时确定结果值
答案 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
您可以看到c
和d
具有相同的hashCode(),即使它们实际上是不同的Java对象实例。
答案 1 :(得分:0)
这是@robert答案的附加信息。
摘自Object#hashCode()
的Javadoc:
如果根据
equals(Object)
两个对象相等 方法,然后分别对每个调用 hashCode 方法 这两个对象必须产生相同的整数结果。在合理可行的范围内,
hashCode
方法由 类Object
确实为不同的对象返回不同的整数 对象。 (通常是通过转换内部 对象的地址转换为整数,但是此实现 技术不是必需的 Java™编程语言。)
java.util.Arrays
具有方法equals
。 Arrays.equals(a,b)
表示从0到i
max(a.length, b.length)
中的每个a(i) == b(i)
的。
但是根据a.equals(b)
,a
表示与b
的链接和与Object#equals
的链接是相等的。