@

1. Array 和 List 互转

Array 转 List:如果用 Arrays.asList 方法,之后修改 Array,会直接改变 List。而且这种方法不能增删(没有 add remove 方法),只能查改(set get contains)。

List 转 Array:如果用 List.toArray 方法,之后修改 List,不会改变 Array。注意参数是提供一个类型即可,如 new String[0]。
方法名是 Arrays.asList() 和 List.toArray()。

List<String> listA = Arrays.asList(stringA);
String[] stringB = List.toArray(new String[0]);

// 转整数 array:
int[] intA = listA.stream().mapToInt(Integer::intValue).toArray();
// 转整数 list
List<Integer> listB = Arrays.stream(intB).boxed().collect(Collectors.toList());

更好的 Array 转 List:将 Arrays.asList() 的返回值由 java.util.Arrays.ArrayList 转换为 java.util.ArrayList,也就是用构造器方法创建返回对象类型。

List<String> listA = new ArrayList<String>(Arrays.asList(stringA));

最高效的 Array 转 List:首先构造对应数组大小的 List 对象,然后用 Collections.addAll() 方法将 Array 的内容添加到 List 对象中。这种方法运算速度最快,适合处理大量数据。

List<String> listA = new ArrayList<>(stringA.length);
Collections.addAll(listA, stringA);

Stream 方法的 Array 转 List:针对数类型和 String 类型,Stream 方法也是不一样的。
对于数类型 Array,首先用 Arrays.stream() 方法将 Array 的内容转换为流类型,随后用 boxed() 方法进行封装,最后再用 collect() 方法进行转换,参数是 Collectors.toList() 方法。
注意这里是 Arrays.stream() 方法,随后还需要用一下 boxed() 方法。比字符串类型麻烦。

List<Integer> listA = Arrays.stream(intA).boxed().collect(Collectors.toList());

对于 String Array,首先用 Stream.of() 方法将 Array 的内容转换为流类型,随后调用 collect() 方法进行转换,参数是 Collectors.toList() 方法。
注意这里是 Collectors,方法名是 toList(),类似的有 toSet(),但是没有 toQueue()。也可以不用那么麻烦,直接 toCollection(),里面可以写 需要的类型::new

List<String> listA = Stream.of(stringA).collect(Collectors.toList());
List<String> listB = Stream.of(stringA).collect(Collectors.toCollection(ArrayList::new));

2. List 和 Set 互转

由于 List 和 Set 都实现了 Collection 接口,因此可以直接将对方作为构造函数的参数进行互转,也可以用 Collections.AddAll()。

List<String> listA = new ArrayList<>(setA);
Set<String> setA = new HashSet<>(listA);
List<String> listA = new ArrayList<>(setA.size());
Collections.addAll(listA, setA);

3. Array 和 Set 互转

参考 Array 和 List 互转即可。