`

ArrayList.toArray()之迷

    博客分类:
  • Java
 
阅读更多

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 , 使用的时候要注意。

分享到:
评论

相关推荐

    list.toArray方法

    标签“源码”暗示了可能涉及对Java标准库中List接口和ArrayList类的源代码分析,帮助读者理解`toArray()`在内存分配、性能优化等方面的设计。而“工具”可能指的是使用一些辅助工具(如IDE的调试功能)来跟踪和理解...

    Java ArrayList.toArray(T[]) 方法的参数类型是 T 而不是 E的原因分析

    Java ArrayList 类中的 `toArray(T[])` 方法的参数类型使用 `T` 而不是 `E`,这在初看之下似乎违背了泛型的主要目的——提供类型安全。然而,这样的设计实则是为了增加代码的灵活性和实用性。让我们深入探讨一下其中...

    java中数组列表ArrayList的使用.doc

    6. ToArray 方法 这个方法把 ArrayList 的元素 Copy 到一个新的数组中。 在使用 ArrayList 时,需要注意线程同步的问题,如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用 lock 来保持线程同步...

    Java中ArrayList类的用法.pdf

    同时,你可以通过`Add`方法连续添加元素,或者通过`ToArray`方法将ArrayList转换为特定类型的数组: ```java for (int i = 0; i ; i++) list.add(i + 20); Int32[] values = (Int32[])list.toArray(new Int32[0]);...

    arraylist用法

    `ToArray`方法可以将`ArrayList`转换为数组。需要注意的是,转换时必须指定目标数组的类型,否则会导致类型不匹配的异常。例如: ```csharp ArrayList list = new ArrayList(); list.Add(1); list.Add(2); ...

    ArrayList深度剖析与简单实用

    例如,上述代码中`(Int32[])List.ToArray(typeof(Int32))`将ArrayList转换为Int32类型的数组。 4. **线程安全和同步机制** 在多线程环境下,如果不使用同步的ArrayList实例,需要自行管理线程同步,如使用`lock`...

    java中数组列表arraylist的使用.docx

    - `ToArray`方法:将`ArrayList`转换为数组。 #### 五、示例代码解析 以下是一些具体的示例代码: ```java // 创建并初始化ArrayList ArrayList&lt;Integer&gt; list = new ArrayList(); list.add(1); list.add(2); ...

    java ArrayList的使用与分析

    - **转换为数组**:如示例所示,可以使用 `toArray` 方法将 ArrayList 转换为数组:`Int32[] values = (Int32[])list.toArray(new Int32[0]);` - **从数组创建 ArrayList**:`ArrayList list = new ArrayList...

    java中数组列表ArrayList的使用[归类].pdf

    在Java编程语言中,ArrayList是`java.util.ArrayList`类的一个实例,它是`List`接口的实现,基于可变大小的数组。ArrayList提供了一种灵活的方式来存储和操作一系列对象,同时具备动态增长和缩小容量的能力。下面将...

    Java中ArrayList类的用法.docx

    最后,如果想要将`ArrayList`转换为普通的数组类型,可以使用`toArray`方法: ```java Integer[] values = list.toArray(new Integer[0]); ``` #### 三、ArrayList的重要方法和属性 ##### 1. 构造器 `ArrayList`...

    ArrayList类操作程序实例

    2. `toArray(T[] array)`:将ArrayList转换为指定类型的数组。 九、ArrayList的线程安全性 ArrayList不是线程安全的,这意味着在多线程环境下,对ArrayList的操作需要额外的同步措施,如使用`Collections....

    ArrayList源码分析.docx 等

    这里需要注意的是,如果 `c.toArray()` 返回的不是 `Object[]` 类型,那么会通过 `Arrays.copyOf` 进行类型转换,确保 `elementData` 是 `Object[]` 类型。 在 ArrayList 中,`add` 方法是用于添加元素的核心方法。...

    C#ArrayList用法

    `ToArray`方法用于将`ArrayList`转换为数组。这通常用于需要固定大小的数据结构或者进行性能优化的场景。 #### 四、注意事项 - 在使用`ArrayList`时,需要意识到它的性能特点。由于它是基于数组实现的,所以在插入...

    源码解析jdk7.0集合:ArrayList的底层实现原理.pdf

    在探讨 JDK 7.0 中 ArrayList 的底层实现原理之前,首先需要了解 ArrayList 作为 Java 集合框架中 List 接口的动态数组实现类的基本概念。ArrayList 提供了一种存储有序、可重复、允许为 null 的数据结构,并且该...

    Android中ArrayList和数组相互转换

    在Android开发中,数据结构的灵活运用是提升代码效率的关键之一。ArrayList和数组都是常见的数据存储方式,两者之间可以方便地进行转换。以下详细介绍ArrayList与数组的相互转换方法。 首先,我们将讨论如何将...

    C# 详细的解说了关于ArrayList的用法

    ArrayList是.NET Framework中的一种动态数组,它在C#编程中被广泛使用,特别是在早期版本的.NET框架中。ArrayList属于System.Collections命名空间,是System.Collections.ArrayList类的一个实例,它提供了存储和管理...

    C# Array和ArrayList,List区别

    ### C# 中 Array、...- **List**:结合了 Array 和 ArrayList 的优点,是现代 C# 编程中最常用的集合类型之一,支持类型安全性和高效的动态调整大小。 在实际开发过程中,应根据具体需求选择最合适的集合类型。

    List转换成String数组

    其中`ArrayList`是最常用的实现方式之一。 2. **String[]**: 字符串数组,即由多个`String`对象组成的数组。 #### 三、转换方法详解 **方法一:使用toArray()方法** ```java List&lt;String&gt; list = new ArrayList()...

Global site tag (gtag.js) - Google Analytics