Java中int[]与Object类的关系及Stream.of输出哈希值问题咨询
int[]与Object类的从属关系
- Java中所有数组类型,无论存储的是基本类型数据还是引用类型数据,都是直接继承自Object的引用类型,属于JVM定义的合法类类型。
- 泛型规则仅限制基本数据类型(如原生的int、long)不能作为类型参数,所有引用类型(包括int[]这类数组类型)都可以正常作为泛型的类型参数。因此
Stream<int[]>完全符合语法要求,和“Stream仅接收类类型作为泛型参数”的规则没有冲突。
两段代码的行为差异说明
Arrays.stream()做了针对基本类型数组的重载适配:当传入int[]参数时,会直接匹配返回IntStream的重载方法,流内的元素是数组拆分后的每一个int值,因此遍历输出时会依次打印1 2 3 4 5。Stream.of()是通用泛型方法,没有针对基本类型数组做拆包处理:方法逻辑是把传入的整个实参作为流的单个元素,泛型推导时会将整个int[]作为类型T,最终生成Stream<int[]>,流中仅包含arr这个数组对象本身,没有拆分出数组内部的元素。- 输出十六进制哈希值的原因:Java的数组类型没有重写Object的
toString()方法,当把数组对象传入System.out.print()时,会默认使用Object类的toString实现,输出格式为“类型标识@无符号十六进制哈希值”——int数组的类型标识为I,因此会出现I@asdf这类输出,本质是打印了整个数组对象的默认字符串表示,没有遍历内部元素。
内容的提问来源于stack exchange,提问作者Jon B
相关产品推荐
相关产品推荐

