没有合适的资源?快使用搜索试试~ 我知道了~
【Java核心技术36讲.00-421】是一个以面试题为导向,旨在帮助读者提升Java技术内功的教程。教程由杨晓峰主讲,他拥有丰富的Oracle工作经验,专注于Java核心类库、国际化、分发服务等领域,并且有着丰富的面试经验。本教程强调通过面试题来检验和提升Java程序员的技能,特别是针对Java高级工程师和技术专家的职位要求。 Java作为一门广泛应用的编程语言,被许多大型互联网公司如阿里巴巴、京东、百度、腾讯、美团等广泛采用。在云计算领域,Java同样占据重要地位。因此,面试中常常会以Java作为主要考察点,测试候选人的技术实力。 对于初级和中级Java工程师,重点在于扎实的基础知识和主流框架的应用。而高级工程师则需要深入理解Java IO/NIO、并发编程、虚拟机等方面,并能深入源代码层次,同时对分布式、安全性和性能优化等领域有所了解。 作者在面试过程中发现,有些面试者尽管勤奋,但在技术理解和深度上存在不足,这可能是由于对技术选择背后逻辑的忽视,或是知识碎片化导致的系统性不足。面试者可能在遇到问题时过于依赖搜索引擎,而缺乏对核心技术的深入理解和系统性的把握。 为了解决这些问题,杨晓峰决定通过这个专栏,提供5大模块共36道题目,涵盖Java开发的各个方面,包括但不限于并发编程、内存管理、JVM、网络编程和数据结构等。他将深入解析这些题目,帮助读者构建系统性的知识体系,理解技术核心,提高解决问题的能力。 通过这个教程,读者不仅能得到面试准备的帮助,还能建立和完善自己的技术栈,提升对现代Java技术的理解。无论是对于正在寻求技术晋升,还是计划转向技术管理的人来说,坚实的Java技术基础都是必不可少的。
资源详情
资源评论
资源推荐
6/4/2020 开篇词 | 以面试题为切入点,有效提升你的Java内功
file:///D:/PythonProjects/htmlparser/data/111.Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF36%E8%AE%B2/00%E5%BC%80%E7%A
…
1/2
开篇词 | 以面试题为切入点,有效提升你的Java内功
杨晓峰 2018-04-28
Java 是一门历史悠久的编程语言,可以毫无争议地说,Java 是最主流的编程语言之一。全球有 1200 万以上
Java 程序员以及海量的设备,还有无所不能的 Java 生态圈。
我所知道的诸如阿里巴巴、京东、百度、腾讯、美团、去哪儿等互联网公司,基本都是以 Java 为首要编程语言
的。即使在最新的云计算领域,Java 仍然是 AWS、Google App Engine 等平台上,使用最多的编程语言;甚
至是微软 Azure 云上,Java 也以微弱劣势排在前三位。所以,在这些大公司的面试中,基本都会以 Java 为切
入点,考评一个面试者的技术能力。
应聘初级、中级 Java 工程师,通常只要求扎实的 Java 和计算机科学基础,掌握主流开源框架的使用;Java 高
级工程师或者技术专家,则往往全面考察 Java IO/NIO、并发、虚拟机等,不仅仅是了解,更要求对底层源代
码层面的掌握,并对分布式、安全、性能等领域能力有进一步的要求。
我在 Oracle 已经工作了近 7 年,负责过北京 Java 核心类库、国际化、分发服务等技术团队的组建,面试过从
初级到非常资深的 Java 开发工程师。由于 Java 组工作任务的特点,我非常注重面试者的计算机科学基础和编
程语言的理解深度,我甚至不要求面试者非要精通 Java,如果对 C/C++ 等其他语言能够掌握得非常系统和深
入,也是符合需求的。
工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不
足以通过面试,通常是两方面原因:
前人已经掉过的坑,后来的同学就别再“前仆后继”了!
起初,极客时间邀请我写《Java 核心技术面试精讲》专栏,我一开始心里是怀疑其形式和必要性的。经典的书
籍一大堆呀,网上也能搜到所谓的“面试宝典”呀,为什么还需要我“指手画脚”?
但随着深入交流,我逐渐被说服了。我发现很多面试者其实是很努力的,只是
我在极客时间推出这个专栏,就是为了让更多没有经验或者经验有限的开发者,在准备面试时:
“知其然不知其所以然”。做了多年技术,开发了很多业务应用,但似乎并未思考过种种技术选择背后的逻
辑。坦白说,我并不放心把具有一定深度的任务交给他。更重要的是,我并不确定他未来技术能力的成长潜
力有多大。团队所从事的是公司核心产品,工作于基础技术领域,我们不需要那些“差不多”或“还行”的
代码,而是需要达到一定水准的高质量设计与实现。我相信很多其他技术团队的要求会更多、更高。
知识碎片化,不成系统。在面试中,面试者似乎无法完整、清晰地描述自己所开发的系统,或者使用的相关
技术。平时可能埋头苦干,或者过于死磕某个实现细节,并没有抬头审视这些技术。比如,有的面试者,有
一些并发编程经验,但对基本的并发类库掌握却并不扎实,似乎觉得在用的时候进行“面向搜索引擎的编
程”就足够了。这种情况下,我没有信心这个面试者有高效解决复杂问题、设计复杂系统的能力。
很难甑别出各种技术的核心与要点,技术书籍这么庞杂,对于经验有限的同学,找到高效归纳自己知识体系
的方法并不容易。
各种“宝典”更专注于问题,解答大多点到即止,甚至有些解答准确性都值得商榷,缺乏系统性的分析与举
一反三的讲解。
6/4/2020 开篇词 | 以面试题为切入点,有效提升你的Java内功
file:///D:/PythonProjects/htmlparser/data/111.Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF36%E8%AE%B2/00%E5%BC%80%E7%A
…
2/2
Java 面试题目千奇百怪,有的面试官甚至会以黑魔法一样的态度,刨根问底 JVM 底层,似乎不深挖 JVM 源代
码、不谈谈计算机指令,就是不爱学习,这是仁者见仁智者见智的事儿。我会根据自己的经验,围绕 Java 开发
技术的方方面面,精选出 5 大模块,共 36 道题目,给出典型的回答,并层层深入剖析。
5 大模块分为:
这几年我从业务系统或产品开发,切换到 Java 平台自身,接触了更多 Java 领域的核心技术,我相信我的分享
能够提供一些独到的内容,而不是简单的人云亦云。
时移世易,很多大家耳熟能知的问题,其实在现代 Java 里已经发生了根本性的改变。在技术领域,即使你打算
或已经转为技术管理等,扎实的技术功底也是必须的。希望通过我的专栏,不仅可以让你面试成功,还能帮助
你未来职业发展更进一步。
万丈高楼平地起,愿我这个 Java 老兵,能与你一道,逐个击破大厂 Java 面试考点,直击 Java 技术核心要
点,构建你的 Java 知识体系。
少走弯路,利用有限的精力,能够更加高效地准备和学习。
提纲挈领,在知识点讲解的同时,为你梳理一个相对完整的 Java 开发技术能力图谱,将基础夯实。
Java 基础:我会围绕 Java 语言基本特性和机制,由点带面,让你构建牢固的 Java 技术功底。
Java 进阶:将围绕并发编程、Java 虚拟机等领域展开,助你攻坚大厂 Java 面试的核心阵地。
Java 应用开发扩展:从数据库编程、主流开源框架、分布式开发等,帮你掌握 Java 开发的十八般兵器。
Java 安全基础:让你理解常见的应用安全问题和处理方法,掌握如何写出符合大厂规范的安全代码。
Java 性能基础:你将掌握相关工具、方法论与基础实践。
6/4/2020 第1讲 | 谈谈你对Java平台的理解?
file:///D:/PythonProjects/htmlparser/data/111.Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF36%E8%AE%B2/01%E8%B0%88%E8%B0
…
1/3
第1讲 | 谈谈你对Java平台的理解?
杨晓峰 2018-05-04
从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Write once, run
anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度?请你先停
下来总结思考一下。
今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?
典型回答
Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write
once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),
Java 通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分
配和回收。
我们日常会接触到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。 JRE,也就是
Java 运行环境,包含了 JVM 和 Java 类库,以及一些模块等。而 JDK 可以看作是 JRE 的一个超集,提供了更
多工具,比如编译器、各种诊断工具等。
对于“Java 是解释执行”这句话,这个说法不太准确。我们开发的 Java 的源代码,首先通过 Javac 编译成为
字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机
器码。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-
In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部
分热点代码就属于编译执行,而不是解释执行了。
考点分析
其实这个问题,问得有点笼统。题目本身是非常开放的,往往考察的是多个方面,比如,基础知识理解是否很
清楚;是否掌握 Java 平台主要模块和运行原理等。很多面试者会在这种问题上吃亏,稍微紧张了一下,不知道
从何说起,就给出个很简略的回答。
对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面,一定要避免
让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或
者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。
即使感觉自己的回答不是非常完善,也不用担心。我个人觉得这种笼统的问题,有时候回答得稍微片面也很正
常,大多数有经验的面试官,不会因为一道题就对面试者轻易地下结论。通常会尽量引导面试者,把他的真实
水平展现出来,这种问题就是做个开场热身,面试官经常会根据你的回答扩展相关问题。
知识扩展
回归正题,对于 Java 平台的理解,可以从很多方面简明扼要地谈一下,例如:Java 语言特性,包括泛型、
Lambda 等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用
较多的类库,面试前可以系统化总结一下,有助于临场发挥。
6/4/2020 第1讲 | 谈谈你对Java平台的理解?
file:///D:/PythonProjects/htmlparser/data/111.Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF36%E8%AE%B2/01%E8%B0%88%E8%B0
…
2/3
或者谈谈 JVM 的一些基础概念和机制,比如 Java 的类加载机制,常用版本 JDK(如 JDK 8)内嵌的 Class-
Loader,例如 Bootstrap、 Application 和 Extension Class-loader;类加载大致过程:加载、验证、链接、
初始化(这里参考了周志明的《深入理解 Java 虚拟机》,非常棒的 JVM 上手书籍);自定义 Class-Loader
等。还有垃圾收集的基本原理,最常见的垃圾收集器,如 SerialGC、Parallel GC、 CMS、 G1 等,对于适用
于什么样的工作负载最好也心里有数。这些都是可以扩展开的领域,我会在后面的专栏对此进行更系统的介
绍。
当然还有 JDK 包含哪些工具或者 Java 领域内其他工具等,如编译器、运行时环境、安全工具、诊断和监控工
具等。这些基本工具是日常工作效率的保证,对于我们工作在其他语言平台上,同样有所帮助,很多都是触类
旁通的。
下图是我总结的一个相对宽泛的蓝图供你参考。
不再扩展了,回到前面问到的解释执行和编译执行的问题。有些面试官喜欢在特定问题上“刨根问底儿”,因
为这是进一步了解面试者对知识掌握程度的有效方法,我稍微深入探讨一下。
众所周知,我们通常把 Java 分为编译期和运行时。这里说的 Java 的编译和 C/C++ 是有着不同的意义的,
Javac 的编译,编译 Java 源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器码。Java 通
过字节码和 Java 虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,
到处执行”的基础。
在运行时,JVM 会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。就像我前面提到的,主流
Java 版本中,如 JDK 8 实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通常运行在
server 模式的 JVM,会进行上万次调用以收集足够的信息进行高效的编译,client 模式这个门限是 1500 次。
Oracle Hotspot JVM 内置了两个不同的 JIT compiler,C1 对应前面说的 client 模式,适用于对于启动速度敏
感的应用,比如普通 Java 桌面应用;C2 对应 server 模式,它的优化是为长时间运行的服务器端应用设计的。
默认是采用所谓的分层编译(TieredCompilation)。这里不再展开更多 JIT 的细节,没必要一下子就钻进去,
我会在后面介绍分层编译的内容。
Java 虚拟机启动时,可以指定不同的参数对运行模式进行选择。 比如,指定“-Xint”,就是告诉 JVM 只进行
解释执行,不对代码进行编译,这种模式抛弃了 JIT 可能带来的性能优势。毕竟解释器(interpreter)是逐条
读入,逐条解释运行的。与其相对应的,还有一个“-Xcomp”参数,这是告诉 JVM 关闭解释器,不要进行解
6/4/2020 第1讲 | 谈谈你对Java平台的理解?
file:///D:/PythonProjects/htmlparser/data/111.Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF36%E8%AE%B2/01%E8%B0%88%E8%B0
…
3/3
释执行,或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊?简单说,还真未必。“-
Xcomp”会导致 JVM 启动变慢非常多,同时有些 JIT 编译器优化方式,比如分支预测,如果不进行
profiling,往往并不能进行有效优化。
除了我们日常最常见的 Java 使用模式,其实还有一种新的编译方式,即所谓的 AOT(Ahead-of-Time
Compilation),直接将字节码编译成机器代码,这样就避免了 JIT 预热等各方面的开销,比如 Oracle JDK 9
就引入了实验性的 AOT 特性,并且增加了新的 jaotc 工具。利用下面的命令把某个类或者某个模块编译成为
AOT 库。
然后,在启动时直接指定就可以了。
而且,Oracle JDK 支持分层编译和 AOT 协作使用,这两者并不是二选一的关系。如果你有兴趣,可以参考相
关文档: http://openjdk.java.net/jeps/295。AOT 也不仅仅是只有这一种方式,业界早就有第三方工具
(如 GCJ、Excelsior JET)提供相关功能。
另外,JVM 作为一个强大的平台,不仅仅只有 Java 语言可以运行在 JVM 上,本质上合规的字节码都可以运
行,Java 语言自身也为此提供了便利,我们可以看到类似 Clojure、Scala、Groovy、JRuby、Jython 等大量
JVM 语言,活跃在不同的场景。
今天,我简单介绍了一下 Java 平台相关的一些内容,目的是提纲挈领地构建一个整体的印象,包括 Java 语言
特性、 核心类库与常用第三方类库、Java 虚拟机基本原理和相关工具,希望对你有所帮助。
一课一练
关于今天我们讨论的题目你做到心中有数了吗?知道不如做到,请你也在留言区写写自己对 Java 平台的理解。
我会选出经过认真思考的留言,送给你一份学习鼓励金,欢迎你与我一起讨论。
你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。
复制代码
1
2
jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base
复制代码
1
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld
剩余237页未读,继续阅读
张盛锋
- 粉丝: 30
- 资源: 297
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0