JAVA数组与集合相互转换

一   简介   

           在Java中,集合(如ListSet等)和数组是可以互相转换的。下面是两种数据结构之间相互转换的一些常用方法。

二   数组转集合

       1. 使用 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]
    }
}

       2. 使用 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]
    }
}

       3. 使用 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]
    }
}

       4. 使用 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]
    }
}

       5. 数组转集合的注意事项

      1.Arrays.asList():适用于快速将数组转换为固定大小的列表,但不支持增删操作。

      2.Collections.addAll():适用于将数组中的元素添加到一个已存在的集合中,支持增删操作。

      3.List.of():适用于创建不可变列表,如果需要可变列表,可以在 ArrayList 构造函数中使用。

      4.Arrays.stream():适用于Java 8及以上版本,支持流式操作,适合复杂的转换需求。

                5.每种方法都有其适用的场景,根据实际需求选择最合适的方法。

三   集合转数组

       1. 使用List接口的toArray()方法

             1.1  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]
    }
}

               1.2. 使用 Stream API (Java 8 及以上版本)

                             从 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]
    }
}

       2. 使用 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](顺序可能不同)
    }
}

               2.2 使用 Stream API

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. 集合转数组的注意事项

                3.1 指定类型数组的大:在调用 toArray(new String[0]) 时,传递一个空数组(例如 new String[0])是一个常见的做法。这可以避免在 Java 10 之前的版本中可能出现的性能问题。从 Java 10 开始,toArray() 方法内部已经优化了这一过程,因此即使传入 new String[0] 也不会影响性能。

                3.2 类型安全:确保集合的泛型类型与数组的类型一致,以避免编译错误或运行时异常。

                3.3 集合的特性:对于 Set,转换后的数组顺序可能与集合中的顺序不同,因为 Set 是无序的。

你可能感兴趣的:(Java,java)