Why does the toString method in java not seem to work for an array
我想用Java中的ToString()方法将字符数组转换为字符串对象。以下是我使用的测试代码片段:
1 2 3 4 5 6 7
| 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(),必须使用Arrays.toString(),如下所示:
Java的EDCOX1对数组的0是要打印EDCOX1,3,然后是表示数组元素的类型的字符(在EDCOX1中,对于EDCOX1,5,5,4),接着是EDCOX1,6,然后是数组的"身份哈希代码"(想想它就像一个"内存地址")。
这种悲伤的状态通常被认为是Java的"错误"。
其他"错误"列表请参见此答案。
- 谢谢你波西米亚人。你也能告诉我印刷的那些乱七八糟的东西的意思或上下文吗?
- @西德哈特:这不是"胡言乱语"——看看我的答案是什么。
- 一年多后,当一个类似的问题出现在我身上时,我刚刚推翻了这个观点,我发现这篇文章——真的很惊讶,toString()并没有被处理人类可读字符的对象所覆盖!
- 实际上,您没有按照OP的要求解释如何获得"abcdef"。
- @波西米亚人或任何人,有没有理由不能/没有作为语言变化的一部分重新实现?
我不知道你从哪里得到的想法,即"原则上"它应该打印"abcdef"。文件在哪里?
像[C@6e1408这样的东西肯定不是随机的胡言乱语-它是从对象构造字符串的方法,与任何其他类型不重写toString()继承的方法相同-它是类型的表示([表示一个数组;C表示char基元类型,后面跟标识哈希co在十六进制。详见Object.toString()文件。实际上,数组不会覆盖toString。
如果你想要[a, b, c, d, e, f],你可以使用Arrays.toString(char[])。如果你想要abcdef,你可以使用new String(char[])。
- 谢谢你的洞察力。
- 我认为"原则上",它应该覆盖toString()方法,因为它处理可以输出到有效的人类可读字符串的字符和人类可读内容。或者至少实现类似于Arrays类的东西,如您所指出的。从文档的第一句话(我略读了一下)中,我只看到了一个字符串对象,它表示这个字符的值。我想说的是,它会覆盖toString()+输出一个长度为1的字符串对象;一种人类可读的表示。显然,我不擅长撇油,但仍然如此!
- @弗格森:这是Character.toString的文档。这不是一个单一的char,它是一个数组。基本上,您应该只依赖于toString对那些已经被重写的类做任何特别有用的事情,并且它不会被数组重写。这当然是一个耻辱,但在我看来,OP没有充分的理由去期待任何不同的"原则上"的事情。
- 实际上,散列的目的是随机的。
- @阿维德:不,散列的目的不是随机的。不同的物体之间要尽可能地不同。不管它是不可预测的还是不可预测的——这不是重点。
- @琼斯基特有正确的答案。你应该这样接受它。
只需使用以下命令打印ABCDEF数组
你解决了问题!!关于为什么要打印其他的东西,我想上面的那些人提供了一些有用的链接。好的,走吧!!
数组不会覆盖toString。有一种静态方法:java.util.Arrays.toString可以解决您的问题。
1 2 3 4 5 6 7
| 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()将提供它的默认值(它是对象的散列值)。有些类将实现toString()来做更酷的事情,但primitaves不会。
- "char数组是一个原语"当然,您的意思是一个原语数组。
- 对的!谢谢!
"array.toString()"到"array.toString(array)"的拼写有误,我想是这样的,而不是写入name.toString(),而是将该名称作为参数传递,然后如上所述写入。
应该打印abcdef。
- 这是正确的,但这不太适合这个问题。OP希望将char[]转换为String,而不仅仅是打印它。他只是使用print语句作为"调试"选项来显示.toString()的输出。
char[]类的toString方法的默认实现返回数组基地址的字符串表示形式,这就是在此处打印的内容。我们不能更改它,因为char[]的类是不可扩展的。
我发现这种方法很有效:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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 ;
} |
- 他不是在要求另一种选择,而是在要求对这种行为作出解释。