常见的面试问题

总结一下,在Java程序员的面试中,经常会被问到类似这样的问题:

  1. Java中的函数式接口是什么意思?
  2. 注解 @FunctionalInterface 的作用是什么?
  3. 实现一个函数式接口有哪几种方式?
  4. lambda表达式和匿名内部类有什么区别?
  5. Java中的方法引用有哪几种形式?
  6. 能说说你对 Stream 接口中的 map 和 reduce 方法的理解吗?
  7. Stream并行编程的底层实现用了什么多线程框架?
  8. 能说说 Stream 并行编程的适用场景以及注意事项吗?
  9. ConcurrentHashMap中,有哪些方法具备原子性?
  10. 为什么在lambda表达式中引用外部变量时,要求外部变量是final的?怎么绕开这个限制?

问题答案

  1. Java中的函数式接口是什么意思?

只有一个抽象方法的接口都属于函数式接口。英文术语为 Functional Interface 。

  1. 注解 @FunctionalInterface 的作用是什么?

@FunctionalInterface 主要是告诉编译器它修饰的接口是一个函数式接口,如果接口的定义不符合函数式接口的规范,那么在编译阶段就会报错。当然,我们也可以不加这个注解,对代码的使用没有任何影响。

  1. 实现一个函数式接口有哪几种方式?

有3种方式:

  • 通过一个类来实现,包括常规的类和匿名内部类
  • 通过lambda表达式来实现
  • 通过方法引用来实现
  1. lambda表达式和匿名内部类有什么区别?

匿名内部类本质是一个类,只是不需要程序员显示指定类名,编译器会自动为该类取名。而 lambda 表达式本质是一个函数,当然,编译器也会为它取名。在JVM层面,匿名内部类对应的是一个 class 文件,而 lambda 表达式对应的是它所在主类的一个私有方法。

  1. Java中的方法引用有哪几种形式?

有4种形式:

  • object::instanceMethod 对象 + 实例方法
  • ClassName::staticMethod 类名 + 静态方法
  • ClassName::new 类名 + new关键字,构造方法引用
  • ClassName::instanceMethod 类名 + 实例方法
  1. 能说说你对 Stream 接口中的 map 和 reduce 方法的理解吗?

map方法的作用是遍历Stream中的每个元素,将每个元素映射为另一个元素。map,来源于数学中的概念函数映射。

reduce方法的作用是使用指定的计算逻辑,将多个元素逐个计算处理,最终得到一个结果。简单来说,reduce的过程就是将多个元素转换为一个最终结果。典型的包括将多个数字累加得到一个和,或者累乘得到一个积,或者将多个元素汇总起来得到一个ArrayList。

  1. Stream并行编程的底层实现用了什么多线程技术?

使用了 ForkJoinPool 技术。ForkJoinPool是Java 7引入的用于并行执行的任务框架,核心思想是将一个大任务拆分成多个小任务(即fork),然后再将多个小任务的处理结果汇总到一个结果上(即join)。此外,它也提供基本的线程池功能,譬如设置最大并发线程数,关闭线程池等。

  1. 能说说 Stream 并行编程的优点和局限性吗?

一般来说,在web应用中不推荐使用 Stream 的并行编程接口,因为 Stream 并行编程的底层是基于 ForkJoinPool ,而 ForkJoinPool 的工作线程数是在虚拟机启动时指定的,如果 Stream 并行执行的任务数量过多或耗时过多,甚至会影响应用程序中其它使用 ForkJoinPool 的功能。

但如果是在某些任务单一、能确保不影响其它任务的场景中,使用 Stream 并行编程能带来编码上的便利性:即使数据源不是线程安全的,通过 Stream 并行编程,也能轻松写出多线程并行处理任务的代码,不需要考虑加锁。

  1. ConcurrentHashMap中,有哪些方法具备原子性?

有4个方法具备原子性:

  • compute
  • computeIfAbsent
  • computeIfPresent
  • putIfAbsent

原子性的含义是说:从“判断 ConcurrentHashMap 是否存在指定的key”开始,然后“计算对应的value”,最后“向 ConcurrentHashMap 写入value”,这一系列的操作是一个原子性的过程 —— 就像加了锁一样,整个过程不会被别的线程打断。

  1. 为什么在lambda表达式中引用外部变量时,要求外部变量是final的?怎么绕开这个限制?

在lambda表达式中引用外部变量,会形成一个闭包,在多线程环境下,容易导致线程安全问题,防不胜防。因此,Java规定了,在lambda表达式内部引用外部变量的话,必须是final的,即不可变对象,只能赋值一次,不可修改。

但是,我们可以通过将该外部变量声明为一个数组或一个类(包括容器类)就可以修改其中的值。

面试官问:说说你对Java函数式编程的理解的更多相关文章

  1. 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

    这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...

  2. 面试官问我,Redis分布式锁如何续期?懵了。

    前言 上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了.]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所 ...

  3. 一张图,让你和面试官聊一个小时的“Java内存模型”

    如果面试官问你:你了解 Java 内存模型吗? 你就可以使用这张图,按照这张图中的顺序和面试官开聊,正常情况下,聊一个小时是差不多的,这个时候,对你的处境是非常有益的,因为面试官的时间不多了.

  4. 引用面试官文章 :如何准备Java初级和高级的技术面试

    本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...

  5. 面试官问线程安全的List,看完再也不怕了!

    最近在Java技术栈知识星球里面有球友问到了线程安全的 List: 扫码查看答案或加入知识星球 栈长在之前的文章<出场率比较高的一道多线程安全面试题>里面讲过 ArrayList 的不安全 ...

  6. 美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧

    本文首发于微信公众号:程序员乔戈里 public class testT { public static void main(String [] args){ String A = "hi你 ...

  7. 面试官:兄弟,说说Java到底是值传递还是引用传递

    二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...

  8. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  9. 当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮

    前言 今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的. 对于这两个集合类,相信大家都不陌生,ArrayList可以说是日常开发中用的 ...

随机推荐

  1. C#委托与事件实用场景

    首先,我们需要知道,到底在什么情况下必须使用委托和事件呢? 请看下面的场景:首领A要搞一场鸿门宴,吩咐部下B和C各自带队埋伏在屏风两侧,约定以杯为令:若左手举杯,则B带队杀出:若右手举杯,则C带队杀出 ...

  2. vue注意点

    template下面只能有一个节点,不能是多个

  3. Shell系列(22)- 字符截取命令awk

    简介 awk是一个数据处理工具,相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个"字段"来处理 awk的流程是依次读取每一行数据,读取完一行数据后,进行条件判断 ...

  4. javascript base64 encode decode 支持中文

    * 字符编码 ** 一定要知道数据的字符编码 ** 使用utf-8字符编码存储数据 ** 使用utf-8字符编码输出数据 * Crypto.js 支持中文 Base64编码说明 Base64编码要求把 ...

  5. phpspider PHP 爬虫

    * 通过composer下载 composer require owner888/phpspider // composer.json { "require": { "o ...

  6. nginx 常用x代码

    1.nginx 禁止ip直接访问,只允许域名访问,直接在.conf文件里 server上面再添加一个server 代码,不可以写同一个server里: server { listen 80 defau ...

  7. MyBatis Plus 批量数据插入功能,yyds!

    最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接.插入.断开连接的操作,从而导致一定 ...

  8. 定要过python二级 第11套

    1. 2.乃至好的代码片段与解决方法,我保存在了 H:盘中python中的:H:\python\python二级好的代码片段与错误解决 3.接着第一个点,为什么print(read(f))  把f 放 ...

  9. P5591-小猪佩奇学数学【单位根反演】

    正题 题目链接:https://www.luogu.com.cn/problem/P5591 题目大意 给出\(n,p,k\)求 \[\left(\sum_{i=0}^n\binom{n}{i}p^i ...

  10. P6880-[JOI 2020 Final]オリンピックバス【最短路】

    正题 题目链接:https://www.luogu.com.cn/problem/P6880 题目大意 给出\(n\)个点\(m\)条边的有向图,边有边权和一个翻转权值. 翻转至多一条边使得\(1-& ...