1、集合与数组之间的转换
集合中如List和Set,都和数组有着高度的相似性,既然如此,实际上集合转数组也是情理之中的事情。
1.1 集合转数组 toArray
看几个常用的集合类,如上图继承关系图,可以看到他们都集成了一个抽象类AbstractCollection,这个类中就实现了Collection接口的两个方法:
- toArray ( )
- toArray ( T[ ] a )
前者的返回值是一个Object的数组,Object[],这个数组是不可以进行强制数据类型转换的,如下:
List pod = new ArrayList();
for(int i = 0; i < 5; i++){
pod.add(i);
}
Integer[] t=(Integer[])pod.toArray();
7
1
List<Integer> pod = new ArrayList<Integer>();
2
3
for(int i = 0; i < 5; i++){
4
pod.add(i);
5
}
6
7
Integer[] t=(Integer[])pod.toArray();
结果就是报错:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
所以像如上情况,就应该使用第二种方法:
- toArray(T[ ] a)
- 如果数组a的长度足够放入整个集合的数据,那么所有数据会放入到数组a当中
- 如果数组a的长度不够,那么会把所有数据放入到一个新的数组中返回
List pod=new ArrayList();
for(int i=0;i<5;i++){
pod.add(i);
}
//第一种
Integer[] t=new Integer[pod.size()];
pod.toArray(t);
//第二种
Integer[] t3=new Integer[1];
Integer[] t2=pod.toArray(t3);
13
1
List<Integer> pod=new ArrayList<Integer>();
2
3
for(int i=0;i<5;i++){
4
pod.add(i);
5
}
6
7
//第一种
8
Integer[] t=new Integer[pod.size()];
9
pod.toArray(t);
10
11
//第二种
12
Integer[] t3=new Integer[1];
13
Integer[] t2=pod.toArray(t3);
即以上的 t 和 t2 都是我们期望得到的数组。
1.2 数组转集合 asList
数组转集合,就要利用到数组的工具类Arrays了,该类中定义了数组转为List的一个方法:
- asList(T... a)
- 返回一个装载了数组a中所有数据的固定长度的List
public static void main(String[] args) {
String[] pod = new String[]{"haha", "xixi", "heihei"};
List list = Arrays.asList(pod);
for (String bean : list) {
System.out.println(bean);
}
}
8
1
public static void main(String[] args) {
2
String[] pod = new String[]{"haha", "xixi", "heihei"};
3
List<String> list = Arrays.asList(pod);
4
5
for (String bean : list) {
6
System.out.println(bean);
7
}
8
}
如果希望转换为长度可变的List,则利用ArrayList构造方法:
public static void main(String[] args) {
String[] pod = new String[]{"haha", "xixi", "heihei"};
List list = Arrays.asList(pod);
List newList = new ArrayList(list);
for (String bean : newList) {
System.out.println(bean);
}
}
9
1
public static void main(String[] args) {
2
String[] pod = new String[]{"haha", "xixi", "heihei"};
3
List<String> list = Arrays.asList(pod);
4
List<String> newList = new ArrayList<String>(list);
5
6
for (String bean : newList) {
7
System.out.println(bean);
8
}
9
}
2、集合与集合之间的转换 addAll
刚才我们提到了集合类的继承关系图,在抽象类AbstractCollection,还实现了Collection接口中的一个方法,叫addAll,具体实现类对该方法多少进行了重写:
这里返回的布尔值是指,如果List集合对象由于调用addAll方法而发生更改,则返回true
如下示例,TreeSet转换为List类型:
public static void main(String[] args) {
TreeSet pod = new TreeSet();
pod.add(1);
pod.add(3);
pod.add(2);
List list = new ArrayList();
list.addAll(pod);
for (Integer bean : list) {
System.out.println(bean);
}
}
x
1
public static void main(String[] args) {
2
TreeSet<Integer> pod = new TreeSet<Integer>();
3
pod.add(1);
4
pod.add(3);
5
pod.add(2);
6
7
List<Integer> list = new ArrayList<Integer>();
8
list.addAll(pod);
9
10
for (Integer bean : list) {
11
System.out.println(bean);
12
}
13
}
3、参考链接
- 1.2.2 List.addAll方法——添加所有元素到列表中
- 数组和集合的转换