关于java:为什么println(数组)有奇怪的输出?

Why does println(array) have strange output? (“[Ljava.lang.String;@3e25a5”)

本问题已经有最佳答案,请猛点这里访问。

我有一个字符串数组,其中包含我定义的四个元素。为什么当我输入System.out.println(name of Array)时,它不输出元素?但却给了我一个奇怪的输出。

这是我的密码…

1
2
3
4
5
6
7
8
9
public class GeniusTrial {

    public static void main(String[]args) {

        String [] genius = {"Einstein,","Newton,","Copernicus,","Kepler."};

        System.out.print(genius);
    }
}

下面是我得到的输出:

1
[Ljava.lang.String;@3e25a5


数组的toString()方法返回描述数组标识而不是其内容的String。这是因为数组不会覆盖Object.toString(),其文档解释了您看到的内容:

The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:

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

要获得数组内容的String表示,可以使用Arrays.toString(Object[])

此方法返回的String由每个元素的toString()表示组成,按它们在数组中出现的顺序排列,并用方括号括起来("[]")。相邻元素用逗号和空格分隔(",")。

例如,对数组调用此方法将导致以下String

1
"[Einstein, , Newton, , Copernicus, , Kepler.]"

请注意,由于数组元素String中已经有标点符号和空格,因此会产生双逗号和奇数间距。删除那些:

1
String [] genius = {"Einstein","Newton","Copernicus","Kepler"};

然后,该方法将返回该String

1
"[Einstein, Newton, Copernicus, Kepler]"

重要的是要注意,使用这个方法并不能对生成的String的格式进行任何控制。它很适合快速检查数组的内容,但是它的局限性超出了这个目的。例如,如果不希望使用方括号括起来,或者希望逐行列出每个元素,该怎么办?

此时,您应该开始看到实现自己的方法以特定于任务的方式输出数组内容的价值。正如其他人所建议的,通过使用for循环并构建您想要输出的新结果String,来实践这一点。

在Java教程文章中,您可以找到更多关于EDCOX1和0个循环的信息。一般来说,Java教程对于初学者来说是一个很好的阅读工具,应该很好地配合你的课程。


使用Arrays类为您扩展数组:

1
System.out.println(Arrays.toString(genius));

会给你的

[Einstein,,Newton,,Copernicus,,Kepler.]

双逗号是因为您在数组中包含了它们;删除它们,您将得到一个很好的逗号分隔列表。


所以在你的for循环中会是这样的:

1
2
3
for(i=0;i<genius.length;i++) {
 system.out.print(genius[i]);
}

所以我会解释这是怎么回事。for循环的结构如下:

1
for(original value; condition for the variable to go through the for loop; what to do to variable at end of for loop)

所以从i=0开始,这就满足了条件:i小于genius.length(genius.length给出了数组的长度,在本例中是4)。所以它将通过循环并打印genius[i](即genius[0]),因为i=0。然后它会给我加一个(i++)。

它将再次通过循环,因为i=1填充条件i小于genius.length…..等等……

它会转到i=4,然后停止。你可能会想,天才呢??数组数据的命名如下:1st=arrayname[0],2nd=arrayname[1]……所以第四个就是天才。所以当i=4时,它停止并全部打印。

您可以通过替换为更改其打印格式system.out.print(genius[i]+",");这将在每一个后面加上逗号和空格。

希望有帮助,祝你好运。


使用增强的for循环迭代,如下所示

1
2
3
for(String str:genius){
    System.out.println(str)
}

你需要一个循环:

1
2
3
4
for(String gen : genius)
{
    System.out.print(gen);
}

每个对象都有一个toString()方法,这就是您看到的,字符串数组的toString。


您需要对数组进行迭代(例如使用for循环),并分别打印每个值。

如果您尝试打印一个数组,它将打印您不会真正感兴趣的对象的信息。