ArrayList toArray() classCastexception异常 牵扯的问题

本文详细解析了Java中List的toArray()方法的工作原理及使用技巧,解释了ClassCastException异常的原因,并提供了正确的类型转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到如下问题:

List<String> list = new ArrayList<String>();
list.add("wang");
list.add("hello");
list.add("world");
// 不能转换成功    抛出classCastexception
String[] listToArray = (String[]) list.toArray();

来分析下源码:

public Object[] toArray() {
int s = size;
Object[] result = new Object[s];
System.arraycopy(array, 0, result, 0, s);
return result;
}

classCastexception异常是类型强制转换出错,换句话说就是String[]不是toArray()返回值的子类。
源码中可以清晰的看到 toArray返回的是Object[],并不是List<String>。  
所以toArray() 只适合那种不需要强行转换的情况。【啥情况?】


解决方法:使用toArray(T[] contents)

public <T> T[] toArray(T[] contents) {
int s = size;
if (contents.length < s) {
    @SuppressWarnings("unchecked") T[] newArray
        = (T[]) Array.newInstance(contents.getClass().getComponentType(), s);
    contents = newArray;
}
System.arraycopy(this.array, 0, contents, 0, s);
if (contents.length > s) {
    contents[s] = null;
}
return contents;
}

代码:

// I
String[] arr1 = list.toArray(new String[0]);
// II
String[] arr2 = new String[list.size()];
arr2 = list.toArray(arr2);

I:目的只是为了把类型传进去,使得返回的类型还是传进去的类型String
//T[] newArray  = (T[]) Array.newInstance(contents.getClass().getComponentType(), s)

II:用给的数组返回数据,不用重新new,效率上有一定提高。


// ADD 2011.8.25

Set<E>  里面的

toArray()

toArray(T[])

最终调用的是java.util.concurrent.CopyOnWriteArrayList

    public Object[] toArray() {
        Object[] elements = getArray();
        return Java6Arrays.copyOf(elements, elements.length);
    }
    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T a[]) {
        Object[] elements = getArray();
        int len = elements.length;
        if (a.length < len)
            return (T[]) Java6Arrays.copyOf(elements, len, a.getClass());
        else {
            System.arraycopy(elements, 0, a, 0, len);
            if (a.length > len)
                a[len] = null;
            return a;
        }
    }

原理跟ArrayList一样。

### 将 `ArrayList` 转换为数组 在 Java 中,可以使用 `ArrayList` 类的 `toArray()` 方法来实现这一操作。此方法提供了两种重载形式: - 不带参数的形式返回的是对象类型的数组 (`Object[]`)。 - 带有一个指定类型数组作为参数的形式,则会尝试创建并填充一个给定类型的数组。 下面是一个具体的例子展示如何执行这种转换[^1]: ```java import java.util.ArrayList; import java.util.Arrays; public class Main { public static void main(String[] args) { // 创建一个字符串类型的 ArrayList 并添加一些元素 ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("Apple"); arrayList.add("Banana"); arrayList.add("Orange"); // 使用 toArray(T[]) 方法将 ArrayList 转换成特定类型的数组 String[] stringArray = arrayList.toArray(new String[0]); // 打印结果以验证转换成功与否 System.out.println(Arrays.toString(stringArray)); } } ``` 这段代码展示了如何通过调用 `toArray(new String[0])` 来获取由 `ArrayList<String>` 转化而来的 `String[]` 数组,并打印出来确认其内容正确无误。 对于更现代的方法,在 Java 8 及以上版本中还可以利用流(Stream API)来进行类似的转换工作。这里给出另一个基于 Stream 的解决方案[^3]: ```java import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = Arrays.asList("Red", "Green", "Blue"); // 利用 stream 和 toArray 方法组合成一个新的数组 String[] resultArray = list.stream().toArray(String[]::new); // 输出新生成的数组 System.out.println(java.util.Arrays.toString(resultArray)); } } ``` 这两种方式都可以有效地完成从 `ArrayList` 至数组之间的转变过程;前者更为传统适用于所有支持泛型特性的 JDK 版本,后者则体现了函数式编程风格下的简洁表达力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值