java - Java中toString方法的实现
问题描述
当我想打印Boolean
(引用类型)的空数组时,结果为输出 #1。但是当我想打印一个原始布尔类型的空数组时,输出 #2就是结果。我知道类中的toString()
方法Object
默认运行。该方法的默认实现如下:
this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
但有趣的是,为什么 Z写在原始类型的输出中,而 int 是I?
public class ToStringApp {
public static void main(String[] args) {
Boolean[] refs = new Boolean[1];
System.out.println(refs);
// output #1: [Ljava.lang.Boolean;@3764951d
boolean[] prims = new boolean[1];
System.out.println(prims);
// output #2: [Z@4b1210ee
int[] ints = new int[0];
System.out.println(ints);
// output #3: [I@4d7e1886
}
}
解决方案
这就是Class
's的 JavadocgetName()
所说的:
字符串 java.lang.Class.getName()
以字符串形式返回此 Class 对象表示的实体(类、接口、数组类、原始类型或 void)的名称。...如果这个类对象表示一个数组类,那么名称的内部形式由元素类型的名称组成,前面有一个或多个“[”字符,表示数组嵌套的深度。元素类型名称的编码如下:
元素类型 编码 布尔值 Z 字节 乙 字符 C 类或接口 类名; 双倍的 D 漂浮 F 整数 一世 长 Ĵ 短的 小号
如您所见,B
已被 占用byte
,因此boolean
需要不同的字母。
推荐阅读
- kotlin - 通用 JPA 转换器在运行时不知道类型
- node.js - 迁移到 webpack 5:无法读取未定义的属性“原型”
- r - R如何分隔基于字符串的空格但保留小数点?
- javascript - 在 Javascript 中将对象设置为 null 时是否会删除事件侦听器?
- haskell - Haskell中括号内的双点是什么意思?
- ios - Swift 5 中不显示导航栏
- spring - 保存 ThreadPoolExecutor 的所有排队任务
- python - 如何编写脚本来检查 CSV 文件中现有 csv 中的空白单元格?
- flutter - Flutter 中的登录表单布局问题
- azure-devops - 多个项目和一个解决方案 - DevOps 最佳实践