`

Java中List转换为Array(转)

    博客分类:
  • java
阅读更多

遇到了同样的问题,解决了,看他讲的比较清楚,转过来。

 

Java中List转换为Array
2009-05-12 09:36
今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本。如下:
ArrayList<String> list=new ArrayList<String>();
String strings[]=(String [])list.toArray();

这样写代码个人觉得应该没什么问题,编译也没有问题。可是具体运行的时候报异常,如下:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
但是这么写是没有问题的:
ArrayList<String> list=new ArrayList<String>();
         String strings[]=new String[list.size()];
         for(int i=0,j=list.size();i<j;i++){
             strings[i]=list.get(i);
         }
对于这个现象我们可以这么解释:Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。数组的类型是[Ljava.lang.Object。把[Ljava.lang.Object转换成[Ljava.lang.String是显然不可能的事情,因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素是String的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。

根据上面的解释,我们可以把这个问题归纳到下面这个模型:
Object objs[]=new Object[10];
String strs[]=(String[])objs;

这样子和刚才上面编译错误是一样的。如果我们修改一下这个代码,如下:
String strs[]=new String[10];
Object objs[]=strs;

这样子就可以编译通过了。所以这个问题我们可以归结为一个Java转型规则的问题。下面谈一下Java数组对范型的支持问题。

JDK5中已经有了对范型的支持,这样可以保证在集合和Map中的数据类型的安全,可是,List的toArray方法返回的竟然是Object []让人很迷惑。个人感觉应该可以根据范型,直接返回相应的T []。仔细看了一下JDK的源码发现List转化为array有两个方法:

public Object[] toArray();
这个方法把List中的全部元素返回一个相同大小的数组,数组中的所有元素都为Object类型。

public <T> T[] toArray(T[] a);
这个方法把List中的全部元素返回一个相同大小的数组,数组中的所有元素都为T类型。

List如此设计是因为Java编译器不允许我们new范型数组。也就是说你不能这么定义一个数组:
T arr=new T[size];

但是你却可以用T[]来表示数组,而且可以把数组强制转化为T[]。比如List中的public <T> T[] toArray(T[] a)是这么实现的:
     public <T> T[] toArray(T[] a) {
         if (a.length < size)
             a = (T[])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;
     }

从上面代码中可以看到,因为你不知道这个数组的类型,你必须通过反射机制创建这个数组(a.getClass().getComponentType()方法是取得一个数组元素的类型)。

最终,List转换为Array可以这样处理:

ArrayList<String> list=new ArrayList<String>();

String[] strings = new String[list.size()];

list.toArray(strings);

反过来,如果要将数组转成List怎么办呢?如下:

String[] s = {"a","b","c"}; 
List list = java.util.Arrays.asList(s);

 

 

分享到:
评论

相关推荐

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

    - **Set转Array**: 与List相似,你可以先将Set转换为List,再将List转换为Array: ```java Set&lt;String&gt; set = ...; List&lt;String&gt; list = new ArrayList(set); String[] array = new String[list.size()]; list...

    java XML转成LIST可以转成指定的类数组

    当处理XML文件时,有时我们需要将其内容转换为Java对象,如List,以便于操作和处理。本篇文章将深入探讨如何将XML转换为指定类型的List数组,并涉及多层数据结构的处理。 1. **Java XML解析库** 在Java中,有多种...

    java中List、Array、Map、Set等集合相互转换

    在 Java 中,集合类型的转换是非常常见的操作,例如将 List 转换为 Array、将 Array 转换为 List、将 Map 转换为 List 等等。今天,我们将详细介绍 Java 中 List、Array、Map、Set 等集合相互转换的方法。 List ...

    详解Java如何在Array和List之间进行转换.rar

    在Java编程语言中,Array(数组)和List是两种常用的数据结构,它们各自有各自的特性和应用场景。然而,在实际开发中,我们常常需要在数组和列表之间进行转换,以适应不同的需求。本篇将深入探讨Java中如何实现Array...

    list转换成string数组

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

    java-对象数组转换为json

    下面将深入探讨如何在Java中实现对象数组向JSON的转换,并反过来将JSON字符串转换为Java对象数组,同时也会提及一些相关技术和代码示例。 ### Java对象数组转JSON 首先,我们来看如何将一个Java对象数组转换成JSON...

    数组和list相互转换

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

    List转换成String数组

    ### List转换成String数组 在Java编程中,我们经常需要对集合进行操作,尤其是在处理大量字符串数据时。本文将详细介绍如何将一个`List&lt;String&gt;`类型的集合转换为`String[]`数组,并通过不同的方法来实现这一过程。...

    Java集合List与Array的相互转换

    在Java中,List接口提供了一个`toArray(T[] array)`方法,用于将List转换为指定类型的数组。这个方法需要一个参数,即目标类型的数组实例,数组的大小应等于List的大小。如果传入的数组大小小于List的大小,系统会...

    java-任何类型转换成json数据格式

    在Java应用中,经常会遇到需要将Java对象或集合等数据结构转换为JSON字符串的需求。例如,在与Web服务交互时,通常会将Java对象序列化为JSON字符串以便于传输。 #### 二、核心类与方法介绍 在所提供的代码片段中,...

    使用json-lib将java对象转换成json字符串

    标题中的“使用json-lib将java对象转换成json字符串”指的是在Java编程中,利用json-lib这个库来将Java对象转化为JSON格式的字符串。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端...

    Java 在 Array 和 Set 之间进行转换的示例.rar

    - **数据丢失**:当从Array转换到Set时,如果Array中有重复元素,Set会自动去除重复,因为Set不允许重复元素。 - **类型安全**:在进行转换时,确保源类型和目标类型匹配,否则可能会出现ClassCastException。 - ...

    AXIS2中OMElement和Java对象之间的转换

    在上面的方法中,我们使用了 BeanUtil 工具类将 Java 对象转换为 XMLStreamReader,然后使用 StAXOMBuilder 将其转换为 OMElement。这样,我们就可以将 Java 对象转换为 OMElement,以便在 AXIS2 中使用。 AXIOM 还...

    Array和Collection相互转换以及copy深度的小测

    在Java编程语言中,`Array`和`Collection`之间的转换是常见的操作,特别是在处理数据结构时。本篇文章将深入探讨如何进行这些转换以及涉及到的复制(copy)深度问题。 首先,`Array`和`Collection`是Java中两种不同...

    Java 数组转list.docx

    Java 数组转换为 List 是 Java 编程中一个常见的操作。List 是 Java 中的一种集合类型,用于存储多个元素,而数组是固定长度的元素集合。将数组转换为 List 可以提供更多的灵活性和便捷性。在本文中,我们将介绍两种...

    java类型转换大全

    `则将List转换回数组。 7. **泛型的类型擦除与转换**:泛型在编译时期进行类型检查,但在运行时类型信息会被擦除。因此,虽然在声明泛型时有类型限制,但实际操作时仍需注意类型转换。 8. **Object的转型**:所有...

    JSON 字符串 与 java 对象的转换

    Java作为服务器端开发的主流语言之一,如何高效地将JSON字符串与Java对象进行转换显得尤为重要。本文将详细介绍如何使用`json-lib`库来进行JSON字符串与Java对象之间的相互转换,并提供具体的代码示例。 #### 二、...

    JSON与JAVA数据的转换

    **将Java List转换为JSON:** - 直接使用`JSONArray.fromObject()`方法即可。 ```java List&lt;String&gt; list = new ArrayList(); list.add("first"); list.add("second"); JSONArray jsonArray = JSONArray.from...

    JAVA JSON;String 转换为 java类

    当你从服务器接收到一个JSON格式的字符串,可能需要将其转换为Java对象以便于处理。这个过程通常称为反序列化。本文将详细探讨如何在Java中将JSON字符串转换为Java实体类。 首先,你需要引入一个JSON库,如Jackson...

    java 数组转list.docx

    在 Java 中,将数组转换为 List 是一个常见的操作。下面将详细介绍四种常用的方法,以便更好地理解和应用。 方法 1:使用 Arrays 类的 asList() 方法 使用 Arrays 类的 asList() 方法可以将数组转换为 List。该...

Global site tag (gtag.js) - Google Analytics