我从每行都是学生的学生文件中读取数据,然后将这些数据转换为学生对象,并且我想返回一个学生对象数组。我目前正在通过将每个学生对象存储在数组列表中,然后将其作为标准Student []返回的方式来执行此操作。使用arraylist拥有一个动态大小的数组,然后将其转换为返回的标准数组更好吗?还是我应该首先计算文件中的行数,使该大小的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()]);
}
答案 0 :(得分:2)
哪个更好取决于您需要什么和您的数据集大小。需求可能是-最简单的代码,最快的加载,最少的内存使用,对resultind数据集的快速迭代...选项可能是
关于ArrayList的注意事项:它开始于预先分配一个带有一组插槽的数组,这些插槽随后被填充而无需重新分配内存。只要后备阵列已满,就会分配一个新的更大的后备阵列,并将所有元素移入其中。默认情况下,新数组的大小是前一个数组的两倍-通常这不是问题,但是如果新数组不能获得足够的连续内存块,则可能导致内存不足。
答案 1 :(得分:1)
将数组用于固定大小的数组。对于学生而言并非如此,因此如您在阅读中所见,ArrayList更适合。从ArrayList到数组的转换是多余的。
然后,使用最通用的类型,在这里List
界面。这样的实现ArrayList
或LinkedList
是一个技术实现问题。您稍后可能会使用其他运行时行为来更改其他实现。
但是您的代码可以处理各种List
,这确实是一个强大的概括。
此处包含一些实现的有用接口的不完整列表
所以:
public List<Student> readStudents() {
List<Student> students = new ArrayList<>();
while (scanner.hasNextLine()) {
String[] lineData = scanner.nextLine().split(" ");
students.add(new Student(lineData));
}
return students;
}
在代码审查中,人们将对构造函数Student(String[] lineData)
进行评论,这可能会导致将来的数据更改。