【发布时间】:2022-01-27 06:30:45
【问题描述】:
当我们通过从服务中检索数据来填充列表时,我们不会创建实例,例如List<Employee> employees = new ArrayList<>();。我不确定真正的原因。
1.在这种情况下,我们的employees变量引用的是在调用getAllEmployees()方法时已经分配的员工列表?
2. 如果我创建一个新实例 List<Employee> employees = new ArrayList<>(); 然后填充它 employees = getAllEmployees(); 怎么办?是否意味着在内存上创建和分配不必要的变量?
主要:
public void demo() {
List<Employee> employees = getAllEmployees();
}
服务:
public List<Employee> getAllEmployees() {
return employeeService.findAll();
}
【问题讨论】:
-
我不确定问题到底是什么,但肯定没有必要将某些东西分配给变量然后立即重新分配。
-
一步如
List<Employee> employees = getAllEmployees();就可以了 -
在 Java 中,对象是在堆上创建的,您传递的只是一个引用(您可以将其视为类似于 C++ 中的智能指针)。所以
getAllEmployees()可能会在堆上创建列表并返回一个引用。List<Employee> employees是另一个不采用返回引用的“值”的引用,即它现在引用同一个列表。由于对象是在堆上创建的,因此它们不受创建它们的方法的范围的约束——只要 live 线程可以访问该列表,它就会留在堆上。如果这发生了变化,GC 可以收集它。 -
顺便说一句,Java 中的列表也只是引用的集合,就像对象数组一样。这意味着如果您创建这样的列表或数组,则不会为元素“分配”内存,仅用于引用(现在通常每个引用 8 个字节)。
-
我不确定您希望我提供什么额外说明。请注意,对象数组(那些“包含”对象的数组)实际上只是引用数组,这意味着这些数组中“包含”的元素位于堆上的其他位置并且不依赖于数组。列表也是如此。
标签: java list memory heap-memory