List<UserData> dataList = new ArrayList<>();
List<UserData> dataList1 = dataRepository.findAllByProcessType(ProcessType.OUT);
List<UserData> dataList2 = dataRepository.findAllByProcessType(ProcessType.CORPORATE_OUT);
dataList.addAll(dataList1);
dataList.addAll(dataList2 );
return dataList ;
对比
List<UserData> dataList = new ArrayList<>();
dataList.addAll(dataRepository.findAllByProcessType(ProcessType.OUT));
dataList.addAll(dataRepository.findAllByProcessType(ProcessType.CORPORATE_OUT));
return dataList ;
第一个实现会导致任何性能开销吗? (即比第二个垃圾/内存分配更多)
附言- 是的,正如@Tim 所提到的,它可以使用到数据库的一次往返来优化。但这不是我正在寻找的答案。我一般想知道这种类型的实现是否会导致开销。因为这种实现有助于调试。
最佳答案
我要说不,因为如果这两个代码块产生不同的字节码我会感到非常惊讶。
第一个代码没有“引入一个中间列表”。它所做的只是创建新变量以引用由 dataRepository 调用创建的列表。我希望编译器简单地优化这些变量。
这些列表也是在第二个代码示例中创建的,因此没有真正的区别。
知道编译器执行这些类型的优化后,我们作为程序员可以自由编写布局良好、清晰且可维护的代码,同时仍然相信它会表现良好。
另一个考虑因素是调试。在第一个代码块中,很容易在变量声明行上设置断点,并检查变量的值。当代码在第二个代码块中实现时,这些简单的操作变得很痛苦。
关于java - 引入中间列表是否会导致性能开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57941551/