【问题标题】:Creating a new instance when getting data from service?从服务获取数据时创建新实例?
【发布时间】: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&lt;Employee&gt; employees = getAllEmployees(); 就可以了
  • 在 Java 中,对象是在堆上创建的,您传递的只是一个引用(您可以将其视为类似于 C++ 中的智能指针)。所以getAllEmployees() 可能会在堆上创建列表并返回一个引用。 List&lt;Employee&gt; employees 是另一个不采用返回引用的“值”的引用,即它现在引用同一个列表。由于对象是在堆上创建的,因此它们不受创建它们的方法的范围的约束——只要 live 线程可以访问该列表,它就会留在堆上。如果这发生了变化,GC 可以收集它。
  • 顺便说一句,Java 中的列表也只是引用的集合,就像对象数组一样。这意味着如果您创建这样的列表或数组,则不会为元素“分配”内存,仅用于引用(现在通常每个引用 8 个字节)。
  • 我不确定您希望我提供什么额外说明。请注意,对象数组(那些“包含”对象的数组)实际上只是引用数组,这意味着这些数组中“包含”的元素位于堆上的其他位置并且不依赖于数组。列表也是如此。

标签: java list memory heap-memory


【解决方案1】:

如果我创建一个新实例List&lt;Employee&gt; employees = new ArrayList&lt;&gt;(); 然后填充它employees = getAllEmployees(); 怎么办?

是否意味着在内存上创建和分配不必要的变量?

是的,没必要。您创建一个对空数组列表的引用,然后覆盖对方法返回值结果的引用。这不会“填满”列表。

这些解决方案填充现有列表,同时保持参考完整

// assuming your service returned service list needed to be mutated 
List<Employee> employees = new ArrayList<>(employeeService.findAll());

List<Employee> employees = new ArrayList<>();  // could be a class instance variable 
employees.clear();  // assuming there's existing data in the list 
employees.addAll(employeeService.findAll());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 2019-03-20
    • 2020-04-03
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多