首页 > 解决方案 > 为什么选择 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));
      }
   }

标签: javaprintln

解决方案


没有必要在new String(copyTo)那里。copyTo就足够了。

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

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

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

但是,该PrintStream.println(char[])方法确实工作得有些合理,并产生一个输出,就好像char[]转换为String第一个一样(但请注意,该toString()方法用于产生这个:noString是从数组创建的)。

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

输出

caffein
caffein

我怀疑这只是new String所使用文档中的疏忽/错误。我向 Oracle 提交了一份错误报告以修复它。


推荐阅读