- 金四银五收获阿里、腾讯、美团offer后,我总结了大厂Java面
- 一线互联网大厂面经分享:阿里三面+头条四面+腾讯二面+美团四面
- 凭借这份Java面试手册(200多家大厂真题),我成功的拿到了阿
- 美团点评高级1234面:算法+HashMap+Zookeeper
- 网易CTO:70%.NET开发,遇到这个问题就怂!
- 我凭借这份pdf,最终拿到了阿里,腾讯,京东等八家大厂offer
- 蚂蚁三面被挂,幸获内推,历经5轮终于拿到口碑offer
- 失业来得太突然,阿里、腾讯裁员冲上热搜,裁员潮下的Android
- Java开发5年,四面美团(多线程+redis+JVM+数据库)
- 中高级iOS大厂面试宝典,拿到offer率80%,金三银四将是你
![](https://img.haomeiwen.com/i16826084/e8930ac3bac69da2.png)
前言
Java 是一门历史悠久的编程语言,可以毫无争议地说,Java 是主流的编程语言之一。全 球有 1200 万以上 Java 程序员以及海量的设备,还有无所不能的 Java 生态圈。
我所知道的诸如阿里巴巴、京东、百度、腾讯、美团、去哪儿等互联网公司,基本都是以 Java 为首要编程语言的。即使在新的云计算领域,Java 仍然是 AWS、Google App Engine 等平台上,使用多的编程语言;甚至是微软 Azure 云上,Java 也以微弱劣势排 在前三位。所以,在这些大公司的面试中,基本都会以 Java 为切入点,考评一个面试者的 技术能力。
应聘初级、中级 Java 工程师,通常只要求扎实的 Java 和计算机科学基础,掌握主流开源 框架的使用;Java 高级工程师或者技术专家,则往往全面考察 Java IO/NIO、并发、虚拟机等,不仅仅是了解,更要求对底层源代码层面的掌握,并对分布式、安全、性能等领域能 力有进一步的要求。
工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因:
- “知其然不知其所以然”。做了多年技术,开发了很多业务应用,但似乎并未思考过种种技术选择背后的逻辑。坦白说,我并不放心把具有一定深度的任务交给他。更重要的是,我并不确定他未来技术能力的成长潜力有多大。团队所从事的是公司核心产品,工作于基础技术领域,我们不需要那些“差不多”或“还行”的代码,而是需要达到一定水准的高质量设计与实现。我相信很多其他技术团队的要求会更多、更高。
- 知识碎片化,不成系统。在面试中,面试者似乎无法完整、清晰地描述自己所开发的系统,或者使用的相关技术。平时可能埋头苦干,或者过于死磕某个实现细节,并没有抬头审视这些技术。比如,有的面试者,有一些并发编程经验,但对基本的并发类库掌握却并不扎实,似乎觉得在用的时候进行“面向搜索引擎的编程”就足够了。这种情况下,我没有信心这个面试者有高效解决复杂问题、设计复杂系统的能力。
前人已经掉过的坑,后来的同学就别再“前仆后继”了!
很难甑别出各种技术的核心与要点,技术书籍这么庞杂,对于经验有限的同学,找到高效归纳自己知识体系的方法并不容易。
各种“宝典”更专注于问题,解答大多点到即止,甚至有些解答准确性都值得商榷,缺乏系统性的分析与举一反三的讲解。
那么本文的总结就是为了让更多没有经验或者经验有限的开发者,在准备面试时:
- 少走弯路,利用有限的精力,能够更加高效地准备和学习。
- 提纲挈领,在知识点讲解的同时,为你梳理一个相对完整的 Java 开发技术能力图谱,将基础夯实。
Java 面试题目千奇百怪,有的面试官甚至会以黑魔法一样的态度,刨根问底 JVM 底层,似乎不深挖 JVM 源代码、不谈谈计算机指令,就是不爱学习,这是仁者见仁智者见智的事儿。我会根据自己的经验,围绕 Java 开发技术的方方面面,精选出 5 大模块,共39道题目,给出典型的回答,并层层深入剖析。
5 大模块分为:
- Java 基础:我会围绕 Java 语言基本特性和机制,由点带面,让你构建牢固的 Java 技术工底。
- Java 进阶:将围绕并发编程、Java 虚拟机等领域展开,助你攻坚大厂 Java 面试的核心阵地。
- Java 应用开发扩展:从数据库编程、主流开源框架、分布式开发等,帮你掌握 Java 开发的十八般兵器。
- Java 安全基础:让你理解常见的应用安全问题和处理方法,掌握如何写出符合大厂规范的安全代码。
- Java 性能基础:你将掌握相关工具、方法论与基础实践。
万丈高楼平地起,愿我这个 Java 老兵,能与你一道,逐个击破大厂 Java 面试考点,直击Java 技术核心要点,构建你的 Java 知识体系。
本文限于篇幅,故只展示小编所整理的《Java核心面试笔记39问》中的部分内容,完整的面试笔记可以在【资料地址】即可获取下载方式
一、Java基础
- 谈谈你对Java平台的理解?
- Exception和Error有什么区别?
- 谈谈final、finally、 finalize有什么 不同?
- 强引用、软引用、弱引用、幻象引用有什么区别?
- String、 StringBuffer、 StringBuilder有什么区 别?
- 动态代理是基于什么原理?
- int和Integer有什么区别?
- 对比Vector、ArrayList、 LinkedList有 何区别?
- 对比Hashtable、HashMap、 TreeMap有什么 不同?
- 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
- Java提供了哪些IO方式? NIO如何实现多 路复用? .
- Java有几种文件拷贝方式?哪一种最高效?
- 谈谈接口和抽象类有什么区别?
- 谈谈你知道的设计模式?
案例展示
- 谈谈你对Java平台的理解?
参考答案:
Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。
我们日常会接触到 JRE(Java Runtime Environment)或者 JDK(Java DevelopmentKit)。 JRE,也就是 Java 运行环境,包含了 JVM 和 Java 类库,以及一些模块等。而JDK 可以看作是 JRE 的一个超集,提供了更多工具,比如编译器、各种诊断工具等。
对于“Java 是解释执行”这句话,这个说法不太准确。我们开发的 Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。
![](https://img.haomeiwen.com/i21105806/a405a823455613aa.png)
二、Java进阶
- synchronized和ReentrantLock有什么区别呢?
- synchronized底层如何实现?什么是锁的升级、降级?
- 一个线程两次调用start()方法会出现什么情况?
- 什么情况下Java程序会产生死锁?如何定位、修复?
- Java并发包提供了哪些并发工具类?
- 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
- Java并发类库提供的线程池有哪几种?分 别有什么特点?
- AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
- 请介绍类加载过程,什么是双亲委派模型?
- 有哪些方法可以在运行时动态生成- -个Java类?
- 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
- 如何监控和诊断JVM堆内和堆外内存使用?
- Java常见的垃圾收集器有哪些?
- 谈谈你的GC调优思路?
- Java内存模型中的happen-before是什么?
- Java程序运行在Docker等容器环境有哪些新问题?
案例展示
- 什么情况下Java程序会产生死锁?如何定位、修复?
参考答案:
死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。
你可以利用下面的示例图理解基本的死锁问题:
![](https://img.haomeiwen.com/i21105806/12a11180c7f06c91.png)
定位死锁最常见的方式就是利用 jstack 等工具获取线程栈,然后定位互相之间的依赖关系,进而找到死锁。如果是比较明显的死锁,往往 jstack 等就能直接定位,类似 JConsole甚至可以在图形界面进行有限的死锁检测。
如果程序运行时发生了死锁,绝大多数情况下都是无法在线解决的,只能重启、修正程序本身问题。所以,代码开发阶段互相审查,或者利用工具进行预防性排查,往往也是很重要的
![](https://img.haomeiwen.com/i21105806/ee1ffb6ad93a2890.png)
三、Java安全
- 你了解Java应用开发中的注入攻击吗?
- 如何写出安全的Java代码?
案例展示
- 如何写出安全的Java代码?
参考答案:
这个问题可能有点宽泛,我们可以用特定类型的安全风险为例,如拒绝服务(DoS)攻击,分析 Java 开发者需要重点考虑的点。DoS 是一种常见的网络攻击,有人也称其为“洪水攻击”。最常见的表现是,利用大量机器发送请求,将目标网站的带宽或者其他资源耗尽,导致其无法响应正常用户的请求。
![](https://img.haomeiwen.com/i21105806/fcd924fc1ad81d7f.png)
四、Java性能
- 后台服务出现明显"变慢",谈谈你的诊断思路?.
- 有人说"Lambda能让Java程序慢30倍",你怎么看?
- JVM优化Java代码时都做了什么?
案例展示
- 有人说"Lambda能让Java程序慢30倍",你怎么看?
参考答案:
我认为,“Lambda 能让 Java 程序慢 30 倍”这个争论实际反映了几个方面:
- 第一,基准测试是一个非常有效的通用手段,让我们以直观、量化的方式,判断程序在特定条件下的性能表现。
- 第二,基准测试必须明确定义自身的范围和目标,否则很有可能产生误导的结果。前面代码片段本身的逻辑就有瑕疵,更多的开销是源于自动装箱、拆箱(autoboxing/unboxing),而不是源自 Lambda 和 Stream,所以得出的初始结论是没有说服力的。
- 第三,虽然 Lambda/Stream 为 Java 提供了强大的函数式编程能力,但是也需要正视其局限性
![](https://img.haomeiwen.com/i21105806/980351532b46148e.png)
五、Java应用开发扩展
- 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
- 谈谈Spring Bean的生命周期和作用域?
- 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
- 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
案例展示
- 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
参考答案:
单独从性能角度,Netty 在基础的 NIO 等类库之上进行了很多改进,例如:
- 更加优雅的 Reactor 模式实现、灵活的线程模型、利用 EventLoop 等创新性的机制,可以非常高效地管理成百上千的 Channel。
- 充分利用了 Java 的 Zero-Copy 机制,并且从多种角度,“斤斤计较”般的降低内存分配和回收的开销。例如,使用池化的 Direct Buffer 等技术,在提高 IO 性能的同时,减少了对象的创建和销毁;利用反射等技术直接操纵 SelectionKey,使用数组而不是 Java容器等。
- 使用更多本地代码。例如,直接利用 JNI 调用 Open SSL 等方式,获得比 Java 内建 SSL引擎更好的性能。
- 在通信协议、序列化等其他角度的优化。
总的来说,Netty 并没有 Java 核心类库那些强烈的通用性、跨平台等各种负担,针对性能等特定目标以及 Linux 等特定环境,采取了一些极致的优化手段。
![](https://img.haomeiwen.com/i21105806/ae20abe693d664f9.png)
说明
![](https://img.haomeiwen.com/i21105806/495cc848b96adebb.png)
如图所示,本学习PDF文档共涉及Java核心知识点一共39问,针对每一个考点都有相对应的分析及知识扩展,本文限于篇幅,故只能展示部分的面试题解析,完整的《Java核心面试笔记39问》PDF文档小编已经整理好了,正在找工作或者说你想通过这些面试题解析提升一下自己技术的朋友可以帮忙转发一下,然后在【资料地址】即可获取下载方式
学习感言
时移世易,很多大家耳熟能知的问题,其实在现代 Java 里已经发生了根本性的改变。在技术领域,即使你打算或已经转为技术管理等,扎实的技术功底也是必须的。希望通过我的分享,不仅可以让你面试成功,还能帮助你未来职业发展更进一步。
网友评论