1.你觉得 Java 好在哪儿?

这种笼统的问题如果对某些知识点没有深入、系统地认识绝对会蒙!

所以为什么经常碰到面试官问你一些空、大的问题?其实就是考察你是否有形成体系的理解。

回到问题本身。我觉得可以从跨平台、垃圾回收、生态三个方面来阐述。

首先 Java 是跨平台的,不同平台执行的机器码是不一样的,而 Java 因为加了一层中间层 JVM ,所以可以做到一次编写多平台运行,即 「Write once,Run anywhere」。

编译执行过程是先把 Java 源代码编译成字节码,字节码再由 JVM 解释或 JIT 编译执行,而因为 JIT 编译时需要预热的,所以还提供了 AOT(Ahead-of-Time Compilation),可以直接把字节码转成机器码,来让程序重启之后能迅速拉满战斗力。

(解释执行比编译执行效率差,你想想每次给你英语让你翻译阅读,还是直接给你看中文,哪个快?)

Java 还提供垃圾自动回收功能,虽说手动管理内存意味着自由、精细化地掌控,但是很容易出错。

在内存较充裕的当下,将内存的管理交给 GC 来做,减轻了程序员编程的负担,提升了开发效率,更加划算!

然后现在 Java 生态圈太全了,丰富的第三方类库、网上全面的资料、企业级框架、各种中间件等等,总之你要的都有。

基本上这样答差不多了,之后等着面试官延伸。

当然这种开放性问题没有固定答案,我的回答仅供参考。

2.如果让你设计一个 HashMap 如何设计?

这个问题我觉得可以从 HashMap 的一些关键点入手,例如 hash函数、如何处理冲突、如何扩容。

可以先说下你对 HashMap 的理解。

比如:HashMap 无非就是一个存储 <key,value> 格式的集合,用于通过 key 就能快速查找到 value。

基本原理就是将 key 经过 hash 函数进行散列得到散列值,然后通过散列值对数组取模找到对应的 index 。

所以 hash 函数很关键,不仅运算要快,还需要分布均匀,减少 hash 碰撞。

而因为输入值是无限的,而数组的大小是有限的所以肯定会有碰撞,因此可以采用拉链法来处理冲突。

为了避免恶意的 hash 攻击,当拉链超过一定长度之后可以转为红黑树结构。

当然超过一定的结点还是需要扩容的,不然碰撞就太严重了。

而普通的扩容会导致某次 put 延时较大,特别是 HashMap 存储的数据比较多的时候,所以可以考虑和 redis 那样搞两个 table 延迟移动,一次可以只移动一部分。

不过这样内存比较吃紧,所以也是看场景来 trade off 了。

不过最好使用之前预估准数据大小,避免频繁的扩容。

基本上这样答下来差不多了,HashMap 几个关键要素都包含了,接下来就看面试官怎么问了。

可能会延伸到线程安全之类的问题,反正就照着 currentHashMap 的设计答。

3.并发类库提供的线程池实现有哪些?

虽说阿里巴巴Java 开发手册禁止使用这些实现来创建线程池,但是这问题我被问过好几次,也是热点。

问着问着就会延伸到线程池是怎么设计的。

我先来说下线程池的内部逻辑,这样才能理解这几个实现。

首先线程池有几个关键的配置:核心线程数、最大线程数、空闲存活时间、工作队列、拒绝策略。

  1. 默认情况下线程不会预创建,所以是来任务之后才会创建线程(设置prestartAllCoreThreads可以预创建核心线程)。
  2. 当核心线程满了之后不会新建线程,而是把任务堆积到工作队列中。
  3. 如果工作队列放不下了,然后才会新增线程,直至达到最大线程数。
  4. 如果工作队列满了,然后也已经达到最大线程数了,这时候来任务会执行拒绝策略。
  5. 如果线程空闲时间超过空闲存活时间,并且线程线程数是大于核心线程数的则会销毁线程,直到线程数等于核心线程数(设置allowCoreThreadTimeOut 可以回收核心线程)。

我们再回到面试题来,这个实现指的就是 Executors 的 5 个静态工厂方法:

  • newFixedThreadPool
  • newWorkStealingPool
  • newSingleThreadExecutor
  • newCachedThreadPool
  • newScheduledThreadPool

newFixedThreadPool

这个线程池实现特点是核心线程数和最大线程数是一致的,然后 keepAliveTime 的时间是 0 ,队列是无界队列。

按照这几个设定可以得知它任务线程数是固定,如其名 Fixed。

然后可能出现 OOM 的现象,因为队列是无界的,所以任务可能挤爆内存。

它的特性就是我就固定出这么多线程,多余的任务就排队,就算队伍排爆了我也不管

因此不建议用这个方式来创建线程池。

newWorkStealingPool

这个是1.8才有的,从代码可以看到返回的就是 ForkJoinPool,我们1.8用的并行流就是这个线程池。

比如users.parallelStream().filter(...).sum();用的就是 ForkJoinPool 。

从图中可以看到线程数会参照当前服务器可用的处理核心数,我记得并行数是核心数-1。

这个线程池的特性从名字就可以看出 Stealing,会窃取任务

每个线程都有自己的双端队列,当自己队列的任务处理完毕之后,会去别的线程的任务队列尾部拿任务来执行,加快任务的执行速率。

至于 ForkJoin 的话,就是分而治之,把大任务分解成一个个小任务,然后分配执行之后再总和结果,再详细就自行查阅资料啦~

newSingleThreadExecutor

这个线程池很有个性,一个线程池就一个线程,一个人一座城,配备的也是无界队列。

它的特性就是能保证任务是按顺序执行的

newCachedThreadPool

这个线程池是急性子,核心线程数是 0 ,最大线程数看作无限,然后任务队列是没有存储空间的,简单理解成来

2021最新互联网面试必问Java后端面试题(含答案)相关推荐

  1. 后端在插入数据发现重复如何正确的弹出警告_前百度面试官整理的——Java后端面试题(一)...

    List 和 Set 的区别 List , Set 都是继承自 Collection 接口 List 特点:元素有放入顺序,元素可重复 , Set 特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉 ...

  2. 为校招搜集整理的10万字java后端面试题ing...,基础不太好不知道从哪儿开头的冲它就完事了

    java后端面试题 Java基础 1.什么是Java 2.jdk,jre和jvm的区别 3.什么是跨平台性及原理 4.Java语言的特点 5.什么是字节码 6.采用字节码的好处 7.Java和C++的 ...

  3. 北大青鸟Java内侧答案_北大青鸟推荐:Java精选笔试题(含答案解析)

    北大青鸟推荐:Java精选笔试题(含答案解析)如果你是计算机专业出生,但是还没有找到工作的话,你就得补补技术了,一些关于面试.笔试的题要多刷一刷.有可能你知道答案,但是由于语言组织能力有所欠缺,所以面 ...

  4. 2021年哔哩哔哩Java高级面试题及答案,知识点总结+面试题解析

    正文 梳理知识点,是快速提升技术的关键 前面讲过,快速提升自己的技术硬实力其实是有方法的.大致就是梳理知识点+夯实基础+进阶深入学习+实战,下面我会一点点跟大家剖析,本文干货满满,大家仔细阅读. 梳理 ...

  5. 明翰中高级Java后端面试题攻略v0.3(持续更新)

    文章目录 前言 Java基础 Java综合 请按顺序并按分类写出java的8种基本数据类型? Integer与int的区别? Object类中的方法的有什么,其作用? equals()与==的区别? ...

  6. 2022最全Java后端面试题总结(京东、阿里、字节、美团、拼多多等)

    前言 金九银十即将到来,想必有的人为了金九银十跳槽早早做足了准备,有的人还在临阵磨刀,那么问题来了,怎么才能在众多面试者里中脱颖而出. 不妨先来跟我来看看之前认识的一位程序员(网友),他曾面过了京东. ...

  7. 2021年京东Android岗面试必问,高级面试题+解析

    面试经历 网易游戏实习生招聘很神奇的是整个就一轮面试,HR面是不存在的.面试是视频面试,用的牛客网平台,大概面了一个小时多一点.面试主要就是把计算机四大专业课轮番问了一遍,问了Java语言基础,最后还 ...

  8. 面试必问---Java线程池8大拒绝策略

    前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...

  9. 最新阿里内推Java后端面试题

    阿里一面题目: osi七层网络模型,五层网络模型,每次层分别有哪些协议 死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决 如何判断链表有环 虚拟机类加载机制,双亲委派模型,以及为什么 ...

  10. 2022 年,阿里内推 Java 后端面试题,文末附面试福利

    阿里一面题目: osi 七层网络模型,五层网络模型,每次层分别有哪些协议 死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决 如何判断链表有环 虚拟机类加载机制,双亲委派模型,以及为什 ...

最新文章

  1. [BZOJ2653]middle
  2. java高并发编程(二)
  3. 《Android传感器开发与智能设备案例实战》——导读
  4. 报错内容 IndentationError: unindent does not match any outer indentation level
  5. 研究生申请:就一个字
  6. python解决urllib发送请求报错:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED].....>
  7. EmEditor Pro 8.3简体中文绿色增强(无需安装)版
  8. Linux 命令(60)—— strip 命令
  9. 第二季-专题6-点亮指路灯
  10. c# gerber文件读取_必须收藏的一篇关于:AD18生成gerber文件及用CAM350读取gerber教程...
  11. 锐起无盘服务器蓝屏死机,正确配置减少锐起无盘系统死机蓝屏
  12. 桂林老兵php,中间件解析漏洞
  13. 计算机基础常见八股问题集合(含计算机网络,操作系统,计算机组成,数据结构与算法,数据库)
  14. 台达服务器电源原理电路图,台达DPS-250GB-4B ATX电源原理分析与检修
  15. Flutter学习日记之使用路由进行页面切换
  16. 乐乎常用的html源码,点点网关闭自定义html模板代码功能,网易lofter重新映入眼帘...
  17. C# API POST与GET的调用
  18. 一张图解析FastAdmin中的FormBuilder表单生成器
  19. 【Unity-学习-014】EasyAR4.0稀疏空间地图 扫描场景功能
  20. Perl正则表达式(1) - 正则表达式基础知识

热门文章

  1. Hbase复习回顾(从原理到使用)
  2. Android Studio微信app项目
  3. Win 7 修改开机密码,使用F8修复提前终止导致蓝屏
  4. 脑机接口系统的柔性电极概述
  5. ‘keytool‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  6. 【佐佑众工】每天早上起床, 我都要看一下福布斯排行榜
  7. flutter devices No connected devices found
  8. swiper轮播多个分页指示器
  9. Saving money
  10. CH549/CH548学习笔记1 - 硬件设计