Python学习日记---控制语句(二)
2015-05-28 18:05
495 查看
ArrayList.toArray()的用法
当使用ArrayList时,有时想获得一个实际的数组,这个数组包含了列表的内容。 可以通过调用方法toArray()来实现。
示例:
package bo;
import java.util.ArrayList;
public class ToArrayTest {
/** * @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(new Integer(1));
al.add(new Integer(2));
al.add(new Integer(3));
al.add(new Integer(4));
al.add(new Integer(5));
System.out.println("al中元素:" + al);
//获得数组
Object ia[] = al.toArray();
//遍历数组
for(int i=0; i<ia.length; i++){
System.out.println(ia[i] + " ");
}
}
}
运行结果: al中元素:[1, 2, 3, 4, 5] 1 2 3 4 5
List提供了toArray()的方法,但是要使用不好,就会有ClassCastException异常究竟这个是如何产生的,且看代码:
首先咱们来看看下面的代码:
ArrayList<String []> arr = new ArrayList<String []>();
arr.add(new String[]{"a","b"});
arr.add(new String[]{"c","d"});
String [][] str_a = (String[][]) arr.toArray();
//这几行代码会有ClassCaseException异常
执行上面这几行代码 会有ClassCaseException异常
咱们再来看下面几行代码:
ArrayList<String []> arr = new ArrayList<String []>();
arr.add(new String[]{"a","b"});
arr.add(new String[]{"c","d"});
String [][] str_a = (String[][])
arr.toArray(new String[0][0]);
执行上面的代码就完全OK了 会抛java.lang.ClassCastException。
下面是ArrayList的两个toArray()方法的源代码:
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[])
Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null; return a;
}
可以看出,不带参数的toArray()方法,是构造的一个Object数组,然后进行数据copy,此时进行转型就会产生ClassCastException
而带参数的toArray(T[] a) 方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object 数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常
正确的方式
1. String[][] str_a = (String [][]) arr.toArray(new String[0][0]); 2. String[][] a = new String[<size>][size];
String [][] str_a = (String [][]) arr.toArray(a);
这里要注意的是:你要是传入的参数为9个大小,而list里面有5个 object ,那么其他的四个会是 null , 使用的时候要注意。
当使用ArrayList时,有时想获得一个实际的数组,这个数组包含了列表的内容。 可以通过调用方法toArray()来实现。
示例:
package bo;
import java.util.ArrayList;
public class ToArrayTest {
/** * @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(new Integer(1));
al.add(new Integer(2));
al.add(new Integer(3));
al.add(new Integer(4));
al.add(new Integer(5));
System.out.println("al中元素:" + al);
//获得数组
Object ia[] = al.toArray();
//遍历数组
for(int i=0; i<ia.length; i++){
System.out.println(ia[i] + " ");
}
}
}
运行结果: al中元素:[1, 2, 3, 4, 5] 1 2 3 4 5
List提供了toArray()的方法,但是要使用不好,就会有ClassCastException异常究竟这个是如何产生的,且看代码:
首先咱们来看看下面的代码:
ArrayList<String []> arr = new ArrayList<String []>();
arr.add(new String[]{"a","b"});
arr.add(new String[]{"c","d"});
String [][] str_a = (String[][]) arr.toArray();
//这几行代码会有ClassCaseException异常
执行上面这几行代码 会有ClassCaseException异常
咱们再来看下面几行代码:
ArrayList<String []> arr = new ArrayList<String []>();
arr.add(new String[]{"a","b"});
arr.add(new String[]{"c","d"});
String [][] str_a = (String[][])
arr.toArray(new String[0][0]);
执行上面的代码就完全OK了 会抛java.lang.ClassCastException。
下面是ArrayList的两个toArray()方法的源代码:
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[])
Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null; return a;
}
可以看出,不带参数的toArray()方法,是构造的一个Object数组,然后进行数据copy,此时进行转型就会产生ClassCastException
而带参数的toArray(T[] a) 方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object 数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常
正确的方式
1. String[][] str_a = (String [][]) arr.toArray(new String[0][0]); 2. String[][] a = new String[<size>][size];
String [][] str_a = (String [][]) arr.toArray(a);
这里要注意的是:你要是传入的参数为9个大小,而list里面有5个 object ,那么其他的四个会是 null , 使用的时候要注意。
相关文章推荐
- Python学习日记---控制语句(一)
- Python基础,基本类型(整型,浮点数等)数据结构(List,dic(Map),Set,Tuple),控制语句(if,for,while,continue or break):来自学习资料
- Python学习笔记(3)——流程控制的语句
- python学习 流程控制语句详解
- Python学习(七) 流程控制if语句
- Python学习笔记——控制语句
- Python 学习从入门到放弃(三)--变量与函数基础、基础控制语句
- 轻松学习python part2-控制语句
- Python学习笔记——Python开发中的控制语句
- python学习 流程控制语句
- Python学习笔记(二):条件控制语句与循环语句及常用函数的用法
- python学习小结1:for循环控制语句
- python学习小结1:for循环控制语句
- python学习小结2:if和while控制语句
- python学习之路-第二天-常见的注意事项(代码风格、运算符、优先级、控制语句)
- Python基础语法学习--条件控制与循环语句
- python基础学习总结——方法、控制语句
- Python学习之路18——控制语句,迭代器, 列表解析
- 学习python的第四十天-第三章 python的控制语句
- JAVA基础第二天学习日记_标识符、常量与变量、运算符、条件控制语句