java - 为什么选择 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));
}
}
解决方案
没有必要在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 提交了一份错误报告以修复它。
推荐阅读
- javascript - javascript倒数计时器设置为从开始日期到结束日期显示
- unity3d - 错误 CS1703:已导入具有相同标识的多个程序集 - Drawing.dll
- c++ - 类中的 const 声明
- sql - 如何在循环期间进行计数(*)?
- javascript - 安装模块时出现意外的令牌“<”错误
- regex - 将其他捕获组添加到正则表达式以实现“可读性”
- redux - 为什么 immer 抱怨计算属性?
- azure-devops - 容器化解决方案的发布管道
- node.js - Angular:JWT Token 在 Postman 上运行良好,但在我的应用程序中运行良好
- python - 找不到 Pytorch 模块