【转】成为Java顶尖程序员 ,看这10本书就够了

“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处:

\
1.能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料
2.对着书上的代码自己敲的时候方便
“看完书之后再次提升自我的最好途径是看一些相关的好博文“,我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自己的学习方法,就不再扯下去了。
很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书(每本书的作者会加粗标红),其中绝大多数都是我自己平时在看的书,也算是我对于平时读的书做一个小总结和读后感吧。
首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life。
目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客。这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是:
1、随便开篇点明该设计模式的定义
2、图文并茂讲解该设计模式中的结构
3、以详细的代码形式写一下该种设计模式的实现
4、补充内容
5、讲解该设计模式的优缺点
对于一个设计模式我们关注、学习的知识点,不就是上面这些吗?
不 过我要重点提醒一下网友们,同一种设计模式的写法有多种,并不是说只有按某种写法来写才是这种设计模式。比方说适配器模式,我们关注适配器模式一定要关注 的是什么是适配器模式不是怎么写适配器模式,不要认为某段代码不是按照适配器模式的写法写下来的它就不是适配器模式了,记住这一点,你在学习设计模式的时 候一定会对代码中用到的设计模式有更深入的理解。
《Effective Java中文版》
\
这是唯一一本我没有买的书。初识这本书,是在我的博文Java代码优化(长期更新)里面,底下评论的时候有朋友提到了这本书,当时我说要去买,不过这两个月一直都没时间去逛书店,甚是遗憾,之后肯定会找时间去买这本书的。
《Effective Java中文版》的作者是Joshua Bloch,这个人就很厉害了,他是谷歌的首席架构师,属于超级技术大牛级别了吧,呵呵。由于没有看过这本书,所以我不好发表评论,但是从这本书的知名度 以及其作者的来头来看(多提一句,这本书也是Java之父James Gosling博士推崇的一本书),我相信这一定是一本值得一看的好书。
好 的代码是每个Java程序员都应该去追求的,不是说我今天写一段好代码相比写一段烂代码对性能会有多大的提升,更多的应该是提升了代码的可读性以及可以规 避许多潜在的、未知的问题,避免代码上线之后出问题而花时间去维护—-无论从时间成本、人力成本还是风险成本来说,这都是非常高的。

  《实战Java虚拟机:JVM故障诊断与性能优化》
25612fm立体图
如果你不满足于做一个只会写if…else…的Java程序员,而是希望更进一步,我随便举几个例子吧:
1、了解Java代码的底层运行机制
2、定位性能问题
3、对整个系统进行性能调优
4、解决各种奇奇怪怪的线上线下问题
那 么Java虚拟机是你必学的一门技术。《实战Java虚拟机:JVM故障诊断与性能优化》写的很入门,技术也最新,新手也能看得懂,如果有java技术瓶颈的,看完会豁然开朗。
《HotSpot实战》
\
所有的Java虚拟机都是遵循着Java虚拟机规范来的,市面上的Java虚拟机几十款,《实战Java虚拟机:JVM故障诊断与性能优化》一书里面讲的虚拟机并不针对某种特定的虚拟机,而是从Java虚拟机规范的角度来讲解Java虚拟机。
我们平时使用的乃至商用的大多数Java虚拟机都是Sun公司的HotSpot,大家cmd进入命令行,使用”java -version”命令就可以看到了。如果希望在Java虚拟机规范的基础上更加深入地去理解虚拟机的一些细节是怎么实现的,就可以看一下《HotSpot实战》一书,作者是陈涛。不过由于HotSpot的源码都是C/C++写的,所以要求读者有非常好的C/C++基础,如果对这两门语言不是很熟悉的朋友,看这本书可能对你帮助不是很大。
最后提一句,如果有兴趣的朋友,不妨先去网上下载一个openJDK,HotSpot的源码就在里面。
《实战Java高并发程序设计》
javabing
这本书是目前点评推荐比较多的书,其特色是:
1、案例小,好实践
2、代码有场景,实用。
无论如何,并发已经成为多核时代的趋势,还是一定要推荐给大家的。
《java多线程编程核心技术》
\
《Java多线程编程核心技术》作者高洪岩。想要学习多线程的朋友,这本书是我大力推荐的,我的个人博客里面二十多篇的多线程博文都是基于此书,并且在这本书的基础上进行提炼和总结而写出来的。
此书和《Java并发编程实战》 相反,这本书的特点是大篇幅的代码+小篇幅的精讲解,可能这和中国人写的书比较偏向实用主义的风格有关。本书关于线程安全、synchronized、 Reentrant、Timer等等都用详细的代码进行了讲解,而且每个大知识点下的多个小知识点都会详细讲解到,非常有实践价值。
有兴趣的朋友们,我相信只要你们跟着这本书里面的代码敲、运行、思考,三步走,对于多线程的使用与理解一定会进几大步。
不 过这本书的缺点就是对于Java并发包下的一些类像CountDownLatch、Semphore、CyclicBarrier、Future、 Callable等都没有讲到,重点的CAS和AQS也没有触及,重点类的实现原理也没有提。当然,这很深入了,在学习了这本书之后如果能再去对这些知识 进行一些学习、研究的话,你一定会慢慢成长为一个很厉害的多线程高手。
《深入分析Java Web技术内幕》
\
《深入分析Java Web技术内幕》,作者许令波,淘宝工程师。
这本书我用一个字概括就是:全。真的非常全,HTTP、DNS、CDN、静态化、Jetty、Tomcat、Servlet、Spring、MyBatis等等,什么都有,涉及知识面非常广,但又不像专门精讲某个知识点的书籍一样讲得非常深入,感觉这本书就是尽量去用短的篇幅讲清楚一些Java Web使用到的技术的内幕,让读者对这些知识点的技术内幕有一个理性的认识。
不过,尽管每个知识点的篇幅都不多,但是重点都基本讲到了,是一本让人真正有收获的书。如果想进一步了解这些技术的技术内幕,就要自己去买相关书籍或者自己上网查资料了,有种抛砖引玉,或者说师傅领进门、修行在个人的感觉。
《大型网站技术架构 核心原理与案例分析》
\
一个字评价这本书,屌;两个字评价这本书,很屌;三个字评价这本书,非常屌。呵呵,好了,再说下去可能别人以为我是水军了。
《大型网站技术架构 核心原理与案例分析》的作者是李智慧,原阿里巴巴技术专家。
Java 的大多数应用都是用在Web上的,现在只要稍微大型一点的Web应用,都一定是一个分布式系统,那么一个分布式系统用到了哪些技术?一个大型网站是如何从 一个小型网站成长起来的?如何保证你的网站安全?分布式系统使用到了缓存,有哪些缓存?缓存的使用有哪些值得注意的事项?
关 于分布式的知识点,都在这本书里面有体现,只有你想不到,没有他写不到,而且写得非常易懂,基本属于看一两遍,再记一些笔记就知道是怎么一回事儿了。多看 几遍,对分布式的理解一定会加深不少。而且里面不仅仅是分布式的知识,还非常接地气地写了如何做一个好的架构师,其实我认为这不仅仅是写给想做架构师的读 者看的,就是给读者一些建议,如何更好地提出意见、如何更让别人关注你的声音、如何看到他人的优点,入木三分,让人获益匪浅。
《大型网站系统与Java中间件实践》
\
《大型网站系统与Java中间件实践》作者曾宪杰,是淘宝的技术总监,算起来应该在阿里有至少P8的级别了吧。
这本书的部分内容和上面一本李智慧的《大型网站技术架构 核心原理与案例分析》有所重合,像分布式系统的演化、CDN、CAP理论和BASE理论等等,这也更说明这些都是分布式系统或者说是一个大型网站重点关注的内容,当作一次再学习也不错。
本书要突出的重点是中间件三个字,中间件是分布式系统中一个非常重要的东西,其最重要的作用应该就是解耦,降低模块与模块之间的强依赖,不同的模块之间的依赖度降低,便可以各自独立地开发自己的功能,这也可以说是软件工程发展的目标和驱动力。
因此,本书有一部分的内容就是基于中间件,详细讲解了中间件与JMS的各种知识,适合对分布式系统比较熟悉并且想要往中间件方面有一定研究的读者。
《从Paxos到ZooKeeper 分布式一致性原理与实践》
\
《从Paxos到ZooKeeper 分布式一致性原理与实践》,作者倪超,阿里巴巴工程师。
这本书是我最近在研读的一本书,和上面的《大型网站系统与Java中间件实践》一样,属于分布式组件的范畴,属于有些深入的内容,当然也是我自己的个人兴趣。当然,如果有志向做一个出色的大型网站架构师、公司的技术总监之类,这些知识当然是必须掌握的。
本书从分布式系统基本理论开始讲起,讲到Paxos算法,最后慢慢引入到Zookeeper,循序渐进。当然,更多的我目前还不方便发表什么看法,因为这本书的第二张Paxos算法我都还没有弄懂(Paxos算法确实有些难以理解和不太易懂),接下来的章节还没有看下去。
如果网友们所在的公司在使用Zookeeper,并且你又对Zookeeper感兴趣想要研究一下它的原理的,这本书将是不二之选。
《Spring源码深度解析》
\
《Spring源码深度解析》,作者郝佳。
Spring 这个框架做得太好了,功能太强大了,以至于很多开发者都只知Spring,不知什么是工厂、什么是单例、什么是代理(我面试别人的真实体会)。这种功能强 大的框架内部一定是很复杂的实现,这就导致一旦你的程序使用Spring,出了问题,可能是Error、可能是Exception、可能是程序运行结果不 是你的预期的,出现诸如此类问题的时候,将会让你感到困惑,除了上网查资料或者问别人似乎没有更好的解决办法。
研读Spring的源代码不失为一种很好的学习方法,我个人认为这有很多好处:
1、理解框架内部的实现之后,可以主动去解决问题,而不需要依赖别人
2、Spring框架内部实现用到了很多设计模式,很好的代码设计思路,这将会对你写代码、对你理解设计模式有很大的提高
3、研究Spring框架将会大大增强你读代码的能力,我相信只要你能研究清楚Spring内部是如何实现的,其他任何一个框架的源代码都难不倒你
总而言之,我认为读代码的能力是一个普通的程序员和一个好的程序员之间最大的差别之一,前者只会把别人写好的东西拿来用,后者不仅能用好,还清楚知道别人写好的东西底层是如何实现的,在出现问题的时候可以轻松解决。
Spring源代码,个人推荐《Spring源码深度解析》一书,真要研究透并且写清楚Spring源代码,恐怕三四本书都不够,作者在近400页的篇幅中尽量去讲解Spring源代码是如何实现的,殊为不易,尽管无法讲得完全,但是相信作者的讲解配合上读者自己的研究,一定可以对Spring的实现有更深度的理解。

转载于:https://www.cnblogs.com/love-jishu/p/5113485.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“睡服”面试官系列第二十一篇之class基本语法(建议收藏学习)

目录 1. 简介 2. 严格模式 3. constructor 方法 4. 类的实例对象 5. Class 表达式 6. 不存在变量提升 7. 私有方法 8. 私有属性 9. this 的指向 10. name 属性 11. Class 的取值函数(getter)和存值函数(setter) 12. Cl…

08 | 栈:如何实现浏览器的前进和后退功能?

栈 后进者先出,先进者后出,这就是典型的“栈”结构。栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。 为什么要使用到“栈”这种操作受限的数据结构? 事实上,从功能上来说,数组或链表确实可…

关于tag,viewWithTag

iOS SDK内置了一套搜寻机制,可通过tag来查找子视图。 **苹果公司很少给子视图设置tag.笔者所知范围的唯一例外出现在UIAlertView中,该类会给按钮分别设置值为1、2的标签 viewWithTag:可以在某视图的所有下属中根据tag来查找相关的子视图。 ** 假如有多个…

09 | 队列:队列在线程池等有限资源池中的应用

队列定义 先进者先出,这就是典型的“队列”。队列跟栈一样,也是一种操作受限的线性表数据结构。 顺序队列和链式队列 顺序队列:用数组实现的队列// 用数组实现的队列 public class ArrayQueue {// 数组:items,数组大…

“睡服”面试官系列第二十二篇之class的继承(建议收藏学习)

目录 1. 简介 2. Object.getPrototypeOf() 3. super 关键字 4. 类的 prototype 属性和__proto__属性 4.1extends 的继承目标 4.2实例的 __proto__ 属性 5. 原生构造函数的继承 6. Mixin 模式的实现 1. 简介 Class 可以通过 extends 关键字实现继承,这比 ES…

PICT实现组合测试用例

成功安装后,在命令行中输入命令pict: 可以看到pict命令的一些选项:/o:N 组合数,默认值为2,即pict生成的测试用例集中每条测试数据会有两个值与其他测试集是不同的;/d:C 值与值之间的分隔符,…

10 | 递归:如何用三行代码找到“最终推荐人”?

什么是递归? 递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。 去的过程叫“递”,回来的过程叫“归” 场景 周末你带着女…

前端学习(1723):前端系列javascript之uniapp语法下

<template><view><view v-if"show">uniapp</view><view>geyao</view><view v-for"item in items">{{item}}</view><view v-on:click"onClick(uni-app)">点击</view></view> …

瑞星杀毒软件、奇虎360杀毒软件、360卫士、百度卫士联手,搞不定弹出广告 amp; 恶意广告图标...

一位网友说他的电脑近期出了问题&#xff1a;开机后桌面和任务栏上的高速启动栏会出现恶意图标。删除了下次开机又会出现&#xff1b;使用电脑过程中每分钟都会弹出广告。他为电脑安装了瑞星杀毒软件、奇虎360杀毒软件、360卫士、百度卫士。以及广告神盾&#xff0c;都不能解决…

11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?

划重点&#xff1a;特定算法是依赖特定的数据结构的&#xff0c;带着问题去学习&#xff0c;是最有效的学习方法 本节分析冒泡排序、插入排序、选择排序三种排序算法 如何分析一个排序算法&#xff1f; 分析一个排序算法&#xff0c;要从以下几个方面入手&#xff1a; 排序算…

12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?

算法对比&#xff1a; 算法时间复杂度适合场景冒泡排序、插入排序、选择排序O(n2)小规模数据归并排序、快速排序O(nlogn&#xff09;大规模数据 归并排序和快速排序都用到了分治思想&#xff0c;非常巧妙。我们可以借鉴这个思想&#xff0c;来解决非排序的问题&#xff0c;比如…

C风格字符串与C++风格字符串

C风格字符串与C风格字符串 C风格字符串&#xff1a;对字符串进行操作的 C 函数定义在头文件<cstring>中&#xff1b; 1. 字符串定义&#xff1a;char* result&#xff1b; 2. 字符串的最后一个字符是null字符&#xff08;\0&#xff09;&#xff0c;可以通过这个字符确定…

13 | 线性排序:如何根据年龄给100万用户数据排序?

三种时间复杂度是 O(n) 的排序算法&#xff1a;桶排序、计数排序、基数排序。因为这些排序算法的时间复杂度是线性的&#xff0c;所以我们把这类排序算法叫作线性排序&#xff08;Linear sort&#xff09;。之所以能做到线性的时间复杂度&#xff0c;主要原因是&#xff0c;这三…

前端学习(1728):前端系列javascript之状态栏分析

<template><view class"content"><view class"todo-header"><view class"todo-header_left"><text class"active-text">全部</text><text>10条</text></view><view class&q…

接口Interface和抽象类abstract class的区别

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制&#xff0c;正是由于这两种机制的存在&#xff0c;才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性&#xff0c;甚至可以相互替换&#x…

MySQL索引知识复习

在你享受工作舒适的同时&#xff0c;你的危机也已经在慢慢靠近 正确的创建合适的索引才是保证数据库性能保证的基础 1、索引的底层数据结构&#xff1a;hash&#xff0c;b树&#xff0c;b树的区别&#xff0c;逐层分析为什么最后选用了b树作为索引结构&#xff1f; Mysql数据…

前端学习(1729):前端系列javascript之内容卡片布局

<template><view class"content"><view class"todo-header"><view class"todo-header_left"><text class"active-text">全部</text><text>10条</text></view><view class&q…

JAVA可阻塞队列-ArrayBlockingQueue

在前面的的文章&#xff0c;写了一个带有缓冲区的队列&#xff0c;是用JAVA的Lock下的Condition实现的&#xff0c;但是JAVA类中提供了这项功能&#xff0c;就是ArrayBlockingQueue, ArrayBlockingQueue是由数组支持的有界阻塞队列&#xff0c;次队列按照FIFO&#xff08;先进先…

面试必问之JVM

Java的一次编译到处运行背后&#xff1a;JVM从软件层面屏蔽了底层硬件、指令字节码的细节&#xff08;JVM充当了适配器的角色和功能&#xff09; JVM\JDK\JRE关系 2、JVM运行时数据区 所有学过的知识是用来推导新的未知的知识的&#xff0c;踏入社会要学会运用自己的知识能力去…