List提供了toArray()的方法,但是要使用不好,就会有ClassCastException
究竟这个是如何产生的,且看代码:
-----------------------------------------------------------------------------------
List list = new ArrayList();
list.add(new Long(1));list.add(new Long(2));
list.add(new Long(3));list.add(new Long(4));
Long[] l = (Long[])list.toArray();
for(int i=0; i<l.length; i++)
System.out.println(l[i].longValue());
-----------------------------------------------------------------------------------
会抛java.lang.ClassCastException。
下面是ArrayList的两个toArray()方法的源代码:
-----------------------------------------------------------------------------------
public Object[] toArray() {
Object[] result = new Object[size];
System.arraycopy(elementData, 0, result, 0, size);
return result;
}
public Object[] toArray(Object a[]) {
if (a.length < size)
a = (Object[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
-----------------------------------------------------------------------------------
可以看出,不带参数的toArray方法,是构造的一个Object数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException
而带参数的toArray方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以Object数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常
正确的方式
1. Long[] l = (Long []) list.toArray(new Long[0]);
2. Long [] a = new Long[<total size>];
Long [] l = (Long []) list.toArray(a);
2要注意的是:你要是传入的参数为9个大小,而list里面有5个object,那么其他的四个很可能是null , 使用的时候要注意。
分享到:
相关推荐
标签“源码”暗示了可能涉及对Java标准库中List接口和ArrayList类的源代码分析,帮助读者理解`toArray()`在内存分配、性能优化等方面的设计。而“工具”可能指的是使用一些辅助工具(如IDE的调试功能)来跟踪和理解...
Java ArrayList 类中的 `toArray(T[])` 方法的参数类型使用 `T` 而不是 `E`,这在初看之下似乎违背了泛型的主要目的——提供类型安全。然而,这样的设计实则是为了增加代码的灵活性和实用性。让我们深入探讨一下其中...
6. ToArray 方法 这个方法把 ArrayList 的元素 Copy 到一个新的数组中。 在使用 ArrayList 时,需要注意线程同步的问题,如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用 lock 来保持线程同步...
同时,你可以通过`Add`方法连续添加元素,或者通过`ToArray`方法将ArrayList转换为特定类型的数组: ```java for (int i = 0; i ; i++) list.add(i + 20); Int32[] values = (Int32[])list.toArray(new Int32[0]);...
`ToArray`方法可以将`ArrayList`转换为数组。需要注意的是,转换时必须指定目标数组的类型,否则会导致类型不匹配的异常。例如: ```csharp ArrayList list = new ArrayList(); list.Add(1); list.Add(2); ...
例如,上述代码中`(Int32[])List.ToArray(typeof(Int32))`将ArrayList转换为Int32类型的数组。 4. **线程安全和同步机制** 在多线程环境下,如果不使用同步的ArrayList实例,需要自行管理线程同步,如使用`lock`...
- `ToArray`方法:将`ArrayList`转换为数组。 #### 五、示例代码解析 以下是一些具体的示例代码: ```java // 创建并初始化ArrayList ArrayList<Integer> list = new ArrayList(); list.add(1); list.add(2); ...
- **转换为数组**:如示例所示,可以使用 `toArray` 方法将 ArrayList 转换为数组:`Int32[] values = (Int32[])list.toArray(new Int32[0]);` - **从数组创建 ArrayList**:`ArrayList list = new ArrayList...
在Java编程语言中,ArrayList是`java.util.ArrayList`类的一个实例,它是`List`接口的实现,基于可变大小的数组。ArrayList提供了一种灵活的方式来存储和操作一系列对象,同时具备动态增长和缩小容量的能力。下面将...
最后,如果想要将`ArrayList`转换为普通的数组类型,可以使用`toArray`方法: ```java Integer[] values = list.toArray(new Integer[0]); ``` #### 三、ArrayList的重要方法和属性 ##### 1. 构造器 `ArrayList`...
2. `toArray(T[] array)`:将ArrayList转换为指定类型的数组。 九、ArrayList的线程安全性 ArrayList不是线程安全的,这意味着在多线程环境下,对ArrayList的操作需要额外的同步措施,如使用`Collections....
这里需要注意的是,如果 `c.toArray()` 返回的不是 `Object[]` 类型,那么会通过 `Arrays.copyOf` 进行类型转换,确保 `elementData` 是 `Object[]` 类型。 在 ArrayList 中,`add` 方法是用于添加元素的核心方法。...
`ToArray`方法用于将`ArrayList`转换为数组。这通常用于需要固定大小的数据结构或者进行性能优化的场景。 #### 四、注意事项 - 在使用`ArrayList`时,需要意识到它的性能特点。由于它是基于数组实现的,所以在插入...
在探讨 JDK 7.0 中 ArrayList 的底层实现原理之前,首先需要了解 ArrayList 作为 Java 集合框架中 List 接口的动态数组实现类的基本概念。ArrayList 提供了一种存储有序、可重复、允许为 null 的数据结构,并且该...
ArrayList是.NET Framework中的一种动态数组,它在C#编程中被广泛使用,特别是在早期版本的.NET框架中。ArrayList属于System.Collections命名空间,是System.Collections.ArrayList类的一个实例,它提供了存储和管理...
### C# 中 Array、...- **List**:结合了 Array 和 ArrayList 的优点,是现代 C# 编程中最常用的集合类型之一,支持类型安全性和高效的动态调整大小。 在实际开发过程中,应根据具体需求选择最合适的集合类型。
其中`ArrayList`是最常用的实现方式之一。 2. **String[]**: 字符串数组,即由多个`String`对象组成的数组。 #### 三、转换方法详解 **方法一:使用toArray()方法** ```java List<String> list = new ArrayList()...
1.长 增加add,查看下表,遍历,删除值,下标,数组,改下标付值, ...8.ToArray();--object 不足:1.如果存储值类型,需要装箱和拆箱操作 2.不管什么类型的数据,存储之后,取出来使用必须通过类型转换