为什么java中的toString方法似乎不适用于数组

为什么java中的toString方法似乎不适用于数组,java,tostring,arrays,Java,Tostring,Arrays,我想使用java中的toString()方法将字符数组转换为字符串对象。以下是我使用的测试代码片段: import java.util.Arrays; class toString{ public static void main(String[] args){ char[] Array = {'a', 'b', 'c', 'd', 'e', 'f'}; System.out.println(Array.toString()); } }

我想使用java中的toString()方法将字符数组转换为字符串对象。以下是我使用的测试代码片段:

import java.util.Arrays;
class toString{
    public static void main(String[] args){
        char[] Array = {'a', 'b', 'c', 'd', 'e', 'f'};
        System.out.println(Array.toString());
        }
}

原则上,它应该打印abcdef,但它打印的是[C@6e1408[C@e53108每次程序执行时。我不需要其他选择,但想知道为什么会发生这种情况。

要获得一个人类可读的
toString()
,您必须像这样使用:

System.out.println(Arrays.toString(Array));
Java对数组的
toString()
是打印
[
,后跟表示数组元素类型的字符(在您的例子中,对于
char
,是
@
),然后是数组的“标识哈希代码”(将其视为“内存地址”)

这种可悲的状况通常被认为是java的“错误”


有关其他“错误”的列表,请参阅。

我不知道您是从哪里得到“原则上”它应该打印“abcdef”的想法的。这是在哪里记录的

类似于
[C@6e1408
当然不是随机的胡言乱语-这与从对象构造字符串的方式相同,任何其他类型都不会覆盖
toString()
继承-它是类型的表示形式(
[
表示数组;
C
表示
char
基本类型)后跟十六进制的标识哈希代码。有关详细信息,请参阅。实际上,数组不会覆盖
toString


如果你想
[a,b,c,d,e,f]
你可以使用。如果你想
abcdef
你可以使用
newstring(char[])

因为char数组是一个原语数组,toString()会给出它的默认值(这是对象的散列)。有些类会实现toString()做更酷的事情,但primitaves不会。

数组不会覆盖
toString
。有一个静态方法:
java.util.array.toString
,应该可以解决您的问题

import java.util.Arrays;
class toString {
    public static void main(String[] args){
        char[] Array = {'a', 'b', 'c', 'd', 'e', 'f'};
        System.out.println(Arrays.toString(Array));
    }
}

char[]类的toString方法的默认实现返回数组基址的字符串表示形式,这是此处打印的内容。我们无法更改它,因为char[]类不可扩展。

我发现这样做有效:

public String convertToString(char[] array, int length)
{
String char_string;
String return_string="";
int i;

   for(i=0;i<length;i++)
   {
       char_string=Character.toString(array[i]);
       return_string=return_string.concat(char_string);
   }
   return return_string;
}
public String convertToString(char[]数组,int-length)
{
字符串字符;
字符串返回_String=“”;
int i;

对于(i=0;i只需使用以下命令即可打印abcdef数组

    String a= new String(Array);

    System.out.println(a);
问题解决了!! 现在,关于为什么要打印其他东西,我想上面的那些人为此提供了一些有用的链接。 好的,我得走了

char[] Array = { 'a', 'b', 'c', 'd', 'e', 'f' };
System.out.println(Array);

它应该打印
abcdef

我想是的,“Array.toString()”到“Arrays.toString(Array)”有拼写错误,与其写name.toString(),不如把名称作为参数传递,然后像上面那样写。

字符数组是一个基元你的意思当然是一系列的原语。谢谢你,波希米亚人。你能告诉我其他印刷品的胡言乱语的含义或上下文吗。@sidharth:这不是“胡言乱语”-看看我的答案是从哪里来的。一年多后,当一个类似的问题击中我时,我发现了这篇文章-真的很惊讶
toString()
对于处理人类可读字符的对象没有被重写!您实际上没有解释如何获取“abcdef”正如OP所要求的那样。@Bohemian或任何人,有什么原因不能/没有作为语言更改的一部分重新实现吗?他不是在要求替代方案,他是在要求对该行为进行解释。我认为“原则上”它应该覆盖
toString()
方法,因为它处理可以输出为有效的人类可读字符串的字符和人类可读内容。或者,正如您所指出的,至少实现类似于
数组
类的内容。从文档的第一句话(如我所浏览的)我只看到返回一个表示该字符值的String对象。我希望这意味着它会覆盖
toString()
+输出一个长度为1的字符串对象;一个人类可读的表示形式。显然我的字符串不适合浏览;但是!@FergusMorrow:这是
字符的文档。toString
。这不是单个
字符,而是一个数组。基本上,你应该只依赖
toString
来做任何特别需要使用的事情对于被重写的类,它是ful,而对于数组,它是不被重写的。这当然是一个遗憾,但是OP没有充分的理由“原则上”期望有任何不同事实上,散列的目的是随机的。@avidD:不,散列的目的不是随机的。它是在不同的对象之间尽可能地不同。它是否不可预测并不重要-这不是重点。@JonSkeet有正确的答案。你应该接受它。这是正确的,但这不是不完全符合这个问题。OP想将
char[]
转换为
字符串
,而不仅仅是打印它。他只是将打印语句用作“调试”选项来显示
.toString()
的输出。