在Java中,集合(如List
、Set
等)和数组是可以互相转换的。下面是两种数据结构之间相互转换的一些常用方法。
Arrays.asList()
方法 Arrays.asList()
方法是将数组转换为集合最常用的方式之一。它返回一个由指定数组支持的固定大小的列表,这意味着你不能对返回的列表进行添加或删除操作,但可以修改现有元素。如果数组是对象类型,可以直接使用 Arrays.asList()
方法。如果是基本数据类型数组,则需要先转换为对应的包装类型数组。
import java.util.Arrays;
import java.util.List;
public class ArrayToListExample {
public static void main(String[] args) {
// 对象类型数组
String[] stringArray = {"Java", "Python", "C++"};
List stringList = Arrays.asList(stringArray);
System.out.println(stringList); // 输出: [Java, Python, C++]
// 基本数据类型数组
int[] intArray = {1, 2, 3, 4, 5};
// 需要先转换为包装类型数组
Integer[] integerArray = Arrays.stream(intArray).boxed().toArray(Integer[]::new);
List integerList = Arrays.asList(integerArray);
System.out.println(integerList); // 输出: [1, 2, 3, 4, 5]
}
}
Collections.addAll()
方法 Collections.addAll()
方法允许你将数组中的所有元素添加到一个已存在的集合中。这种方法特别适用于需要一个可变大小的集合的情况。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayToListExample {
public static void main(String[] args) {
// 对象类型数组
String[] stringArray = {"Java", "Python", "C++"};
List stringList = new ArrayList<>();
Collections.addAll(stringList, stringArray);
System.out.println(stringList); // 输出: [Java, Python, C++]
// 基本数据类型数组
int[] intArray = {1, 2, 3, 4, 5};
// 需要先转换为包装类型数组
Integer[] integerArray = Arrays.stream(intArray).boxed().toArray(Integer[]::new);
List integerList = new ArrayList<>();
Collections.addAll(integerList, integerArray);
System.out.println(integerList); // 输出: [1, 2, 3, 4, 5]
}
}
List.of()
方法 List.of()
方法可以用来创建一个不可变的列表。如果需要一个可变的列表,可以在 ArrayList
的构造函数中使用 List.of()
方法的结果。
import java.util.ArrayList;
import java.util.List;
public class ArrayToListExample {
public static void main(String[] args) {
// 对象类型数组
String[] stringArray = {"Java", "Python", "C++"};
List stringList = new ArrayList<>(List.of(stringArray));
System.out.println(stringList); // 输出: [Java, Python, C++]
// 基本数据类型数组
int[] intArray = {1, 2, 3, 4, 5};
// 需要先转换为包装类型数组
Integer[] integerArray = Arrays.stream(intArray).boxed().toArray(Integer[]::new);
List integerList = new ArrayList<>(List.of(integerArray));
System.out.println(integerList); // 输出: [1, 2, 3, 4, 5]
}
}
Arrays.stream()
方法 Arrays.stream()
方法可以将数组转换为流,然后使用 Collectors.toList()
方法将流转换为列表。这是Java 8引入的流式编程风格的一部分,适合于需要进行复杂操作的场景。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class ArrayToListExample {
public static void main(String[] args) {
// 对象类型数组
String[] stringArray = {"Java", "Python", "C++"};
List stringList = Arrays.stream(stringArray).collect(Collectors.toList());
System.out.println(stringList); // 输出: [Java, Python, C++]
// 基本数据类型数组
int[] intArray = {1, 2, 3, 4, 5};
List integerList = Arrays.stream(intArray).boxed().collect(Collectors.toList());
System.out.println(integerList); // 输出: [1, 2, 3, 4, 5]
}
}
1.Arrays.asList()
:适用于快速将数组转换为固定大小的列表,但不支持增删操作。
2.Collections.addAll()
:适用于将数组中的元素添加到一个已存在的集合中,支持增删操作。
3.List.of()
:适用于创建不可变列表,如果需要可变列表,可以在 ArrayList
构造函数中使用。
4.Arrays.stream()
:适用于Java 8及以上版本,支持流式操作,适合复杂的转换需求。
5.每种方法都有其适用的场景,根据实际需求选择最合适的方法。
List
接口的toArray()
方法toArray()
方法有两种形式:返回一个 Object[]
数组和返回一个指定类型的数组。返回 Object[]
数组
import java.util.Arrays;
import java.util.List;
public class CollectionToArrayExample {
public static void main(String[] args) {
List list = Arrays.asList("a", "b", "c");
Object[] array = list.toArray();
System.out.println(Arrays.toString(array)); // 输出: [a, b, c]
}
}
import java.util.Arrays;
import java.util.List;
public class CollectionToArrayExample {
public static void main(String[] args) {
List list = Arrays.asList("a", "b", "c");
String[] array = list.toArray(new String[0]);
System.out.println(Arrays.toString(array)); // 输出: [a, b, c]
}
}
从 Java 8 开始,可以使用 Stream API 将集合转换为数组。这种方法提供了更多的灵活性,特别是当你需要对集合进行一些中间操作(如过滤、映射等)时。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class CollectionToArrayExample {
public static void main(String[] args) {
List list = Arrays.asList("a", "b", "c");
String[] array = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(array)); // 输出: [a, b, c]
}
}
Set
转换为数组 2.1 使用set
接口的toArray()
方法,但是集合的无序性需要注意。
Object[]
数组import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
public class CollectionToArrayExample {
public static void main(String[] args) {
Set set = new HashSet<>(Arrays.asList("a", "b", "c"));
Object[] array = set.toArray();
System.out.println(Arrays.toString(array)); // 输出: [a, b, c](顺序可能不同)
}
}
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
public class CollectionToArrayExample {
public static void main(String[] args) {
Set set = new HashSet<>(Arrays.asList("a", "b", "c"));
String[] array = set.toArray(new String[0]);
System.out.println(Arrays.toString(array)); // 输出: [a, b, c](顺序可能不同)
}
}
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
import java.util.stream.Collectors;
public class CollectionToArrayExample {
public static void main(String[] args) {
Set set = new HashSet<>(Arrays.asList("a", "b", "c"));
String[] array = set.stream().toArray(String[]::new);
System.out.println(Arrays.toString(array)); // 输出: [a, b, c](顺序可能不同)
}
}
3.1 指定类型数组的大小:在调用 toArray(new String[0])
时,传递一个空数组(例如 new String[0]
)是一个常见的做法。这可以避免在 Java 10 之前的版本中可能出现的性能问题。从 Java 10 开始,toArray()
方法内部已经优化了这一过程,因此即使传入 new String[0]
也不会影响性能。
3.2 类型安全:确保集合的泛型类型与数组的类型一致,以避免编译错误或运行时异常。
3.3 集合的特性:对于 Set
,转换后的数组顺序可能与集合中的顺序不同,因为 Set
是无序的。