大家好,又见面了,我是你们的朋友全栈君。
一、数组转换为集合
需要注意的是,转换只能转换为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()方法。
*/
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148482.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...