`
uz31415926
  • 浏览: 7604 次
社区版块
存档分类
最新评论

ArrayList的toArray问题

阅读更多
arrayList.toArray()出错
                                      

public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("s1");
        arrayList.add("s2");
        String[] ss = (String[]) arrayList.toArray();  //这句抛出异常:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;    }


解决方法:

String[] ss = (String[]) arrayList.toArray(new String[0]);


理由:

下面是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一致,就不会产生转型异常

没参数的toArray用处:

ArrayList arrayList = new ArrayList();arrayList.add("test1");arrayList.add("test2");Object[] ss = arrayList.toArray();//这里不需要转型,也不能使用转型for (int i = 0; i < ss.length; i++) {    String str = (String) ss[i];//这里可以进行转型,取出原ArrayList里面存放的对象    System.out.println(str);}
分享到:
评论

相关推荐

    C#中Array与ArrayList用法及转换的方法

    ArrayList与Array的区别概述  ArrayList 是数组的复杂版本。ArrayList 类提供在大多数 Collections 类中提供但不在 Array 类中提供的一些功能。例如:  Array 的容量是固定的,而 ArrayList 的容量是根据需要自动...

    arraylist用法

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

    ArrayList类操作程序实例

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

    C# Array和ArrayList,List区别

    可以使用 `ToArray` 方法将 `ArrayList` 转换为 `Array`: ```csharp ArrayList al = new ArrayList { 1, 2, 3 }; int[] arr = (int[])al.ToArray(typeof(int)); foreach (int item in arr) { Console.WriteLine...

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

    为了避免这种问题,应该确保传递的数组类型与 ArrayList 中的元素类型相匹配或者能接受 ArrayList 元素的所有类型。 总结来说,`ArrayList.toArray(T[])` 方法的参数类型选择 `T` 而非 `E` 是为了提高灵活性,允许...

    你必须知道的C# ArrayList

    - `ToArray(Type type)`: 将ArrayList转换为指定类型的数组。 3. **ArrayList的性能** - ArrayList的插入和删除操作在数组的中间位置时,效率较低,因为需要移动大量元素。 - 对于频繁的随机访问和修改,...

    list.toArray方法

    关于描述中提到的“博文链接”,虽然没有实际的文本内容,但通常博主会在博客中详细介绍`toArray()`方法的具体实现、效率分析、可能遇到的问题以及最佳实践。这可能包括源码解析,解释如何在Java集合框架的源码中...

    java ArrayList的使用与分析

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

    ArrayList深度剖析与简单实用

    而通过`ArrayList.Synchronized()`创建的线程安全实例,内部实现了锁机制,但在枚举操作时仍需注意同步问题。 5. **内存节省方法** 当ArrayList的Capacity大于实际需要时,可以通过`TrimToSize()`方法减少内存占用...

    C#ArrayList用法

    ### C# 中 ArrayList 的使用详解 #### 一、概述 在C#中,`ArrayList`是一种非常实用的数据结构,它可以被视为动态数组的...通过理解其构造函数、属性和常用方法,开发人员可以有效地利用`ArrayList`解决各种实际问题。

    Android中ArrayList和数组相互转换

    ArrayList继承自Java的List接口,提供了toArray()方法,可以直接将ArrayList转换为数组。在示例代码中,我们可以看到两种转换方式: 1. 基于循环的转换: ```java String[] array = new String[size]; for (int i =...

    有关于C#的程序(ArrayList类,动态添加,删除的)

    - `ToArray`: 将ArrayList转换为数组。 5. **使用示例** 创建一个ArrayList,添加元素,然后进行删除操作: ```csharp ArrayList myList = new ArrayList(); myList.Add("Element1"); myList.Add("Element2")...

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

    elementData = c.toArray(); size = elementData.length; if (elementData.getClass() != Object[].class) { elementData = Arrays.copyOf(elementData, size, Object[].class); } } ``` 此方法创建一个包含...

    java中ArrayList的用法

    在使用`ArrayList`时需要注意以下几点性能问题: 1. **装箱拆箱操作**:对于基本类型如`int`,使用`ArrayList`时会自动装箱成`Integer`对象,这会导致额外的性能开销。因此,对于基本类型,建议使用特定类型的列表如...

    ArrayList类[文].pdf

    - ArrayList不是线程安全的,如果在多线程环境中使用,需要自行处理同步问题。 6. 注意事项 - ArrayList在插入和删除元素时,如果超出当前容量,会自动扩容,扩容规则为`(oldCapacity * 3) / 2 + 1`。 - 当不再...

    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]);...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    arrayList0.toArray(is); ``` - **List排序** - **通过Comparable接口**:如果List中的元素类型实现了Comparable接口,可以直接使用`Collections.sort()`进行排序。如示例中的`PeopleBean`类: ```java List...

    Java中ArrayList类的用法知识.pdf

    - 可以通过`ToArray`方法将ArrayList转换为数组,如示例所示,需要指定目标类型。 - 数组也可以转换为ArrayList,如`ArrayList list = new ArrayList(array);` 5. **线程安全与性能** - 默认情况下,ArrayList...

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

    同时,ArrayList.Synchronized 方法可以返回一个线程同步的 ArrayList 实例,从而避免了线程同步的问题。 在实际应用中,ArrayList 常用于实现动态数组,例如,实现一个动态的列表,或者实现一个缓存机制等。在使用...

Global site tag (gtag.js) - Google Analytics