面试题答案
一键面试数据处理场景举例
- 大数据量的计算密集型任务:例如对一个包含数百万个整数的集合进行复杂的数学运算,如计算每个数的平方根并累加到一个结果值中。假设集合为
List<Integer> numbers = new ArrayList<>();
,初始化填充大量数据。- 顺序流实现:
double sumSequential = numbers.stream()
.mapToDouble(Math::sqrt)
.sum();
- **并行流实现**:
double sumParallel = numbers.parallelStream()
.mapToDouble(Math::sqrt)
.sum();
在这种大数据量且计算操作耗时的场景下,并行流能够显著提升效率。
- 数据元素间相互独立的过滤操作:比如有一个包含大量商品信息的列表,要筛选出价格大于某个阈值的商品。假设商品类为
class Product { double price; // 其他属性省略 }
,列表为List<Product> products = new ArrayList<>();
。- 顺序流实现:
List<Product> expensiveProductsSequential = products.stream()
.filter(product -> product.price > threshold)
.collect(Collectors.toList());
- **并行流实现**:
List<Product> expensiveProductsParallel = products.parallelStream()
.filter(product -> product.price > threshold)
.collect(Collectors.toList());
由于每个商品的价格判断相互独立,并行流可以并行处理不同元素,提高效率。
原理阐述
- 并行处理:并行流利用多核CPU的优势,将数据分成多个部分,每个部分在不同的线程中独立处理。例如上述大数据量计算密集型任务,数据集合被分割成多个子集合,每个子集合分配到不同线程,同时进行平方根计算和累加,从而减少整体执行时间。
- 减少等待时间:在数据元素相互独立的过滤操作中,并行流避免了顺序流中元素处理的串行等待。每个线程可以同时对自己负责的数据部分进行过滤,所有线程并行工作,大大缩短了完成整个过滤操作的时间。