Java中可用类型[]::new引用数组构造器创建一维数组,适用于Supplier、Function等函数式接口;不支持多维数组构造引用,也不能初始化元素值或用于泛型数组。

Java 中没有直接的“数组构造方法引用”语法,但可以通过 类型[]::new 这种特殊形式,引用数组的构造器,用于创建一维或指定长度的数组对象。它本质是构造方法引用的一种特例,适用于函数式接口(如 Supplier、Function)中需要动态生成数组的场景。
基本用法:类型[]::new 创建一维数组
这是最常见、最标准的用法。当函数式接口的抽象方法返回一个数组,且参数为数组长度时,可直接使用 int[]::new、String[]::new 等形式:
-
创建指定长度的 int 数组:
IntFunction<int[]> arrayCreator = int[]::new;
调用arrayCreator.apply(5)→ 返回new int[5] -
配合 Stream 生成数组集合:
List<String[]> lists = Arrays.asList("a,b", "c,d,e").stream()<br> .map(s -> s.split(","))<br> .collect(Collectors.toList());
若想统一用构造引用替代 split 后的手动创建,需封装逻辑;但String[]::new本身不能直接用于 split,它只接受一个int参数并返回空数组。
不能直接用于多维数组
Java 不支持 int[][]::new 或 double[][][]::new 这样的写法。因为数组构造器只接受一个表示总长度的 int 参数,不支持传入多个维度尺寸。
- 例如:
int[][]::new编译失败 —— 没有匹配的构造器签名 - 若需创建二维数组,必须手动写
new int[rows][cols],或封装成静态工厂方法再引用,比如:static int[][] create2D(int rows, int cols) { return new int[rows][cols]; }
然后通过自定义函数接口调用,但无法用纯方法引用替代嵌套 new。
常见配合场景
数组构造引用主要在以下两类地方发挥作用:
立即学习“Java免费学习笔记(深入)”;
-
替代匿名内部类或 Lambda 创建数组:
原写法:Function<Integer, String[]> f = n -> new String[n];
方法引用简化:Function<Integer, String[]> f = String[]::new; -
与 Stream.generate 或 Arrays.setAll 配合:
String[] arr = new String[3];<br> Arrays.setAll(arr, String[]::new); // ❌ 错误!String[]::new 返回 String[],不是 String<br> Arrays.setAll(arr, i -> "item" + i); // 正确用法
实际上Arrays.setAll接收的是IntFunction<T>,所以更典型的是:int[] nums = new int[10];<br> Arrays.setAll(nums, i -> i * 2); // 不能用 int[]::new,因为它不接收索引
注意事项
使用时必须满足函数式接口契约,否则编译报错:
- 被引用的
类型[]::new只有一个int形参,返回对应类型的一维数组 - 不能用于初始化数组元素值(那是
Arrays.fill或循环的事) - 不能和泛型数组混用(如
List<String>[]::new不合法,因泛型擦除后类型不明确) - 若需创建带初始值的数组,仍需结合其他方式,例如:
Stream.generate(() -> "default").limit(5).toArray(String[]::new)


















