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);}
分享到:
相关推荐
ArrayList与Array的区别概述 ArrayList 是数组的复杂版本。ArrayList 类提供在大多数 Collections 类中提供但不在 Array 类中提供的一些功能。例如: Array 的容量是固定的,而 ArrayList 的容量是根据需要自动...
`ToArray`方法可以将`ArrayList`转换为数组。需要注意的是,转换时必须指定目标数组的类型,否则会导致类型不匹配的异常。例如: ```csharp ArrayList list = new ArrayList(); list.Add(1); list.Add(2); ...
2. `toArray(T[] array)`:将ArrayList转换为指定类型的数组。 九、ArrayList的线程安全性 ArrayList不是线程安全的,这意味着在多线程环境下,对ArrayList的操作需要额外的同步措施,如使用`Collections....
可以使用 `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...
为了避免这种问题,应该确保传递的数组类型与 ArrayList 中的元素类型相匹配或者能接受 ArrayList 元素的所有类型。 总结来说,`ArrayList.toArray(T[])` 方法的参数类型选择 `T` 而非 `E` 是为了提高灵活性,允许...
- `ToArray(Type type)`: 将ArrayList转换为指定类型的数组。 3. **ArrayList的性能** - ArrayList的插入和删除操作在数组的中间位置时,效率较低,因为需要移动大量元素。 - 对于频繁的随机访问和修改,...
关于描述中提到的“博文链接”,虽然没有实际的文本内容,但通常博主会在博客中详细介绍`toArray()`方法的具体实现、效率分析、可能遇到的问题以及最佳实践。这可能包括源码解析,解释如何在Java集合框架的源码中...
- **转换为数组**:如示例所示,可以使用 `toArray` 方法将 ArrayList 转换为数组:`Int32[] values = (Int32[])list.toArray(new Int32[0]);` - **从数组创建 ArrayList**:`ArrayList list = new ArrayList...
而通过`ArrayList.Synchronized()`创建的线程安全实例,内部实现了锁机制,但在枚举操作时仍需注意同步问题。 5. **内存节省方法** 当ArrayList的Capacity大于实际需要时,可以通过`TrimToSize()`方法减少内存占用...
### C# 中 ArrayList 的使用详解 #### 一、概述 在C#中,`ArrayList`是一种非常实用的数据结构,它可以被视为动态数组的...通过理解其构造函数、属性和常用方法,开发人员可以有效地利用`ArrayList`解决各种实际问题。
ArrayList继承自Java的List接口,提供了toArray()方法,可以直接将ArrayList转换为数组。在示例代码中,我们可以看到两种转换方式: 1. 基于循环的转换: ```java String[] array = new String[size]; for (int i =...
- `ToArray`: 将ArrayList转换为数组。 5. **使用示例** 创建一个ArrayList,添加元素,然后进行删除操作: ```csharp ArrayList myList = new ArrayList(); myList.Add("Element1"); myList.Add("Element2")...
elementData = c.toArray(); size = elementData.length; if (elementData.getClass() != Object[].class) { elementData = Arrays.copyOf(elementData, size, Object[].class); } } ``` 此方法创建一个包含...
在使用`ArrayList`时需要注意以下几点性能问题: 1. **装箱拆箱操作**:对于基本类型如`int`,使用`ArrayList`时会自动装箱成`Integer`对象,这会导致额外的性能开销。因此,对于基本类型,建议使用特定类型的列表如...
- ArrayList不是线程安全的,如果在多线程环境中使用,需要自行处理同步问题。 6. 注意事项 - ArrayList在插入和删除元素时,如果超出当前容量,会自动扩容,扩容规则为`(oldCapacity * 3) / 2 + 1`。 - 当不再...
同时,你可以通过`Add`方法连续添加元素,或者通过`ToArray`方法将ArrayList转换为特定类型的数组: ```java for (int i = 0; i ; i++) list.add(i + 20); Int32[] values = (Int32[])list.toArray(new Int32[0]);...
arrayList0.toArray(is); ``` - **List排序** - **通过Comparable接口**:如果List中的元素类型实现了Comparable接口,可以直接使用`Collections.sort()`进行排序。如示例中的`PeopleBean`类: ```java List...
- 可以通过`ToArray`方法将ArrayList转换为数组,如示例所示,需要指定目标类型。 - 数组也可以转换为ArrayList,如`ArrayList list = new ArrayList(array);` 5. **线程安全与性能** - 默认情况下,ArrayList...
同时,ArrayList.Synchronized 方法可以返回一个线程同步的 ArrayList 实例,从而避免了线程同步的问题。 在实际应用中,ArrayList 常用于实现动态数组,例如,实现一个动态的列表,或者实现一个缓存机制等。在使用...