今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本。如下:
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);
分享到:
相关推荐
在实际开发过程中,我们经常会遇到需要将列表(List)中的元素转换为数组(Array)的情况。例如,在处理HTTP请求响应、数据库查询结果或者文件I/O操作时,将数据从一种形式转换为另一种形式是非常常见的需求。`List...
在实际开发过程中,我们经常需要将数组转换为列表或将列表转换为数组,以便更好地利用这两种数据结构的特点。接下来,我们将详细介绍如何在Java语言中实现数组与列表之间的相互转换。 ### 数组转列表 #### Java...
4. **`toArray()`方法**:`List`接口提供了`toArray()`方法,该方法可以将列表转换为数组。如果传递一个空数组,`toArray()`方法会创建一个新的数组;如果传递一个已存在的数组,它会尝试将列表元素填充到这个数组中...
Java中数组与集合的相互转换实现解析非常重要,_arrays.asList() 方法可以将数组转换为集合,而 toArray() 方法可以将集合转换为数组。但是需要注意在使用这些方法时的注意事项,以免出现异常。
然后,使用`toArray()`方法将列表转换为数组。这里,我们传入了已经创建的`orderIds`数组作为参数,这意味着数组会被填充`ids`列表中的元素。最后,`orderIds`变量被赋值为转换后的数组。 在JDK 1.8之前,没有流API...
这是本人写的一个基于JSON的完整项目,实现了Java对象、数组、集合转换为Json(Json转化为Java对象、数组、集合)。这是一个完整的项目,下载解压后直接导入MyEclipse/Eclipse中,运行com.demo.JSONDemo类即可看到效果...
在Java中,我们可以使用`List`的`toArray()`方法将集合转换为数组。这个方法接受一个可选的参数,即目标类型的数组。如果提供了空数组,`toArray()`方法会根据集合的大小创建一个新的数组,并填充集合中的元素。...
4. `List.toArray()`/`List.toArray(T[])`: List转换为数组。 5. `Map.values()`: Map转换为Collection。 6. `new ArrayList(set)`/`new HashSet(list)`: Set与List之间的转换。 理解这些基本转换方法,将有助于你...
在实际开发中,我们经常需要将数组转换为List,或者将List转换为数组。下面我们将详细介绍Java编程实现数组转成list及list转数组的方法。 一、数组转换为List 在Java中,数组可以通过多种方式转换为List。下面我们...
2. List转换为数组 当需要将List转换回数组时,ArrayList提供两种方法:`toArray()`和`toArray(T[] a)`。 - `toArray()`方法: 此方法返回一个新的数组,包含List中的所有元素。数组的类型是Object[],因此可能...
首先,让我们看看如何将List转换为数组。Java的List接口提供了一个`toArray()`方法,但需要注意的是,这个方法有重载的形式。默认的`toArray()`方法返回一个`Object[]`类型的数组,这意味着数组中的元素都是Object...
- 容量问题:在从List转换为数组时,要确保数组的容量足够大,否则会导致ArrayIndexOutOfBoundsException。 - 遍历效率:遍历数组通常比遍历List更快,因为数组的索引访问时间复杂度是O(1),而List的get()方法可能为...
ArrayList继承自Java的List接口,提供了toArray()方法,可以直接将ArrayList转换为数组。在示例代码中,我们可以看到两种转换方式: 1. 基于循环的转换: ```java String[] array = new String[size]; for (int i =...
Java中将数组转换为ArrayList的方法 Java是一种面向对象的编程语言,广泛应用于Android应用开发、Web开发、桌面应用开发等领域。其中,数组和ArrayList是Java中两个非常重要的数据结构。数组是一种基本的数据结构,...
例如,当你从数据库查询结果获取ArrayList,然后需要将其传递给一个只接受数组的方法时,就需要将ArrayList转换为数组。反之,如果你有一个数组,但希望利用ArrayList的便利性(如动态增长)进行操作,那么数组转换...
当我们有一个List,比如ArrayList,想要将其转换为数组时,可以调用ArrayList的`toArray()`方法。这个方法会创建一个新的数组,其类型与传入的数组类型相同,或者如果未传入数组,会根据List的元素类型自动创建。...
本文主要讨论了三种将list转换为数组以及数组转换为List的方法,并分析了它们的特点和适用场景。 一、最常见方式:Arrays.asList() 这种方法简单易用,但并不总是最佳选择。通过`Arrays.asList(strArray)`可以直接...
在Java编程中,列表(List)、集合(Set)和数组是三种常见的数据结构,它们各自有各自的特性和应用场景。在实际开发中,我们经常需要在这三者之间进行转化,以满足不同场景的需求。以下将详细阐述如何在Java中实现这些...
本教程将深入讲解如何在Java中将集合转换为数组,这是一个常见的需求,特别是在处理数据时需要与原生Java API或第三方库进行交互的情况下。通过学习本教程,你将能够熟练掌握这一关键技能。 首先,我们来看一下Java...
### Java中数组列表ArrayList的使用详解 #### 一、ArrayList简介 `ArrayList`是Java集合框架中的一个重要组成部分,属于`List`接口的一种实现。它提供了一种动态调整大小的数组,能够有效地解决传统数组大小固定...