为什么是 System.out.println(new String(copyTo))?

Why System.out.println(new String(copyTo))?

我正在学习这里的 Java 教程: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

然而出现了一个疑问:

为什么我需要 new String()?直接使用System.out.println(copyTo)会不会有什么潜在的问题?我认为在后台 println 已经具有转换为字符串的 toString 方法。

   class ArrayCopyOfDemo {
      public static void main(String[] args) {
        
        char[] copyFrom = {'d', 'e', 'c', 'a', 'f', 'f', 'e',
            'i', 'n', 'a', 't', 'e', 'd'};
            
        char[] copyTo = java.util.Arrays.copyOfRange(copyFrom, 2, 9);
        
        System.out.println(new String(copyTo));
      }
   }

是的,你是对的。 System.out.println() 首先通过String.valueOf()‍‍ 将传递的对象转换为String,此方法调用对象的toString‍‍‍‍‍‍‍‍ 方法。 所以你可以在没有 new String().

的情况下打印 copyTo

那里不需要new String(copyTo)copyTo 就足够了。

通常,您不想在数组上调用 println。例如:

System.out.println(new int[]{1, 2, 3});

不会打印 [1, 2, 3]123,而是打印 [I@243432 之类的东西。这是因为int[](或其他数组类型,char[]除外)没有特殊重载,所以使用println(Object)。这会在参数上调用 toString();但是数组没有有用的 toString() 实现。

然而,PrintStream.println(char[]) method 确实 在某种程度上 有效,并且产生的输出就像 char[] 首先转换为 String (但请注意 toString() 方法 不是 用于生成此:没有 String 是从数组创建的)。

 System.out.println(new String(copyTo));
 System.out.println(copyTo);

Output:

caffein
caffein

我怀疑它只是文档中的一个 oversight/bug 使用了 new String。我向 Oracle 提交了错误报告以修复它。

new String()使用与传递的参数相同的字符序列初始化String的新对象,在这种情况下,参数是copyTo。
首先,将所需数量的字符复制到数组 copyTo 中。并将此数组传递给函数 String。 String 函数将从数组 copyTo 中创建一个单词。关键字 new 用于创建字符串的新实例(对象),因为字符串是 Java 中的 class。

您也可以使用 System.out.println(copyTo); 做同样的事情。这仅适用于 char 类型的数组。