`

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之间的相互转换

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

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

    主要介绍了java中List、Array、Map、Set等集合相互转换的相关资料,需要的朋友可以参考下

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

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

    Java集合List与Array的相互转换

    本篇文章主要介绍了Java集合List与Array的相互转换,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java Object转换为json

    此下载包含 POJO 中使用 json格式传递到页面所需要的包 POJO 中Object/Array/List/Map转换为json格式的语法 PS:下载了可以保证json方面完全没有问题的使用。 thia's all!!!

    测试报告与总结\list,set,map,数组间的相互转换

    测试报告与总结\list,set,map,数组间的相互转换.rar测试报告与总结\list,set,map,数组间的相互转换.rar测试报告与总结\list,set,map,数组间的相互转换.rar测试报告与总结\list,set,map,数组间的相互转换.rar

    php array 转json及java 转换 json数据格式操作示例

    主要介绍了php array 转json及java 转换 json数据格式操作,结合实例形式分析了PHP针对array数组转json以及Java操作Map、List、对象与json格式转换的相关实现技巧,需要的朋友可以参考下

    StringtoList和StringtoMap和StringtoObject和StringtoArray

    Json格式的字符串转成List、Array、Map、Object、List等,就是各种字符串转其他格式的方法.有个封装好的转换方法和一个我自己做的示例

    详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法

    前提: list以及array是python中经常会用到的数据类型,当需要对list以及array进行文件的读写操作的时候,由于write函数参数需要的是...array中的数据类型必须是一样的。 2、list中保存的数据的存放地址,而不是数据,

    Java开发技术大全(500个源代码).

    listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的简单类 useArray1.java 用反射机制使用数组示例1 ...

    超轻量压缩传输js2java rpc框架(XtZPStream v1.0)

    比如Map、List,在javascript中对应为Object和Array 5、友好逐行数据输出并回调:java中可以将List逐行输出到浏览器中, 框架每接收到一条数据,能够自动回调给定的javascript方法, 从而实现数据流的逐行输出; 该...

    java面试宝典

    55、编码转换:怎样将GB2312 编码的字符串转换为ISO-8859-1 编码的字符串? 14 56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和...

    json的java资源and sample

    json的java类,支持json对象、list、array、map等转换为json字符串。 该压缩包中追加了几个转换为json字符串的示例。

    java 遍历Map及Map转化为二维数组的实例

    主要介绍了java 遍历Map及Map转化为二维数组的实例的相关资料,希望通过本文能帮助到大家,实现这样的功能,需要的朋友可以参考下

    Json-lib 是一个 Java 类库

    不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表 (hash table),有键列表(keyed list),或者关联数组 (associative array)。 在 Java 语言中,我们可以...

    Java常见面试题208道.docx

    161.集群中为什么要有主节点? 162.集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗? 163.说一下 zookeeper 的通知机制? 十七、MySql 164.数据库的三范式是什么? 165.一张自增表里面...

    springMVC poi解析ajax上传excel文件,返回json对象\list数组

    将每行数据放入List[]&gt; list = new Array List[]&gt;(),并根据excel数据类型将器转换为字符串、数字、Boolean、公式、空值类型防止出现错误,最后返回一个list. 2. ExcelUtil.java工具类 解析通过MutilpartFile导入的...

    Dbutils项目实例

    1 对于数据表的读操作 他可以把结果转换成List Array Set等java集合 便于程序员操作; 2 对于数据表的写操作 也变得很简单(只需写sql语句) 3 可以使用数据源 使用JNDI 数据库连接池等技术来优化性能 重用已经构建...

    Java 最常见的 208 道面试题:第二模块答案

    26. 如何实现数组和 List 之间的转换? 27. ArrayList 和 Vector 的区别是什么? 28. Array 和 ArrayList 有何区别? 29. 在 Queue 中 poll()和 remove()有什么区别? 30. 哪些集合类是线程安全的? 31. 迭代器 ...

    java范例开发大全源代码

     实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 ...

Global site tag (gtag.js) - Google Analytics