这是我的代码:
String[] magic = {"stick", "hat", "witch"};
String magic1 = magic.toString();
String magic2 = Arrays.toString(magic);
System.out.println(magic1); // this is printing a memory location
System.out.println(magic2); // this one prints: [stick, hat, witch]
magic1
和magic2
之间有什么区别?
答案 0 :(得分:1)
数组是对象,但它们不会更改(覆盖)其toString()
方法,这意味着它们使用默认值,继承自Object
。如果您阅读documentation of this method,您会发现:
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@'”以及哈希代码的无符号十六进制表示形式组成。宾语。换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
在你的情况下
getClass().getName()
返回[Ljava.lang.String
,这意味着
[
)java.lang.String
Integer.toHexString(hashCode())
返回类似1db9742
的内容,它是hashCode()
方法返回的整数的十六进制形式。现在,如果您查看Arrays.toString(Object[] array)
的代码(String[]
被视为Object[]
)
4531 public static String toString(Object[] a) {
4532 if (a == null)
4533 return "null";
4535 int iMax = a.length - 1;
4536 if (iMax == -1)
4537 return "[]";
4539 StringBuilder b = new StringBuilder();
4540 b.append('[');
4541 for (int i = 0; ; i++) {
4542 b.append(String.valueOf(a[i]));
4543 if (i == iMax)
4544 return b.append(']').toString();
4545 b.append(", ");
4546 }
4547 }
你会发现它的目的是从这个数组的内容创建字符串构建。它通过遍历所有元素并将其字符串表示添加到StringBuilder来完成此操作,然后使用StringBuilder创建将返回的String。
答案 1 :(得分:0)
它基本上是一个定制的toString
,使输出相当漂亮。
您在第一个 toString
中看到的是内存地址。原因是变量名只是 - 内存地址(又名参考)。
每个类都继承toString,并且可以实现自己的。
String[] names = {"Bob", "Dad", "Mom"};
String names1 = names.toString();
String names2 = Arrays.toString(names);
System.out.println(names1 );
System.out.println(names2 );
打印出来:
[Ljava.lang.String;@1034bb5
[Bob, Dad, Mom]
答案 2 :(得分:0)
阅读doumentation。我在这里复制了必要的信息。
public static String toString(Object[] a)
返回指定数组内容的字符串表示形式。如果数组包含其他数组作为元素,则它们将从Object继承的Object.toString()方法转换为字符串,该方法描述其身份而不是其内容。
此方法返回的值等于Arrays.asList(a).toString()返回的值,除非a为null,在这种情况下" null"退回。
public String toString()
返回对象的字符串表示。通常,toString方法返回一个"文本表示"的字符串。这个对象。结果应该是一个简洁但信息丰富的表示,便于人们阅读。建议所有子类都重写此方法。 类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@'”和哈希码的无符号十六进制表示组成。对象即可。换句话说,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())