java - 从文件读取数据并存储它们的最佳方法

标签 java arrays arraylist

我正在从学生文件中读取数据,其中每一行都是一个学生,然后我将该数据转换为一个学生对象,并且我想返回一个学生对象数组。我目前正在通过将每个学生对象存储在数组列表中然后将其作为标准 Student[] 返回来执行此操作。是否最好使用数组列表来拥有动态大小的数组,然后将其转换为标准数组以进行返回,或者我应该首先计算文件中的行数,创建该大小的 Student[],然后填充该数组。或者有没有更好的方法来做到这一点。

这里是代码(如果有帮助的话):

public Student[] readStudents() {
        String[] lineData;
        ArrayList<Student> students = new ArrayList<>();
        while (scanner.hasNextLine()) {
            lineData = scanner.nextLine().split(" ");
            students.add(new Student(lineData));
        }
        return students.toArray(new Student[students.size()]);
    }

最佳答案

哪个更好取决于您的需要和数据集大小。需求可能是 - 最简单的代码、最快的加载、最少的内存使用、对结果数据集的快速迭代...选项可能是

  1. 对于一次性脚本或小型数据集(数万个元素),可能任何方法都可以。
  2. 也许根本不存储元素,而是在读取元素时对其进行处理? - 使用最少的内存,适合非常大的数据集。
  3. 使用预分配的数组 - 如果您提前知道数据集大小 - 保证最少的内存分配 - 但计算元素本身可能会很昂贵。
  4. 如果不确定 - 使用 ArrayList 收集元素。如果您可以提前估计数据集大小的上限,假设您知道通常不超过 5000 个元素,那么它将最有效地工作。在这种情况下,创建包含 5000 个元素的 ArrayList。如果后备数组已满,它将自行调整大小。
  5. LinkedList - 可能是最保守的 - 它会随时分配空间,但每个元素所需的内存更大,并且迭代速度比数组或 ArrayList 慢。
  6. 您自己的数据结构已根据您的需求进行了优化。通常这种努力是不值得的,因此只有当您已经知道要解决的问题时才使用此选项。

关于 ArrayList 的注意事项:它首先预先分配一个带有一组槽的数组,然后填充这些槽,而无需重新分配内存。只要后备数组已满,就会分配一个新的较大数组,并将所有元素移入其中。默认情况下,新数组大小是前一个数组大小的两倍 - 通常这不是问题,但如果新数组无法获得足够的连续内存块,则可能会导致内存不足。

关于java - 从文件读取数据并存储它们的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60188810/

相关文章:

c# - "Storing"ArrayList 中的值类型

java - 为什么ArrayList的默认容量是10?

java - 如何正确合并 Hashmap<String, ArrayList<Object>> 和 HashMap<String, Object>

java - 如何使 systemprintln 语句仅打印 arraylist 值而不重复文本

java - 将 ArrayList 条目设置为 ViewFlipper 子项

c++ - 我怎样才能有一个具有许多值的关联数组

javascript - 如何从对象中获取名称的首字母

java - 接口(interface)作为Mapper值输出

java - java中检查括号是否正确的问题

c - 多线程 - 使用线程执行将文件内容存储在 char **array 中的函数?