[zz]
http://hi.baidu.com/fandywang_jlu/blog/item/9daf25175be717094a90a7a6.html
今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本。如下:
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编程中,经常需要处理数据的序列化和反序列化,其中ArrayList<Map<Object>>与JSON之间的转换是一个常见的需求。JSON是一种轻量级的数据交换格式,广泛用于互联网应用中的数据传输,因为它易于阅读和编写,同时...
10. List 和 Array 之间如何互相转换? List 可以使用 toArray() 方法转换为 Array,Array 可以使用 Arrays.asList() 方法转换为 List,由于 Arrays.asList() 方法返回的是固定的 List,可以使用 new ArrayList...
10. **List和Array之间如何互相转换?** - Array转List:可以使用`Arrays.asList(array)`将数组转换为List,但这个List是固定大小的,不支持add操作。 - List转Array:通过List的`toArray()`方法可以将其转换为数...
10.List和Array之间如何互相转换? 可以使用toArray()方法将List转换为Array,也可以使用Arrays.asList()方法将Array转换为List。需要注意的是,Arrays.asList()方法返回的List是固定的,不可以添加或删除元素。...
这里我们将详细探讨如何将集合(以ArrayList为例)与数组进行互相转换,并理解其中的关键点。 首先,集合(List)是Java集合框架的一部分,提供了动态增长的能力,可以方便地添加、删除元素。而数组则是固定大小的...
在Java中,我们经常需要将JSON字符串与Java对象进行互相转换,以便处理和存储数据。这篇博客将探讨如何在Java中实现这一过程。 一、JSON简介 JSON是一种基于文本的格式,它使用键值对来表示数据,结构清晰,易于...
### Java全集知识点总结 #### 一、Java的特点与运行原理 **1.1 Java特点** ...以上内容涵盖了Java的基础知识到高级特性,从基本语法到面向对象编程,再到多线程和I/O操作等,全面地介绍了Java语言的核心知识点。
##### List和Array数组之间怎么互相转换 - 将数组转换为List:可以通过`Arrays.asList()`方法将数组转换为`List`。 - 将List转换为数组:可以使用`List.toArray()`方法将`List`转换为数组。 #### 九、网络编程 ##...
- List和Array数组之间怎么互相转换:List可以通过ArrayList等实现类转换为数组,数组也可以转换为List。 - 集合框架中容器简单用法:集合框架提供了多种容器类,如List、Set、Map等,用于存储和操作对象集合。 九...
`json-lib`是一个Java语言实现的JSON处理器,它提供了多种Java集合和JSON之间的转换方式,包括List、Map、Array等。 本主题主要关注`json-lib`在Java中的应用及其依赖的类库。`json-lib`并不是一个独立的库,它需要...
在Java编程中,列表(List)、集合(Set)和数组是三种常见的数据结构,它们各自有各自的特性和应用场景。在实际开发中,我们经常需要在这三者之间进行转化,以满足不同场景的需求。以下将详细阐述如何在Java中实现这些...
如何实现数组和`List`之间的转换?** - 使用`Arrays.asList()`将数组转换为`List`。 - 使用`List.toArray()`将`List`转换为数组。 **27. `ArrayList`和`Vector`的区别是什么?** - **线程安全性**: `Vector`是...
ArrayList可以与其他集合类型互相转换,如转化为数组`toArray()`,或从数组创建ArrayList`Arrays.asList(T... a)`: ```java Object[] array = list.toArray(); ArrayList<String> fromArray = new ArrayList...
- `List`和`Set`直接或间接继承自`Collection`。 - `Map`与`Collection`并列,它存储键值对。 #### 54. 面向对象的特征有哪些方面 - 封装:隐藏对象的属性和实现细节,仅对外提供公共接口。 - 继承:子类继承父类...
ArrayList可以与其他集合类型互相转换,如转换为数组: ```java String[] array = stringList.toArray(new String[0]); ``` 十、ArrayList与数组的区别 虽然ArrayList基于数组,但它提供了更多的功能,如动态调整...
**List和Array数组之间怎么互相转换** - 使用`Arrays.asList()`可以将数组转换为`List`。 - 使用`List.toArray()`可以将`List`转换为数组。 **集合框架中容器简单用法** - `Collection`接口是集合框架的基础,`...
在Java编程中,Gson库是一个非常常用的工具,它由Google提供,用于在Java对象和JSON数据之间进行互相转换。本文将深入探讨如何使用Gson处理泛型,并将其转换为JSON字符串。 首先,理解泛型在Java中的作用是至关重要...
- 支持JSON和Java Bean、Map、List之间的互相转换。 - 提供了强大的过滤器功能,可以在转换前后对数据进行处理。 - 支持自定义的序列化和反序列化策略,满足个性化需求。 - 支持日期、BigDecimal等复杂类型的...
- 在Java中,多态主要通过继承和接口实现。 **2. 关于继承与实现的问题** - **继承**:一个类可以从另一个类继承属性和行为。 - **实现**:一个类可以实现一个接口,从而获得接口中声明的方法。 **3. 抽象关键字...
- Java默认采用Unicode编码,但开发者仍需注意不同环境下的编码转换问题,确保正确处理非英文字符。 **Eclipse简便设置** - Eclipse提供了丰富的设置选项来简化开发流程,例如项目构建路径、自动编译、代码格式化等...