有些坑你知道吗(数组和集合互转)

299 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

1.数组转list

  • Arrays.asList
//数组转List
String[] str1 = new String[]{"a","b","c"};
List<String> strList = Arrays.asList(str1);
System.out.println(strList);

Integer[] int1 = new Integer[]{1,2,3};
List<Integer> intList = Arrays.asList(int1);
System.out.println(intList);

image.png

但现在对数据进行增删 就会出现什么问题呢?

image.png

image.png

抛UnsupportedOperationException异常,为什么会出现这个问题呢?

String[] str1 = new String[]{"a","b","c"};
List<String> strList = Arrays.asList(str1);
### System.out.println(strList); //输出了[a, b, c]

List<String> list = new ArrayList<>();
list.addAll(strList);
list.add("e");
System.out.println(list);  //输出了[a, b, c, e]
  • Arrays.asList(str1)这个方法调用的这个方法是在如下:而Arrays调用的是一个私有的静态的类,在这个类中并无add这些方法 所以才会抛出异常(看下面图)
//Arrays下面的asList方法
@SafeVarargs
public static <T> List<T> asList(T... a) {
    return new Arrays.ArrayList(a);
}

image.png image.png

  • 而我们new ArrayList 他的目录是java.util.ArrayList 而上面是java.util.Arrays.ArrayList,我们在来看这个Arraylist他又那些方法,他就包含增删的方法

image.png

因此 想要将数组转list 且不需要进行增删操作可以使用asList方法 若需要操作 则需要对转出的数组进行一些处理,就如我上面的将这个java.util.Arrays.ArrayList再转为java.util.ArrayList就可以进行操作拉

  • 当然还有一个操作就是使用java8的流stream
List<String> lsitStr = Arrays.stream(new String[]{"aa", "bb", "cc"}).collect(Collectors.toList());
lsitStr.add("dd");
System.out.println(lsitStr);
List<Integer> listInt = Arrays.stream(new Integer[]{1,2,3}).collect(Collectors.toList());
listInt.add(4);
System.out.println(listInt);

image.png

2.list转数组

这里也用了两种方法 第一种就是直接使用list.toArray 第二种方法也是使用它流

//List转数组
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Integer[] str1 = list.toArray(list.toArray(new Integer[list.size()]));
System.out.println(str1);

int[] str2 = list.stream().mapToInt(Integer::intValue).toArray();
System.out.println(str1);