java list 和数组互相转换的一些方法
在Java中,List 和 数组(Array) 之间的转换是一个常见的操作。由于它们是不同的数据结构,Java提供了一些方法来在它们之间进行转换。我们会从List到数组和数组到List两种情况分别讨论。
1. List 转 数组
假设你有一个 `List` 类型的对象,想要将其转换为一个数组。你可以使用 List`类的 toArray()方法。
(a) List 转 数组(Object类型)
最常见的转换是将一个 `List` 转换为一个普通的对象数组 `Object[]`,方法如下:
import java.util.List;
import java.util.ArrayList;
public class ListToArrayExample {
public static void main(String[] args) {
// 创建一个List
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
// 将List转换为数组(Object类型)
Object[] array = list.toArray();
// 输出结果
for (Object obj : array) {
System.out.println(obj);
}
}
}
在这个例子中,`list.toArray()` 返回的是一个 `Object[]` 类型的数组。此时数组的元素类型是 `Object`,如果需要更具体的类型,可以强制转换。
(b) List 转 数组(指定类型)
如果你知道 List 中存储的是某个具体类型的元素(比如 `String`),你可以使用 `toArray(T[] a)` 方法来指定数组的类型,从而避免转换时的强制类型转换:
import java.util.List;
import java.util.ArrayList;
public class ListToArrayExample {
public static void main(String[] args) {
// 创建一个List
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
// 将List转换为数组(指定类型)
String[] array = list.toArray(new String[0]);
// 输出结果
for (String str : array) {
System.out.println(str);
}
}
}
在这个例子中,list.toArray(new String[0]) 生成了一个类型为 String[]的数组。new String[0]表示传入的数组大小,实际上该数组的大小会根据 List 的元素数自动调整。
(c) 对于更复杂的 List 类型
如果你的 List 中包含自定义类型(比如一个 `Person` 类),转换的方法和上述类似:
import java.util.List;
import java.util.ArrayList;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + ", " + age;
}
}
public class ListToArrayExample {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("Alice", 30));
list.add(new Person("Bob", 25));
// 将List转换为Person类型的数组
Person[] array = list.toArray(new Person[0]);
// 输出结果
for (Person person : array) {
System.out.println(person);
}
}
}
2. 数组 转 List
如果你有一个数组,想要将其转换为一个 `List`,你可以通过 `Arrays.asList()` 方法来实现。
(a) 数组 转 List(基本数据类型)
对于一个简单的数组(如 `int[]` 或 `String[]`),你可以这样做:
import java.util.Arrays;
import java.util.List;
public class ArrayToListExample {
public static void main(String[] args) {
// 创建一个数组
String[] array = {"A", "B", "C"};
// 将数组转换为List
List<String> list = Arrays.asList(array);
// 输出结果
for (String str : list) {
System.out.println(str);
}
}
}
(b) 数组 转 List(原始类型数组)
注意,`Arrays.asList()` 方法对于原始类型数组(如 `int[]`, `double[]` 等)并不会返回一个 `List<Integer>` 或 `List<Double>` 等类型的 `List`,而是会返回一个 `List<int[]>` 类型的 List。要避免这个问题,你需要将原始类型数组包装成相应的包装类数组,然后再使用 `Arrays.asList()`。
import java.util.Arrays;
import java.util.List;
public class ArrayToListExample {
public static void main(String[] args) {
// 创建一个int数组
int[] array = {1, 2, 3};
// 将int数组包装为Integer数组
Integer[] boxedArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
// 将Integer数组转换为List
List<Integer> list = Arrays.asList(boxedArray);
// 输出结果
for (Integer num : list) {
System.out.println(num);
}
}
}
(c) 数组 转 List(自定义对象数组)
如果你有一个自定义类型的数组,使用 `Arrays.asList()` 同样适用:
import java.util.Arrays;
import java.util.List;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + ", " + age;
}
}
public class ArrayToListExample {
public static void main(String[] args) {
// 创建一个Person类型的数组
Person[] array = {new Person("Alice", 30), new Person("Bob", 25)};
// 将数组转换为List
List<Person> list = Arrays.asList(array);
// 输出结果
for (Person person : list) {
System.out.println(person);
}
}
}
3. 注意事项
(a) `Arrays.asList()` 的限制
- 使用 `Arrays.asList()` 创建的 List 是一个 **固定大小 的 List,这意味着你不能向 List 中添加或删除元素。如果试图进行这样的操作,会抛出 `UnsupportedOperationException`。
例如:
List<String> list = Arrays.asList("A", "B", "C");
list.add("D"); // 运行时抛出 UnsupportedOperationException
如果你需要一个可修改的 List,应该将其包装在一个新的 `ArrayList` 中:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
list.add("D"); // 现在可以修改
(b) 通过 `toArray()` 方法进行类型转换
如果 List 的类型不是你想要的类型(例如 List 存储了类型为 `Object` 的元素),可以在进行转换时强制类型转换。例如:
Object[] objArray = list.toArray();
String[] strArray = (String[]) objArray; // 强制转换为 String[]
(c) 对于原始类型数组
Java 没有直接将原始类型数组(如 `int[]`, `double[]`)转换为 List 的方法。你可以先将原始类型数组转换为包装类数组,然后再用 `Arrays.asList()` 方法转换成 List。例如:
int[] array = {1, 2, 3};
Integer[] boxedArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
List<Integer> list = Arrays.asList(boxedArray);
总结
- List 转 数组:使用 `toArray()` 方法。对于类型化的 List,推荐使用 `toArray(T[] a)` 方法,这样可以避免不必要的类型转换。
- 数组 转 List:使用 `Arrays.asList()` 方法,但要注意原始类型数组的特殊情况(它们会被转换为一个包含数组的 List),并且返回的 List 是固定大小的,不能进行添加或删除元素的操作。
希望这个详细的解答能帮助你在 Java 中灵活地进行 List 和数组之间的转换!