杰瑞科技汇

Java对象如何高效转数组?

Java 中的对象本身不能直接“变成”一个基本数据类型的数组(如 int[], double[])。 你需要从对象中提取数据,然后用这些数据来创建一个新的数组。

Java对象如何高效转数组?-图1
(图片来源网络,侵删)

下面我将分几种最常见的情况来讲解:


对象是 Java 集合(List, Set 等)

这是最常见的情况,你有一个 ListSet,想把它转换成一个数组(通常是对象数组,如 Object[] 或特定类型的数组,如 String[])。

转换为 Object[] 数组

这是最简单直接的方法,适用于任何 Collection

方法: 使用 collection.toArray()

Java对象如何高效转数组?-图2
(图片来源网络,侵删)
import java.util.Arrays;
import java.util.List;
public class ListToArrayExample {
    public static void main(String[] args) {
        // 1. 创建一个 List
        List<String> fruitList = Arrays.asList("Apple", "Banana", "Cherry");
        // 2. 使用 toArray() 方法转换为 Object[]
        // 注意:这里没有提供参数,返回的是 Object[] 数组
        Object[] fruitArrayObject = fruitList.toArray();
        System.out.println("原始 List: " + fruitList);
        System.out.println("转换后的 Object[] 数组: " + Arrays.toString(fruitArrayObject));
        System.out.println("数组类型: " + fruitArrayObject.getClass().getName()); // [Ljava.lang.Object;
    }
}

输出:

原始 List: [Apple, Banana, Cherry]
转换后的 Object[] 数组: [Apple, Banana, Cherry]
数组类型: [Ljava.lang.Object;

转换为特定类型的数组(如 String[]

如果你希望得到的数组是 String[] 而不是 Object[],你需要提供一个指定类型的数组作为参数,这个数组的作用是告诉 JVM 你想要转换的目标类型。

方法: 使用 collection.toArray(T[] array)

import java.util.Arrays;
import java.util.List;
public class ListToTypedArrayExample {
    public static void main(String[] args) {
        // 1. 创建一个 List
        List<String> fruitList = Arrays.asList("Apple", "Banana", "Cherry");
        // 2. 创建一个与 List 大小相同的 String 数组作为参数
        //    也可以创建一个长度为 0 的数组,JVM 会自动计算大小
        String[] fruitArrayString = fruitList.toArray(new String[0]);
        System.out.println("原始 List: " + fruitList);
        System.out.println("转换后的 String[] 数组: " + Arrays.toString(fruitArrayString));
        System.out.println("数组类型: " + fruitArrayString.getClass().getName()); // [Ljava.lang.String;
    }
}

为什么是 new String[0] 你可能会疑惑为什么是 new String[0](一个空数组),这里的关键是,toArray() 方法并不关心你传入的数组里有没有元素,它只关心这个数组的类型,JVM 会检查这个空数组的类型,然后用这个类型和 List 的大小来创建一个全新的、正确大小的数组,这是一种非常高效且常见的写法。

Java对象如何高效转数组?-图3
(图片来源网络,侵删)

对象是自定义的 POJO (Plain Old Java Object)

假设你有一个自定义的类,里面有一些字段,你想把这些字段提取出来放到一个数组里。

方法:

  1. 手动创建数组,然后通过 getter 方法获取每个字段的值存入数组。
  2. 使用反射(Reflection)来自动完成这个过程,更灵活但性能稍差。

手动转换(推荐)

这是最直接、性能最好的方式。

class Person {
    private String name;
    private int age;
    private String city;
    // 构造函数、getter 和 setter
    public Person(String name, int age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
    public String getCity() { return city; }
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + ", city='" + city + "'}";
    }
}
public class PojoToArrayExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30, "New York");
        // 手动创建数组并填充
        Object[] personDataArray = new Object[] {
            person.getName(),
            person.getAge(),
            person.getCity()
        };
        System.out.println("Person 对象: " + person);
        System.out.println("转换后的 Object[] 数组: " + Arrays.toString(personDataArray));
    }
}

输出:

Person 对象: Person{name='Alice', age=30, city='New York'}
转换后的 Object[] 数组: [Alice, 30, New York]

使用反射转换(高级)

如果你希望代码更通用,不关心 Person 类的具体结构,可以使用反射。

import java.lang.reflect.Field;
public class PojoToArrayWithReflection {
    public static void main(String[] args) throws IllegalAccessException {
        Person person = new Person("Bob", 25, "London");
        // 获取类的所有字段(包括私有字段)
        Field[] fields = person.getClass().getDeclaredFields();
        Object[] dataArray = new Object[fields.length];
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            // 允许访问私有字段
            field.setAccessible(true);
            // 获取字段在对象实例上的值
            dataArray[i] = field.get(person);
        }
        System.out.println("Person 对象: " + person);
        System.out.println("通过反射转换的 Object[] 数组: " + Arrays.toString(dataArray));
    }
}

输出:

Person 对象: Person{name='Bob', age=25, city='London'}
通过反射转换的 Object[] 数组: [Bob, 25, London]

注意: 反射会带来性能开销,并且在处理私有字段时可能会破坏封装性,应谨慎使用。


对象是 JSON 字符串

在现代应用中,你经常需要将 JSON 格式的字符串(通常来自 API)转换成 Java 对象,然后再将其转换为数组。

方法:

  1. 使用 JSON 库(如 Jackson, Gson)将 JSON 字符串解析成 Java 对象(如 List 或自定义对象)。
  2. 然后按照 情况一情况二 的方法将其转换为数组。

示例(使用 Jackson 库)

假设你有以下 JSON 字符串: '[{"name":"Charlie","age":22}, {"name":"David","age":35}]'

这代表一个 List<Person>

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JsonToArrayExample {
    public static void main(String[] args) throws Exception {
        String jsonString = "[{\"name\":\"Charlie\",\"age\":22}, {\"name\":\"David\",\"age\":35}]";
        // 1. 创建 ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        // 2. 将 JSON 字符串解析为 List<Person>
        List<Person> personList = mapper.readValue(jsonString, new TypeReference<List<Person>>() {});
        // 3. 将 List 转换为数组(使用情况一的方法)
        Person[] personArray = personList.toArray(new Person[0]);
        System.out.println("解析后的 List: " + personList);
        System.out.println("转换后的 Person[] 数组: " + Arrays.toString(personArray));
    }
}

输出:

解析后的 List: [Person{name='Charlie', age=22, city='null'}, Person{name='David', age=35, city='null'}]
转换后的 Person[] 数组: [Person{name='Charlie', age=22, city='null'}, Person{name='David', age=35, city='null'}]

(注意:JSON 中没有 city 字段,所以为 null


场景 目标 推荐方法 代码示例
Java 集合 Object[] list.toArray() Object[] arr = myList.toArray();
Java 集合 String[] (特定类型) list.toArray(new Type[0]) String[] arr = myList.toArray(new String[0]);
自定义对象 (POJO) 手动转换 创建新数组,用 getter 填充 Object[] arr = {obj.getA(), obj.getB()};
自定义对象 (POJO) 通用/自动转换 使用反射 Field[] fields = obj.getClass().getDeclaredFields();
JSON 字符串 数组 先用 JSON 库转成 List,再转数组 List<T> list = mapper.read(json, ...); T[] arr = list.toArray(...);

选择哪种方法取决于你的具体需求,特别是数据的来源和你希望得到的数组类型,对于日常开发,从 List 转换到特定类型的数组是最常见的操作。

分享:
扫描分享到社交APP
上一篇
下一篇