Java基础——对象数组及数组与集合转换的使用总结

对象数组及数组与集合转换的使用体会

使用情景:
在项目中,我从数据库查出的的数据是一个List的对象集合。
我需要将他转成一个对象数组。在对其进行处理需要。
错误方式:

List<StoreInfo> list = new ArrayList();
StoreInfo[] array = (StoreInfo[])list.toArray();

这种写法,在编译时,没有任何问题。但是在运行时,会报ClassCastException。
这是因为java中允许向上和向下转型,但是能否转型成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。数组对象的类型是Java.lang.Object。把java.lang.Object类型转成StoreInfo类型显然不可能,由于这是一个向下转型,而虚拟机直保存了这是一个Object的数组。不能保证数组中的元素是StoreIno的,所以转型不成功。
数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。
正确方法1:

//要转换的list集合,这块需要赋值,我就省了
List<StoreInfo> list = new ArrayList();
//使用toArray(T[] a)方法
StoreInfo[] array = list.toArray(new StoreInfo[list.size()]);

方法二:
通过循环遍历,将集合中数据写入到数组中。

数组转List集合
方法一:
通过循环遍历,将集合中数据写入到集合中。
方法二 使用asList():

rrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arrays));

方法三、使用j简易的asList()
这个方法有缺点:
同方法二一样使用了asList()方法。这不是最好的,因为asList()返回的列表的大小是固定的。事实上,返回的列表不是java.util.ArrayList,而是定义在java.util.Arrays中一个私有静态类。我们知道ArrayList的实现本质上是一个数组,而asList()返回的列表是由原始数组支持的固定大小的列表。这种情况下,如果添加或删除列表中的元素,程序会抛出异UnsupportedOperationException。

List<String> list = Arrays.asList(arrays);

推荐使用第二种。
方法四、使用Collections.addAll()

List<String> list2 = new ArrayList<String>(arrays.length);
Collections.addAll(list2, arrays);

你可能感兴趣的:(java)