面试官:介绍下Java的Stream。
你:Stream就是可以对一个集合类的数据进行聚合操作。可以是串行,也可以是并行的。
面试官:那Stream具体是如何遍历数据的?
你:Stream的遍历主要经过 数据源,中间操作,终结操作。中间操作不会处理数据,只是对每个操作进行记录并且返回一个流,终结操作才会进行计算。
面试官:那你说的这个中间操作和终结操作指的是什么?
你:中间操作就是filter,map这类函数。终结操作就是max,collect这类函数。中间操作分为有状态和无状态的,有状态的操作需要集合中所有的元素,无状态不需要且只关心当前的。终结操作分为短路和非短路的操作,短路操作就是可以立即停止,只要处理完复合条件的元素,而非短路的则需要把所有元素都处理完。
面试官:中间操作的有状态和无状态的操作有哪些?
你:有状态的有distinct,sorted,limit,skip。无状态的有filter,map,peek,unordered等。
面试官:终结操作的短路和非短路的操作有哪些?
你:短路的操作有anyMatch,allMatch,findAny,findFIrst,noneMatch ,非短路的操作有max,min,count,collect,reduce,toArray,forEach,forEachOrdered。
面试官:你之前说可以支持并行操作,可以介绍下吗?
你:parallelStream就是利用的ForkJoin框架实现的,就是先分片,再合并。分片利用了Splititerator的estimateSize估算出分片的数量。
面试官:介绍下ForkJoin框架?
你:ForkJoin主要还是利用了线程池的思想,它的核心就是一个ForkJoinPool,线程池内的线程一次只能执行一个task,而每个线程在线程池里还有一个对应的双向队列deque,线程不仅可以从自己的双向队列里拿task,如何线程自身的队列空了,它还可以去帮其他没做完的线程,从繁忙的线程的双向队列的尾部取出task执行,这就是work-stealing算法,这个可以平衡线程的工作负载,从总体上提高了速度,不要等待最慢的线程。
面试官:那ForkJoin和ExecutorService的区别是什么?
你:他们都有各自的应用场景,ForkJoin是可以自动分片和聚合操作,而ExecutorService则要手动。ForkJoin适合处理同一种任务时,进行提速,就是work-stealing的算法的帮助,而ExecutorService适合同时处理多种不同或者相同的任务,但是无法再提速。
面试官:看完不点赞收藏吗?
你:下次一定