2015-01-15 237 views
-2

这里是我的代码:打印字符串数组

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] 

是什么magic1magic2之间的区别?

+1

'magic1'是数组的默认toString()输出。 'magic2'是Arrays类中toString()方法的输出,它可以获取所有元素。 – csmckelvey

+0

首先打印出阵列魔法的身份散列码。可能看起来像'String @ 548543fdfds'。 –

+0

除了他不问如何打印数组。 –

回答

0

它基本上是一个量身定做的toString它使输出漂亮。

你在中看到的第一个toString是内存地址。原因是变量名称就是这样 - 一个内存地址(又名引用)。

每个类都继承toString,并且可以实现它自己的。

See Arrays class API

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] 
+1

感谢您的回复。我的问题是不应该是他们两个输出相同?为什么magic2不打印参考呢? –

+0

@kalpakhan - :) – Coffee

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()) 
1

数组是对象,但它们不会改变(重写)其toString()方法,这意味着它们使用默认的,从Object继承。如果你读documentation of this method,你会发现:

Object类的toString方法返回一个包含其中的对象是一个实例,则在符号字符'@”之类的名称的字符串,无符号对象的哈希码的十六进制表示。换句话说,此方法返回一个字符串等于的值:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

在你的情况

  • getClass().getName()返回[Ljava.lang.String这意味着
    • 一门维阵列(因为只有一个[
    • 类型全名是java.lang.String
  • and Integer.toHexString(hashCode())返回类似于1db9742的东西,它是由hashCode()方法返回的十六进制形式的整数。

现在,如果你看一看的Arrays.toString(Object[] array)代码(String[]被视为Object[]

4531 publicstaticString 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 = newStringBuilder();
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来完成此操作,该构造函数随后将用于创建将返回的String。