开发技术交流Java面试总结好文

在Java路上,我看过的一些书、源码和框架

2017-03-21  本文已影响172人  e5497a4bf107

物有本末,事有终始,知所先后,则近道矣

面试经历

关于Java面试,你应该准备这些知识点http://www.jianshu.com/p/1b2f63a45476

关于Java面试,你应该准备这些知识点(续)http://www.jianshu.com/p/fa0085a0cdf9

前段时间抽空整理了上面两篇面试经历,收到不少的关注,很多同学私信我平时都是如何get到这些知识的,是否有一些相关的书单,Java的源码太多了,应该如何看,框架的代码应该如何阅读等等问题。

现在想想,似乎以前也这样迷茫过,没有明确的方向,做过后端,做过前端,就因为啃完了一整本《JavaScript高级程序设计》(https://item.jd.com/10951037.html),在面试的时候信誓旦旦说只做前端,不写后端代码。直到后来,碰巧有机会让我重新捡起Java,很感激有这次机会,也慢慢的明确了自己的方向。

我喜欢在拿到书的那一刻就写下当天的日期,方便以后可以知道这本书是何时买的,不知不觉中已经买了很多Java相关的书,同时也收获了很多。

书单

《Java核心技术 卷I》https://item.jd.com/12037418.html

一直以来,这本书都被认为是面向Java程序员的经典教程和参考书,内容翔实、客观准确,不拖泥带水,与《Java编程思想》齐名。

推荐作为Java的入门书籍,记得这是当时入手的第一本书,爱护有加,毕竟贵啊。

《大话设计模式》https://item.jd.com/1026927882.html

感受设计演变过程中所蕴含的大智慧,体会乐与怒的程序人生中值得回味的一幕幕。

推荐作为设计模式的入门书籍,里面的实现的代码都是基于Java的,通过很生动的方式讲解了23中设计模式,但是设计模式的思想和精髓,还是需要在平时项目中慢慢领会以及运用。

《深入剖析Tomcat》https://item.jd.com/10913619.html

深入剖析Tomcat4和Tomcat5中的每个组件,并揭示其内部工作原理,从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。

当时也不知道为什么会买这本书,功力不足,啃了很多遍也没有啃完,似乎已经找不到这本书了...

深入理解Java虚拟机:JVM高级特性与最佳实践》https://item.jd.com/10697182.html

周志明老师的第一版书,JVM入门经典之作,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。

这是入手的第一本关于JVM的书籍,当时看了前面几章节,感觉自己在学习几年的Java白学了...前前后后啃了很多遍,因为看完会忘记

《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》https://item.jd.com/11252778.html

第二版,又入手了。

《Effective Java中文版(第2版)》https://item.jd.com/10058902.html

你是否正在寻找一本能够更加深入地了解Java编程语言的书,以便编写出更清晰、更正确、更健壮且更易于重用的代码。不用找了!本书为我们带来了共78条程序员必备的经验法则,针对你每天都会遇到的编程问题提出了有效、实用的解决方案。

无脑推荐吧,因为看完之后真的挺好。

《重构 改善既有代码的设计》https://item.jd.com/11728740.html

凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构本身,业界对重构的理解,还是开发工具对重构的支持力度,都与本书出版时不可同日而语,但书中所蕴涵的意味和精华,依然值得反复咀嚼,而且往往能够常读常新。

虽然不是每一条都适合自己,但总有指导意义的,选择喜欢的方式,开始愉快的重构吧,因为重构可以让你轻松应对各种需求变更。

《Java并发编程的艺术》https://item.jd.com/11740734.html

从JDK源码、JVM、CPU等多角度全面剖析和讲解Java并发编程的框架、原理和核心技术,采用循序渐进的讲解方式,从并发编程的底层实现机制入手,逐步介绍了在设计Java并发程序时各种重要的技术、设计模式与应用,同时辅以丰富的示例代码,使得开发人员能够更快地领悟Java并发编程的要领,围绕着Java平台的基础并发功能快速地构建大规模的并发应用程序。

说实在的,这本书当时看得我高潮迭起,原来了解并发的底层实现原理之后可以这么痛快,收获良多。

《Java并发编程实战》https://item.jd.com/10922250.html

深入浅出地介绍了Java线程和并发,从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。

看完《Java并发编程的艺术》之后,立马又入手了此书,真的是相见恨晚。

《大型网站系统与Java中间件实践》https://item.jd.com/11449803.html

围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍,从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁;

对于没有大型网站系统开发经验的同学来说,这确实是个福利,可以稍微的了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型网站的 Java 中间件的实践经验。

《大型分布式网站架构设计与实践》https://item.jd.com/11529266.html

和《大型网站系统与Java中间件实践》类似吧,我觉得。

《Java性能权威指南》https://item.jd.com/11896988.html

市面上介绍Java的书有很多,但专注于Java性能的并不多,能游刃有余地展示Java性能优化难点的更是凤毛麟角,本书即是其中之一。通过使用JVM和Java平台,以及Java语言和应用程序接口,本书详尽讲解了Java性能调优的相关知识,帮助读者深入理解Java平台性能的各个方面,使程序如虎添翼。

说实在的,看这本书,前前后后翻了很多次也没翻完,慢慢来吧,毕竟性能优化这条路也是很漫长的。

《HotSpot实战》https://item.jd.com/11414422.html

“蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇蟮之穴无可寄托者,用心躁也”。对于技术人员来说,如果长期忽略自身技术的根基而去一昧地追求高层框架技术,这无疑是舍本求末的做法。

我为什么会买这本书?前段时间手撕HotSpot的大部分源码,包括虚拟机启动,虚拟机参数解析,类加载,对象创建过程,YGC和FGC的实现,过程很痛苦,后来发现了此书,就入手看看和自己的理解是否有出入,以免一条道走到黑。

《垃圾回收的算法与实现》https://item.jd.com/12010270.html

Ruby之父松本行弘推荐:上古传承之魔法,彻底揭开垃圾回收的秘密!

此书很新,在我手撕了HotSpot的GC部分源码之后,觉得可以入手看看大神是如何理解垃圾回收算法的。

《Lucene实战(第2版)》https://item.jd.com/10661841.html

适合于已具有一定java编程基本的读者,以及希望能够把强大的搜索功能添加到自己的应用程序中的开发人员

当时因为项目需要,才入手了此书。

《编程珠玑》https://item.jd.com/11642529.html

历史上伟大的计算机科学著作之一

融深邃思想、实战技术与趣味轶事于一炉的奇书

带你真正领略计算机科学之美

阅读此书,难,难,难,只有在兴趣来临时翻两页....

源码

源码这种东西,看的快,忘的也快,最好的方法是学会整理,把资料整理成自己的知识。

好多人觉得JDK源码太多,无从下手,经常半途而非,以我的经验来说,最好的方法是当你在项目中用到了某个类,可以利用空闲时间去研究,当然这是在感兴趣的前提下,比如简单ArrayList是如何实现的,StringBuilder和StringBuffer有什么区别,HashMap的实现原理,带着问题去分析,从简单的类开始循序渐进,同时在分析过程中能够用自己的语言整理出来,就像一开始我写过关于ArrayList的文章《Java Collections Framework - ArrayList》http://www.jianshu.com/p/4b7aa8a022ba,虽然内容很简单,但也算是一种尝试,至少可以写出来了,不管效果如何,剩下的只剩坚持了,自己尝试写过之后,可以加深理解和记忆。

看源码的时候,可以给自己定几个目标,毕竟一口吃不成胖子,只能慢慢的啃,路是走出来的,通过debug一步一步的走下去。

1、数据结构相关的类,如String、ArrayList,LinkedList,HashMap和ConcurrentHashMap等等。

2、线程并发相关的类,如Synchronized、ReentrantLock、ReadWriteLock、AQS和线程池的实现等。

如果一个类的实现很复杂,比如ConcurrentHashMap,就可以试着拆分成几个模块进行分析

深入浅出ConcurrentHashMap(1.8)http://www.jianshu.com/p/c0642afe03e0

谈谈ConcurrentHashMap1.7和1.8的不同实现http://www.jianshu.com/p/c0642afe03e0

ConcurrentHashMap的红黑树实现分析http://www.jianshu.com/p/23b84ba9a498

深入分析ConcurrentHashMap1.8的扩容实现http://www.jianshu.com/p/f6730d5784ad

如果看到后面已经不满足于JDK层面的实现原理了,可以尝试着看看HotSpot的源码,比如Synchronized关键字如何实现,String常量池如何实现,类对象如何创建,只要能想到的,都可以从源码中找到答案,答案就在那里,就看你能不能找到。

深入分析String.intern和String常量的实现原理http://www.jianshu.com/p/c14364f72b7e

深入分析synchronized的JVM实现http://www.jianshu.com/p/c5058b6fe8e5

深入分析Object.wait/notify实现机制http://www.jianshu.com/p/f4454164c017

如何查看HotSpot VM的运行时数据http://www.jianshu.com/p/a28ae76ac3b4

深入分析Object.finalize方法的实现原理http://www.jianshu.com/p/9d2788fffd5f

框架

曾有人说,你干嘛那么纠结于底层的实现,工作上又用不到了,有这时间还不如多看看框架之类的,我只能呵呵以对,框架固然重要,但是框架是会更新,会变的,而底层原理可以长久不衰,当你了解了一些JDK的底层实现,在阅读框架源码时,可以更加的得心应手。

以自己为例,由于项目需要,加上对高性能和多并发比较感兴趣,看过比较多的Netty源码,记得刚开始研究Netty源码,也是一筹莫展,后来从NIO入手,写了 《深入浅出NIO Channel和Buffer》http://www.jianshu.com/p/052035037297,都是一些概念性的东西,自己写一遍是为了加深理解,后来不满足JDK中的socket实现,就尝试到处找资料,于是写了 《深入浅出NIO Socket实现机制》http://www.jianshu.com/p/0d497fe5484a,有了这些基础之后,再尝试Netty,写了《Netty入门简介》http://www.jianshu.com/p/1123c9164e3e,后来基于Netty写了个简单的服务,通过debug的方式,把Netty服务的启动、请求的accept、read和write调试了N遍,这N遍过程其实还是需要耐心的,于是才有了如下的文章:

Netty源码分析之服务启动http://www.jianshu.com/p/e577803f0fb8

Netty源码分析之NioEventLoophttp://www.jianshu.com/p/9acf36f7e025

Netty源码分析之ChannelPipelinehttp://www.jianshu.com/p/3876874306d5

Netty源码分析之accept过程http://www.jianshu.com/p/ffc6fd82e32b

深入浅出Netty readhttp://www.jianshu.com/p/6b48196b5043

深入浅出Netty writehttp://www.jianshu.com/p/1ad424c53e80

深入浅出Netty内存管理 PoolChunkhttp://www.jianshu.com/p/c4bd37a3555b

深入浅出Netty内存管理 PoolSubpagehttp://www.jianshu.com/p/d91060311437

深入浅出Netty内存管理 PoolChunkListhttp://www.jianshu.com/p/a1debfe4ff02

深入浅出Netty内存管理 PoolArenahttp://www.jianshu.com/p/4856bd30dd56

深入浅出MappedByteBufferhttp://www.jianshu.com/p/f90866dcbffc

对源码熟悉了之后,可以尝试挖掘在框架中使用了哪些设计模式,框架的设计结构又是如何的,每一次实践都是一次进步,关键在于如何迈出第一步。

Java这条道,还有很长的路要走,共勉!

上一篇下一篇

猜你喜欢

热点阅读