一、toarray()方法简介
toarray() 是 java 集合框架中定义在 java.util.collection 接口里的一个方法,用于将集合转换为数组。
方法签名:
// 无参版本 object[] toarray(); // 泛型版本(推荐使用) <t> t[] toarray(t[] a);
二、两种toarray()的区别
1. 无参toarray()
- 返回一个 object 类型数组
- 需要强制类型转换才能使用具体类型
list<string> list = list.of("java", "python", "c++");
object[] arr = list.toarray();
system.out.println(arrays.tostring(arr));
// 输出: [java, python, c++]
⚠️ 但是如果你想用 string[] 接收,手动转换:
string[] strarr = (string[]) list.toarray(); // 会报错 ❌
会抛出:
class [ljava.lang.object; cannot be cast to class [ljava.lang.string; ([ljava.lang.object; and [ljava.lang.string; are in module java.base of loader 'bootstrap')
原因:toarray() 返回的是 object[],而不是 string[]。因为数组在运行时知道自己的具体类型,反过来不能转换
2. 带参数的toarray(t[] a)(推荐使用)
这个方法允许我们指定返回数组的类型,是更安全、类型友好的方式。
list<string> list = list.of("java", "python", "c++");
string[] arr = list.toarray(new string[0]);
system.out.println(arrays.tostring(arr));
// 输出: [java, python, c++]
推荐写法:
t[] array = list.toarray(new t[0]);
jdk 11 以后甚至可以这样写:
string[] arr = list.toarray(string[]::new);
这种方式使用了 方法引用(method reference),更加简洁高效。
三、toarray(t[] a)方法的内部机制
jdk 源码(简化版):
public <t> t[] toarray(t[] a) {
if (a.length < size)
// 如果传入数组太小,则创建一个新的同类型数组
return (t[]) arrays.copyof(elementdata, size, a.getclass());
system.arraycopy(elementdata, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
👉 可以看出:
- 若传入数组大小不够,会创建一个新的;
- 若传入数组更大,则多余部分置为
null; - 返回的数组类型与传入数组的类型一致。
四、相关案例
示例 1:list 转数组
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5); // 推荐写法 integer[] numarray = numbers.toarray(new integer[0]); system.out.println(arrays.tostring(numarray)); // 输出: [1, 2, 3, 4, 5]
示例 2:set 转数组
set<string> set = new hashset<>(arrays.aslist("a", "b", "c"));
string[] arr = set.toarray(new string[0]);
system.out.println(arrays.tostring(arr));
// 输出: [a, b, c]
示例 3:使用方法引用(java 11+)
list<string> list = list.of("java", "kotlin", "scala");
// 使用方法引用创建新数组
string[] arr = list.toarray(string[]::new);
system.out.println(arrays.tostring(arr));
// 输出: [java, kotlin, scala]
示例 4:数组大小影响演示
list<string> list = list.of("a", "b", "c");
// 数组大小刚好
string[] arr1 = list.toarray(new string[3]);
system.out.println(arrays.tostring(arr1)); // [a, b, c]
// 数组大小过小
string[] arr2 = list.toarray(new string[1]); // 会创建新数组
system.out.println(arrays.tostring(arr2)); // [a, b, c]
// 数组大小过大
string[] arr3 = list.toarray(new string[5]);
system.out.println(arrays.tostring(arr3)); // [a, b, c, null, null]
五、数组转集合(反向操作)
除了 toarray(),我们也常常需要把数组变成集合,可以使用:
string[] arr = {"a", "b", "c"};
list<string> list = arrays.aslist(arr);
system.out.println(list); // [a, b, c]
⚠️ 注意:arrays.aslist() 返回的是一个定长列表,不能添加或删除元素。
如果需要可变集合:
list<string> list = new arraylist<>(arrays.aslist(arr));
list.add("d"); // ✅
六、常见错误与注意事项 ⚠️
| 错误场景 | 问题说明 | 正确做法 |
|---|---|---|
| (string[]) list.toarray() | 会抛出类型转换异常 | list.toarray(new string[0]) |
| 数组大小过小 | 自动创建新数组 | ✅ 安全 |
| 数组大小过大 | 多余部分会置 null | 注意空指针判断 |
| 修改数组不影响集合 | 二者是独立的 | toarray() 复制数据 |
| arrays.aslist() 不可添加删除元素 | 固定长度 | 用 new arraylist<>(...) |
七、性能小贴士
- 对于频繁转换的场景(尤其是大集合),建议使用:
list.toarray(new string[list.size()]);
避免额外的数组分配操作。
- 对于小集合或不确定大小,推荐:
list.toarray(new string[0]);
更简洁、安全。
jvm 对 new t[0] 模式已有优化(jdk 11+ 性能与预分配数组几乎无差异)。
八、总结表
| 方法 | 返回类型 | 是否安全 | 适用场景 |
|---|---|---|---|
| toarray() | object[] | 否(需强转) | 快速调试或简单场景 |
| toarray(t[] a) | t[] | ✅ 是 | 泛型集合转换 |
| toarray(string[]::new) | t[] | ✅ 推荐 | java 11+ 优雅写法 |
到此这篇关于java toarray() 方法 的使用的文章就介绍到这了,更多相关java toarray() 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论