常见的面试问题

总结一下,在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. Docker Command and Dockerfile

    镜像相关命令 # 下载镜像 docker pull xxx # 搜素镜像 docker search xxx # 查看已经下载了哪些镜像 docker images # 查看已下载镜像的id dock ...

  2. disruptor笔记之二:Disruptor类分析

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. javascript 实现php str_pad

    * 查看php.net官方手册 string str_pad ( string $input , int $pad_length [, string $pad_string = " &quo ...

  4. Ajax与Gson

    1. ajax的底层操作方法: 代码get请求  Get请求 2. Post请求 $("#chufa").click(function () { var val = $(" ...

  5. jmeter加密解密(解密篇)

    上一篇已经讲解了公钥加密,这篇讲解公钥解密.解密比较简单,直接操作吧. 需求是:接口中的请求体的部分参数需要先加密再请求,返回的结果中部分字段需解密. 1.在请求下新建beanshell后置处理程序, ...

  6. [转载]CentOS 7 用户怎样安装 LNMP(Nginx+PHP+MySQL)

    关于 Nginx (发音 "engine x")这是一款免费.开源.高效的 HTTP 服务器,Nginx是以稳定著称,丰富的功能,结构简单,低资源消耗.本教程演示如何在CentOS ...

  7. 关于URL encode和parse

    from urllib import parses = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu& ...

  8. HashMap的tableSizeFor解析

    我们都知道,对于HashMap来说,数组的容量为2的倍数,但是我们可以在创建map的时候传入一个数组的大小 此时,这个初始化数组大小会传给一个双参的构造器 1. 创建HashMap public st ...

  9. postgresql高可用集群部署

    一.概况 1.概念 pgsql高可用集群采用postgresql+etcd+patroni+haproxy+keepalived等软件实现,以postgresql做数据库,etcd存储集群状态,pat ...

  10. 每日总结:Java课堂测试第三阶段第一次优化 (2021.9.20)

    package jisuan2; import java.util.*;public class xiaoxue { public static void main(String[] args) { ...