Java之数组转集合&集合转数组

2020-11-03   221 次阅读


一、数组转换为集合

需要注意的是,转换只能转换为List集合。那么为什么不能转换为Set集合呢?

原因是:Set不能存放重复元素,所以若转换为Set集合可能出现丢失元素的情况。。。

数组转换为集合使用的是数组的工具类Arrays的静态方法asList。查看API文档可知该方法返回由指定数组支持的固定大小的列表。
在这里插入图片描述
eg:

import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
	List<String> list = Arrays.asList(strArr);
	System.out.println(list);//[刘雯, 胡歌, 杜鹃, 邓伦]
}
}

思考一下:如果我想往这个由数组转换过来的集合里面添加元素,我能不能直接调用add方法呢?先试试
eg:

import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
	List<String> list = Arrays.asList(strArr);
	System.out.println(list);
	 list.add(1,"杨紫");
	 System.out.println(list);
	 
}
}

结果运行异常:
在这里插入图片描述
那么为什么会出现这样的结果呢?

原因:这个新集合是由数组转换过来的,那么该集合就表示原来的数组,所以对集合的操作就是对数组的操作。那么添加元素会导致原数组扩容,那么就不能表示原来的数组了。所以不允许向该集合添加新元素了。

下面就来测试一下是否改变集合中的元素,原数组元素也随之改变。

import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};//原数组元素
		List<String> list = Arrays.asList(strArr);
		System.out.println(list); 
		list.set(3, "杨紫");//将集合中下标为3的元素替换为“杨紫”
		System.out.println(list);//修改后的集合打印结果:[刘雯, 胡歌, 杜鹃, 杨紫]
		//下面打印数组中的元素,检测数组元素是否改变
		for (String Arr : strArr) {
			System.out.println(Arr);
			/*
				打印结果:刘雯
                         胡歌
                         杜鹃
                         杨紫
			*/
	//结果说明:对这个由数组转化过来的集合进行操作会导致原数组的改变。	
		}
	}
}

怎么解决想往集合添加元素这个问题呢?

方法一:我们通过实验知道数组转化为List是不能增删数据的,如果需要增删,可以利用空集合调用addAll方法将转化后的集合全部添加新集合就可以进行操作了。

示例代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
	List<String> list = Arrays.asList(strArr);
	System.out.println(list); 
	/*list.add(1,"杨紫");这样直接调用add方法会出现运行异常。
	 *可以利用空集合调用addAll方法将转化后的集合全部添加新集合就可以进行操作了。
	 */
	 List<String> newList = new ArrayList<>();
	 /*
	  * tips:为什么右边这个尖括号中不写String呢?
	  * 原因:从JDK1.7开始,右侧的尖括号内部可以不写内容,但是<>还是要写的。
	  */
	 newList.addAll(list);
	 newList.add(1,"杨紫");
	 System.out.println(newList);
}
}



方法二(比较推荐的写法):

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
			String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
			List<String> list = Arrays.asList(strArr);
			System.out.println(list); 
//		    List<String> newList = new ArrayList<>();
//			newList.addAll(list);
//		    newList.add(1,"杨紫");
//		    System.out.println(newList);
			 List<String> newList = new ArrayList<>(list);
			 /*
			  *所有的集合都提供了一个带有Collection类型参数的构造方法。
			  *该构造方法称为:复制构造器
			  *作用:在创建当前集合的同时,集合中包含给定集合中的所有元素。
			  */
			 newList.add(1,"杨紫");
			 System.out.println(newList);
		 
		}
	}

二、集合转换为数组

在这里插入图片描述

查看API可知有这两个方法可以帮助我们很容易地将集合转换为数组。其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组元素类型与集合元素类型一致。返回值是转化后的数组,该数组会保留集合中的所有元素。
eg:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class testListToArray {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
    	list.add("刘雯");
    	list.add("杨紫");
    	list.add("胡歌");
    	String [] strArr =  list.toArray( new String[]{});
    	System.out.println(Arrays.toString(strArr));//[刘雯, 杨紫, 胡歌]
    	/*
    	 * 这里解释一下为什么要调用Arrays.toString()方法,因为这个集合转换后的数组类型为
    	 * String,是引用类型的。在这里我们并没有重写toString方法,如果直接打印strArr,
    	 * 你将会看到的是@散列码。所以要想看到数组中的内容有两种解决方案,一是你在代码中重写
    	 * toString方法,二是你直接使用Arrays.toString()方法。
    	 */
	}
}

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

毕生所求无它,爱与自由而已