一. Incident import java.util.ArrayList; import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); String[] tt =(String[]) list.toArray(new String[0]);
}
}
这段代码是没问题的,但我们看到String[] tt =(String[]) list.toArray(new String[0]) 中的参数很奇怪,然而去掉这个参数new String[0]却在运行时报错。。。
二. Root Cause Analysis 经研究发现toArray有两个方法: public Object[] toArray() { Object[] result = new Object[size]; System.arraycopy(elementData, 0, result, 0, size); return result; } 不带参数的toArray方法,是构造的一个Object数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException,这也就是上述问题的root cause了。
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方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常。
三. Solutions 因此在使用toArray的时候可以参考以下三种方式 1. Long[] l = new Long[<total size>]; list.toArray(l);
2. Long[] l = (Long[]) list.toArray(new Long[0]);
3. Long[] a = new Long[<total size>]; Long[] l = (Long[]) list.toArray(a);
四.Further Consideration 该容器中的元素已经用泛型限制了,那里面的元素就应该被当作泛型类型的来看了,然而在目前的java中却不是的,当直接String[] tt =(String[]) list.toArray()时,运行报错。回想一下,应该是java中的强制类型转换只是针对单个对象的,想要偷懒,将整个数组转换成另外一种类型的数组是不行的,这和数组初始化时需要一个个来也是类似的。 |
以上From: http://hi.baidu.com/%B4%CB%D6%D0%D3%D0%D5%E6%B5%C0/blog/item/8add93ec812dc9deb31cb1b0.html
- import java.util.*;
- class testList{
- public static void main(String[] args){
- //List<Character> list = new ArrayList<Character>();
- String[] str = "a b c".split(" ");
- System.out.println("字符串数组str,长度为:" + str.length);
- for(String c : str)
- System.out.println(c);
- List<Integer> list = new ArrayList<Integer>();
- list.add(1);
- list.add(2);
- list.add(3);
- list.add(4);
- Iterator<Integer> it = list.iterator();
- System.out.println("整型List list");
- while(it.hasNext())
- {
- System.out.println(it.next());
- }
- //数组转换成List
- List<String> li = new ArrayList<String>();
- li = Arrays.asList(str);
- Iterator<String> its = li.iterator();
- System.out.println("数组str -> list:");
- while(its.hasNext())
- {
- System.out.println(its.next());
- }
- //List转换成数组
- Integer[] b = (Integer[])list.toArray(new Integer[0]);
- System.out.println("List list -> 数组b");
- for(Integer i : b)
- System.out.println(i);
- //数组的fill方法
- int[] a = new int[5];
- Arrays.fill(a,0);
- System.out.println("数组a被0填充");
- for(int i : a)
- System.out.println(i);
- }
- }
下面的代码执行后:
- private void onButtonListToArrayClick() {
- // Array--->List
- String[] strArray = new String[] { "aa", "bb" };
- List<String> list = new ArrayList<String>(Arrays.asList(strArray));
- list.add("cc");
- // List--->Array
- String[] strArray2;
- try {
- strArray2 = (String[]) list.toArray();
- } catch (Exception e) {
- Log.i("ToArray", "failure:" + e.getMessage());
- }
- }
异常发生
原因为list.toArray()返回的是Object类型,强制转换的时候发生ClassCastException
程序修改如下:
- private void onButtonListToArrayClick() {
- // Array--->List
- String[] strArray = new String[] { "aa", "bb" };
- List<String> list = new ArrayList<String>(Arrays.asList(strArray));
- list.add("cc");
- // List--->Array
- String[] strArray2 = null;
- try {
- strArray2 = list.toArray(new String[0]);
- } catch (Exception e) {
- Log.i("ToArray", "failure:" + e.getMessage());
- }
- for (String element : strArray2) {
- Log.i("ToArray", "strArray2:" + element);
- }
- }
运行结果:
上面的方法
- strArray2 = list.toArray(new String[0]);
与下面的方法一样
- strArray2 = new String[list.size()];
- strArray2 = list.toArray(strArray2);
备注:
下面是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一致,就不会产生转型异常
http://blog.csdn.net/gh102/article/details/7301051
http://blog.csdn.net/guopengzhang/article/details/5497875
相关推荐
总之,Java中对象数组与JSON之间的转换是通过使用适当的库和方法来完成的。选择哪种库取决于项目的需求和偏好。无论是将Java对象数组转换为JSON,还是将JSON转换为Java对象数组,掌握这些转换技巧对于处理Web服务、...
- 这种方法与第一种方法类似,只是省略了`toArray()`方法中的参数传递,直接将数组传递给该方法即可。 **方法三:使用空数组作为参数** ```java List<String> list = new ArrayList(); list.add("a1"); list.add(...
在Java编程语言中,经常需要将`List<String>`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础...
在这个示例中,`Arrays.asList()` 方法被用来将字符串数组转换为 `List<String>` 类型的列表。需要注意的是,通过这种方式得到的列表实际上是数组的一个视图,对列表进行修改会直接影响原数组。如果希望得到一个新的...
我们可以在ArrayList中添加数组元素,然后使用toArray()方法转换回数组。 ```java int[] array1 = {1, 2, 3}; int[] array2 = {4, 5, 6}; ArrayList<Integer> list = new ArrayList(); for (int i : array1) {...
Java中数组与集合的相互转换实现解析非常重要,_arrays.asList() 方法可以将数组转换为集合,而 toArray() 方法可以将集合转换为数组。但是需要注意在使用这些方法时的注意事项,以免出现异常。
总的来说,Java中的List到数组的转换可以通过多种方式进行,包括使用传统的for循环或利用JDK 1.8引入的Stream API。选择哪种方法取决于你的项目需求,如对性能、代码可读性和简洁性的要求。理解这些转换方法可以帮助...
本篇文章将深入探讨数组和List之间的转换,以及它们在实际编程中的使用方法。 首先,数组是C#中预定义的一种数据类型,它提供了一种存储固定数量同类型元素的方式。数组分为一维数组、二维数组等,每种都有其特定的...
使用链式编程写法实现Java中byte数组的拼接。例如byte[] bytes = ByteUtils.get().add(0x41).add(07).add(11).add("15288930000").add(0x45).toArray();更灵活用法请参考Mybytes
例如,将数组转换为ArrayList: ```java List<Integer> list = new ArrayList(Arrays.asList(numbers)); ``` 八、数组作为方法参数 数组可以作为方法的参数传递,这在函数式编程中非常常见。例如,一个计算数组...
在Java编程中,有时我们需要将一个`List`对象转换为`String`数组,这在处理数据或进行数据传输时非常常见。以下将详细介绍两种主要的Java `List`转换成`String`数组的方法。 ### 方法一:使用`toArray()`方法 **...
总的来说,`list.toArray()`方法是Java编程中一个非常实用且基础的操作,它在处理集合与数组之间的转换时起着关键作用。通过理解其内部机制和使用技巧,开发者可以更好地利用这个工具来提升代码的可读性和性能。如果...
ArrayUtils还提供了将对象数组转换为基本类型数组,以及反之的转换方法,如`toObject()`和`toPrimitive()`。 10. **数组安全操作** 由于ArrayUtils的所有方法都不会抛出`NullPointerException`,因此在处理可能为...
可以使用`Arrays.asList()`方法将数组转换为List。例如,对于字符串数组: ```java String[] arr = {"Larry", "Moe", "Curly"}; List<String> list = Arrays.asList(arr); ``` 注意,这种方法创建的List是固定...
以下将详细介绍Java中List、Set与Array之间的转换方法。 1. **List与Array的转换** - **Array转List**: 如果你有一个数组,可以使用`Arrays.asList()`方法将其转换为List。例如: ```java String[] array = {...
它首先使用`split()`方法将原始字符串分割成字符串数组,然后使用`asList()`方法将数组转换为`List<String>`。最后,它通过`toArray()`方法将列表转换回字符串数组。代码通过遍历这些数据结构并打印其内容来验证转换...
将数组转换为List,可以使用`Arrays.asList()`方法。在Java 1.5及以上版本,这个方法支持对象数组和基本类型的数组。但是,对于基本类型的数组,`Arrays.asList()`会将整个数组作为一个元素放入List,而不是将数组...
除了上述方法外,还可以使用Java 8的流(Stream)API来实现数组的倒置,但这通常需要更多的代码,并且可能不适用于所有情况。对于基本类型数组,Java 8引入了IntStream、DoubleStream和LongStream等,这些流API可以...
- **数组操作函数**:Java的`Arrays`类提供了许多实用方法,如`sort()`排序数组,`equals()`比较数组内容,`copyOf()`复制数组等。 - **集合框架**:`ArrayList`和`LinkedList`等集合类可以动态增长,提供了更多的...
在Java中,我们可以使用`List`的`toArray()`方法将集合转换为数组。这个方法接受一个可选的参数,即目标类型的数组。如果提供了空数组,`toArray()`方法会根据集合的大小创建一个新的数组,并填充集合中的元素。...