`

Java中toArray的用法探究(java数组与list转换)

阅读更多

一.             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方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayListsize一致的空数组,虽然方法本身还是以 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

 

 

 

 

[java] view plain copy
 
  1. import java.util.*;  
  2.   
  3. class testList{  
  4.     public static void main(String[] args){  
  5.         //List<Character> list = new ArrayList<Character>();  
  6.         String[] str = "a b c".split(" ");    
  7.         System.out.println("字符串数组str,长度为:" + str.length);  
  8.         for(String c : str)  
  9.             System.out.println(c);  
  10.               
  11.               
  12.         List<Integer> list = new ArrayList<Integer>();  
  13.         list.add(1);  
  14.         list.add(2);  
  15.         list.add(3);  
  16.         list.add(4);  
  17.         Iterator<Integer> it = list.iterator();  
  18.         System.out.println("整型List list");  
  19.         while(it.hasNext())  
  20.         {  
  21.             System.out.println(it.next());  
  22.         }  
  23.           
  24.         //数组转换成List  
  25.         List<String> li = new ArrayList<String>();  
  26.         li = Arrays.asList(str);         
  27.         Iterator<String> its = li.iterator();  
  28.         System.out.println("数组str -> list:");  
  29.         while(its.hasNext())  
  30.         {  
  31.             System.out.println(its.next());  
  32.         }  
  33.           
  34.         //List转换成数组  
  35.         Integer[] b = (Integer[])list.toArray(new Integer[0]);  
  36.         System.out.println("List list -> 数组b");  
  37.         for(Integer i : b)  
  38.             System.out.println(i);  
  39.           
  40.         //数组的fill方法  
  41.         int[] a = new int[5];  
  42.         Arrays.fill(a,0);  
  43.         System.out.println("数组a被0填充");  
  44.         for(int i : a)  
  45.             System.out.println(i);            
  46.     }  
  47. }  

 

 

 

下面的代码执行后:

 

[java] view plain copy
 
  1. private void onButtonListToArrayClick() {  
  2.     // Array--->List  
  3.     String[] strArray = new String[] { "aa""bb" };  
  4.     List<String> list = new ArrayList<String>(Arrays.asList(strArray));  
  5.     list.add("cc");  
  6.     // List--->Array  
  7.     String[] strArray2;  
  8.     try {  
  9.         strArray2 = (String[]) list.toArray();  
  10.     } catch (Exception e) {  
  11.         Log.i("ToArray""failure:" + e.getMessage());  
  12.     }  
  13.   
  14. }  


异常发生

 

原因为list.toArray()返回的是Object类型,强制转换的时候发生ClassCastException

程序修改如下:

 

[java] view plain copy
 
  1. private void onButtonListToArrayClick() {  
  2.     // Array--->List  
  3.     String[] strArray = new String[] { "aa""bb" };  
  4.     List<String> list = new ArrayList<String>(Arrays.asList(strArray));  
  5.     list.add("cc");  
  6.     // List--->Array  
  7.     String[] strArray2 = null;  
  8.     try {  
  9.         strArray2 = list.toArray(new String[0]);  
  10.     } catch (Exception e) {  
  11.         Log.i("ToArray""failure:" + e.getMessage());  
  12.     }  
  13.     for (String element : strArray2) {  
  14.         Log.i("ToArray""strArray2:" + element);  
  15.     }  
  16.   
  17. }  


运行结果:

 

上面的方法

 

[java] view plain copy
 
  1. strArray2 = list.toArray(new String[0]);  


与下面的方法一样

 

 

[java] view plain copy
 
  1. strArray2 = new String[list.size()];  
  2. strArray2 = list.toArray(strArray2);  


备注:

 

下面是ArrayList的两个toArray()方法的源代码:

 

[java] view plain copy
 
  1. public Object[] toArray() {   
  2.    Object[] result = new Object[size];     
  3.    System.arraycopy(elementData, 0, result, 0, size);     
  4.    return result;   
  5. }   
  6. public Object[] toArray(Object a[]) {     
  7. if (a.length < size)         
  8. a = (Object[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);       System.arraycopy(elementData, 0, a, 0, size);     
  9. if (a.length > size)         
  10. a[size] = null;     
  11. return a;   
  12. }   


①不带参数的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之间的转换是通过使用适当的库和方法来完成的。选择哪种库取决于项目的需求和偏好。无论是将Java对象数组转换为JSON,还是将JSON转换为Java对象数组,掌握这些转换技巧对于处理Web服务、...

    List转换成String数组

    - 这种方法与第一种方法类似,只是省略了`toArray()`方法中的参数传递,直接将数组传递给该方法即可。 **方法三:使用空数组作为参数** ```java List&lt;String&gt; list = new ArrayList(); list.add("a1"); list.add(...

    list转换成string数组

    在Java编程语言中,经常需要将`List&lt;String&gt;`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础...

    数组和list相互转换

    在这个示例中,`Arrays.asList()` 方法被用来将字符串数组转换为 `List&lt;String&gt;` 类型的列表。需要注意的是,通过这种方式得到的列表实际上是数组的一个视图,对列表进行修改会直接影响原数组。如果希望得到一个新的...

    java 数组的合并

    我们可以在ArrayList中添加数组元素,然后使用toArray()方法转换回数组。 ```java int[] array1 = {1, 2, 3}; int[] array2 = {4, 5, 6}; ArrayList&lt;Integer&gt; list = new ArrayList(); for (int i : array1) {...

    Java中数组与集合的相互转换实现解析

    Java中数组与集合的相互转换实现解析非常重要,_arrays.asList() 方法可以将数组转换为集合,而 toArray() 方法可以将集合转换为数组。但是需要注意在使用这些方法时的注意事项,以免出现异常。

    List<Long>转一维数组 Long[](csdn)————程序.pdf

    总的来说,Java中的List到数组的转换可以通过多种方式进行,包括使用传统的for循环或利用JDK 1.8引入的Stream API。选择哪种方法取决于你的项目需求,如对性能、代码可读性和简洁性的要求。理解这些转换方法可以帮助...

    c#之数组和list转换

    本篇文章将深入探讨数组和List之间的转换,以及它们在实际编程中的使用方法。 首先,数组是C#中预定义的一种数据类型,它提供了一种存储固定数量同类型元素的方式。数组分为一维数组、二维数组等,每种都有其特定的...

    java中字节数组拼接

    使用链式编程写法实现Java中byte数组的拼接。例如byte[] bytes = ByteUtils.get().add(0x41).add(07).add(11).add("15288930000").add(0x45).toArray();更灵活用法请参考Mybytes

    Java中数组的各种应用

    例如,将数组转换为ArrayList: ```java List&lt;Integer&gt; list = new ArrayList(Arrays.asList(numbers)); ``` 八、数组作为方法参数 数组可以作为方法的参数传递,这在函数式编程中非常常见。例如,一个计算数组...

    Java List转换成String数组几种实现方式详解

    在Java编程中,有时我们需要将一个`List`对象转换为`String`数组,这在处理数据或进行数据传输时非常常见。以下将详细介绍两种主要的Java `List`转换成`String`数组的方法。 ### 方法一:使用`toArray()`方法 **...

    list.toArray方法

    总的来说,`list.toArray()`方法是Java编程中一个非常实用且基础的操作,它在处理集合与数组之间的转换时起着关键作用。通过理解其内部机制和使用技巧,开发者可以更好地利用这个工具来提升代码的可读性和性能。如果...

    数组工具JAVA类

    ArrayUtils还提供了将对象数组转换为基本类型数组,以及反之的转换方法,如`toObject()`和`toPrimitive()`。 10. **数组安全操作** 由于ArrayUtils的所有方法都不会抛出`NullPointerException`,因此在处理可能为...

    java list,set,map,数组间的相互转换详解

    可以使用`Arrays.asList()`方法将数组转换为List。例如,对于字符串数组: ```java String[] arr = {"Larry", "Moe", "Curly"}; List&lt;String&gt; list = Arrays.asList(arr); ``` 注意,这种方法创建的List是固定...

    java List、Set与Array之间的相互转换

    以下将详细介绍Java中List、Set与Array之间的转换方法。 1. **List与Array的转换** - **Array转List**: 如果你有一个数组,可以使用`Arrays.asList()`方法将其转换为List。例如: ```java String[] array = {...

    浅谈java 字符串,字符数组,list间的转化

    它首先使用`split()`方法将原始字符串分割成字符串数组,然后使用`asList()`方法将数组转换为`List&lt;String&gt;`。最后,它通过`toArray()`方法将列表转换回字符串数组。代码通过遍历这些数据结构并打印其内容来验证转换...

    数组与List之间相互转换的方法详解

    将数组转换为List,可以使用`Arrays.asList()`方法。在Java 1.5及以上版本,这个方法支持对象数组和基本类型的数组。但是,对于基本类型的数组,`Arrays.asList()`会将整个数组作为一个元素放入List,而不是将数组...

    Java数组倒置.rar

    除了上述方法外,还可以使用Java 8的流(Stream)API来实现数组的倒置,但这通常需要更多的代码,并且可能不适用于所有情况。对于基本类型数组,Java 8引入了IntStream、DoubleStream和LongStream等,这些流API可以...

    java 数组求和计算

    - **数组操作函数**:Java的`Arrays`类提供了许多实用方法,如`sort()`排序数组,`equals()`比较数组内容,`copyOf()`复制数组等。 - **集合框架**:`ArrayList`和`LinkedList`等集合类可以动态增长,提供了更多的...

    集合(list为例)与数组的互相转换。

    在Java中,我们可以使用`List`的`toArray()`方法将集合转换为数组。这个方法接受一个可选的参数,即目标类型的数组。如果提供了空数组,`toArray()`方法会根据集合的大小创建一个新的数组,并填充集合中的元素。...

Global site tag (gtag.js) - Google Analytics