【问题标题】:Why does the toString method in java not seem to work for an array为什么java中的toString方法似乎不适用于数组
【发布时间】:2011-10-26 23:08:09
【问题描述】:

我想使用 java 中的 toString() 方法将字符数组转换为字符串对象。这是我使用的测试代码的sn-p:

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 之类的随机乱码> 每次程序执行时。我不需要替代方案,但想知道为什么会这样。

【问题讨论】:

    标签: java tostring arrays


    【解决方案1】:

    要获得人类可读的toString(),您必须使用Arrays.toString(),如下所示:

    System.out.println(Arrays.toString(Array));
    

    Java 的数组toString() 是打印[,后跟表示数组元素类型的字符(在您的情况下,C 表示char),然后是@,然后是“身份数组的哈希码”(将其视为“内存地址”)。

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

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

    【讨论】:

    • 谢谢波西米亚人。你能不能告诉我正在打印的乱码的含义或上下文。
    • @sidharth:这不是“胡言乱语” - 请参阅我的答案以了解它的来源。
    • 刚投了赞成票,一年多后,我遇到了一个类似的问题,我发现这篇文章 - 真的很惊讶 toString() 没有被处理人类可读字符的对象覆盖!
    • 您实际上并没有按照 OP 的要求解释如何获取“abcdef”。
    • @Bohemian 或任何人,是否有理由不能/尚未将其作为语言更改的一部分重新实现?
    【解决方案2】:

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

    [C@6e1408 这样的东西肯定是不是 随机胡言乱语 - 它与从对象构造字符串的方式相同,因为任何其他类型不会覆盖 toString() 继承 - 它是类型([ 表示数组;C 表示 char 原始类型)后跟十六进制的身份哈希码。有关详细信息,请参阅documentation for Object.toString()。碰巧,数组不会覆盖toString

    如果你想要[a, b, c, d, e, f],你可以使用Arrays.toString(char[])。如果你想要abcdef,你可以使用new String(char[])

    【讨论】:

    • 我认为 '原则上' 预计会覆盖 toString() 方法,因为它处理可以输出给有效人类的字符和人类可读内容-可读字符串。或者至少实现类似Arrays 类的东西,正如你所指出的。从文档的第一句话(我略读时)我只看到 Returns a String object代表这个 Character 的值。 我预计这意味着它会覆盖 toString() + 输出一个具有长度的 String 对象一个;人类可读的表示。显然我不适合略读;但仍然!
    • @FergusMorrow:这是Character.toString 的文档。这不是一个char,它是一个数组。基本上,你应该只依赖toString 做任何对它被覆盖的类特别有用的事情,并且它不会被数组覆盖。这当然是一种耻辱,但 OP 没有充分的理由期待任何不同的“原则上”IMO。
    • 其实hash的目的是随机
    • @avidD:不,哈希的目的不是随机。不同对象之间要尽可能的不同。是否不可预测并不重要——这不是重点。
    • @JonSkeet 有正确的答案。你应该接受它。
    【解决方案3】:

    数组不会覆盖toString。有一个静态方法:java.util.Arrays.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));
        }
    }
    

    【讨论】:

      【解决方案4】:

      只需使用以下命令打印您的 abcdef 数组

          String a= new String(Array);
      
          System.out.println(a);
      

      问题解决了!! 现在关于为什么要打印其他东西,我认为上面的那些人为此提供了一些有用的链接。 好的,该走了!!

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • "一个 char 数组是一个基元" 你的意思是一个基元数组,当然。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:
          char[] Array = { 'a', 'b', 'c', 'd', 'e', 'f' };
          System.out.println(Array);
          

          它应该打印abcdef

          【讨论】:

          • 这是正确的,但这不太适合这个问题。 OP 想要将 char[] 转换为 String,而不仅仅是打印它。他只是使用 print 语句作为“调试”选项来显示.toString() 的输出。
          【解决方案8】:

          我猜是“Array.toString()”到“Arrays.toString(Array)”的拼写错误,而不是写name.toString(),而是将名称作为参数传递并按上述方式写。

          【讨论】:

            【解决方案9】:

            我发现这种方法有效:

            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;
            }
            

            【讨论】:

            • 他不是在寻求替代方案,而是在寻求对行为的解释。
            猜你喜欢
            • 2021-02-04
            • 2017-04-24
            • 2011-02-03
            • 2010-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多