Java 引入中间列表是否会导致性能开销? List dataList=new ArrayList(); List dataList1=dataRepository.findAllByProcessType(ProcessType.OUT); List dataList2=dataRepository.findAllByProcessType(ProcessType.CORPORATE\u OUT); dataList.addAll(dataList1); dataList.addAll(dataList2); 返回数据列表;

Java 引入中间列表是否会导致性能开销? List dataList=new ArrayList(); List dataList1=dataRepository.findAllByProcessType(ProcessType.OUT); List dataList2=dataRepository.findAllByProcessType(ProcessType.CORPORATE\u OUT); dataList.addAll(dataList1); dataList.addAll(dataList2); 返回数据列表;,java,list,Java,List,vs List dataList=new ArrayList(); addAll(dataRepository.findAllByProcessType(ProcessType.OUT)); addAll(dataRepository.findAllByProcessType(ProcessType.CORPORATE_OUT)); 返回数据列表; 第一个实现是否会导致性能开销?(即,比第二次分配更多的垃圾/内存) 附言-是的,可以使用@Tim提到的往返db的一次行程进行优化。但这不是我想要的

vs

List dataList=new ArrayList();
addAll(dataRepository.findAllByProcessType(ProcessType.OUT));
addAll(dataRepository.findAllByProcessType(ProcessType.CORPORATE_OUT));
返回数据列表;
第一个实现是否会导致性能开销?(即,比第二次分配更多的垃圾/内存)


附言-是的,可以使用@Tim提到的往返db的一次行程进行优化。但这不是我想要的答案。我通常想知道这种类型的实现是否会导致开销。因为这种类型的实现有助于调试。

我要说不,因为如果两个代码块产生不同的字节码,我会非常惊讶

第一个代码没有“引入中间列表”。它所做的只是创建新变量来引用dataRepository调用创建的列表。我希望编译器能够简单地优化这些变量

这些列表也在第二个代码示例中创建,因此没有真正的区别

知道了编译器执行了这些优化,我们程序员就可以自由地编写布局良好、清晰且可维护的代码,同时仍然对它的性能充满信心

另一个考虑因素是调试。在第一个代码块中,很容易在变量声明行上设置断点,并检查变量的值。当代码在第二个代码块中实现时,这些简单的操作会变得很麻烦。

由于
addAll()
方法应该只引用相同的数据,所以两个版本的执行情况应该大致相同。但是,这里最好的做法是避免对数据库进行两次不必要的往返,只需使用一个查询:

List<UserData> dataList = new ArrayList<>();
dataList.addAll(dataRepository.findAllByProcessType(ProcessType.OUT));
dataList.addAll(dataRepository.findAllByProcessType(ProcessType.CORPORATE_OUT));
return dataList ;
List types=Arrays.asList(ProcessType.OUT,ProcessType.CORPORATE\u OUT);
List dataList=findAllByProcessTypeIn(类型);

好吧,我会说是的。在第一个实现中,您将从2个列表中添加。这两个中间列表必须被垃圾收集。我想那会造成开销。我上面所说的纯粹是推测,没有任何度量支持。@DogaOruc但是调用
findAllByProcessType
将导致创建并返回这两个列表,而不管它们存储在变量中,这意味着它们在两个实现中都需要被垃圾收集。但是列表是创建的,无论如何,都要被垃圾收集。唯一的区别是变量引用它们@Slaw谢谢-你打败了我的慢输入!)但这还需要两个指针,不是吗?Java实际上并不返回列表,而是返回指向这些列表的指针。我很困惑。你可能是对的。有人想对这两个实现进行基准测试吗?@DogaOruc假设我们在一个方法中,引用存储在堆栈上;具体来说,在方法的堆栈框架中。当线程退出该方法时,堆栈帧消失/销毁。然而,实际的列表本身将被存储在堆中,这意味着它们仍然必须被垃圾收集。这就是我要做的,不是因为性能原因,而是因为我不喜欢中间变量,它们除了声明下面的行之外,在其他任何地方都不会使用。如果测量的性能差异超出了误差范围,我会感到惊讶。换句话说,我希望两种实现具有几乎相同的性能。
List<UserData> dataList = new ArrayList<>();
dataList.addAll(dataRepository.findAllByProcessType(ProcessType.OUT));
dataList.addAll(dataRepository.findAllByProcessType(ProcessType.CORPORATE_OUT));
return dataList ;
List<ProcessType> types = Arrays.asList(ProcessType.OUT, ProcessType.CORPORATE_OUT);
List<UserData> dataList = findAllByProcessTypeIn(types);