Java - 为何alibaba开发手册强制要求集合转数组用带参的toArray?

博客讨论了Java中集合转换为数组时,为何alibaba开发手册建议使用带参数的toArray(T[] a)方法。无参的toArray()返回Object[]类型,需要强转,而带参方法能确保类型安全并避免额外的null值。正确的做法是传入与集合大小相等的目标数组,以防止内存浪费。
摘要由CSDN通过智能技术生成

Java - 为何alibaba开发手册强制要求集合转数组用带参的toArray?

一. 运用场景

当我们需要将集合转化为数组的时候,就需要用到集合的toArray()方法。toArray()用两个重载方法,其结构如下:

public Object[] toArray() {
    return Arrays.copyOf(elementData, size);
}

public <T> T[] toArray(T[] a) {
    if (a.length < size)
        // Make a new array of a's runtime type, but my contents:
        return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

1.1 无参toArray()的不可行性。

我们先来看下不带参数的toArray()

@Test
public void testToArray() {
    ArrayList<java.lang.String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    // 不带参数的toArray方法,返回类型是Object[],需要强转为String。
    String[] arr1 = (String[]) list.toArray();
    for (String s : arr1) {
        System.out.println(s);
    }
}

输出结果为:
在这里插入图片描述
可见,如果我们通过无参的toArray()方法,将集合转为数组,但是希望直接对原集合中的元素类型做对应的类型操作,显然是不允许的,因为Object类型的数组无法强转。

一个类型能否向上转型(强转)关键是看该变量所指向对象与目标类型是否存在继承关系,如果存在则可以强转。
单个Object类型是可以进行强转的,因为Object类型是所有类型的父类,但是对于Object[]类型的数组,显然其并不是String[]类型的父类。因此不能强转。

1.2 toArray(T[] a)的注意点

再来观察toArray(T[] a)方法:

public <T> T[] toArray(T[] a) {
	// size指的是集合的元素个数,a.length则是我们传入的参数:数组的长度。
    if (a.length < size)
        // 重新分配内存空间,并返回一个新的数组地址
        return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    // 如果传入指定的数组大小 超过了 集合元素的大小
    if (a.length > size)
    	// 可见,多余的部分将会变成null
        a[size] = null;
    return a;
}

可以发现,若数组元素 > 实际所需,下标为list.size()的元素会变成null,因此我们应该对目标数组的大小作出规范,做到:集合有多少个元素,转成的数组就有多少个元素。

案例如下:

数组元素 > 实际所需

@Test
public void testToArray() {
    ArrayList<java.lang.String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    String[] arr2 = list.toArray(new String[5]);
    for (String s : arr2) {
        System.out.println(s);
    }
}

代码运行为:
在这里插入图片描述

正确写法:

@Test
public void testToArray() {
    ArrayList<java.lang.String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    String[] arr2 = list.toArray(new String[list.size()]);
    for (String s : arr2) {
        System.out.println(s);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zong_0915

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值