工作十年,分享看过的优质 Java 书籍

在我遇到《Head First Java》之前,如果你要我推荐 Java 技术书,我会毫不犹豫地推荐《Java 编程思想》和《Java 核心技术卷》,因为大家都说好嘛,我只能“同流合污”了(强颜欢笑);但换成是现在的话,我会优先推荐《Head First Java》。

尽管《Head First Java》也非常的厚,至少比我的脸皮后,但趣味性就要甩前面两本好几条街了。这年头,大家都没时间读枯燥的技术书,尤其是厚的。上一张图大家感受一下《Head First Java》的调皮吧。

前九章:包括 “Java 程序设计概述”、“Java 程序设计环境”、“Java 的基本程序设计结构”、“对象与类”、“继承”、“接口”、“lambda 表达式与内部类”、“异常”、“断言和日志”、“泛型程序设计”、“集合”。这九章讲述的是 Java 基础知识点,是 Java 程序员必须要掌握的内容,所以必看。

第十到第十二章:讲的是 AWT 和 Swing,个人感觉这部分内容属于不需要再学的 Java 知识点。当然了,窗口编程涉及到的“事件驱动-监听-方法回调”的机制蛮重要的,需要掌握,但和 AWT 和 Swing 的关联度不大。就好像,我们取钱直接去招商银行,没必要把招商银行的钱转到工商银行再取出来。

第十三章:讲的是应用部署和 Applet,显然 Applet 也没必要学了。出版 没有把这部分内容删掉,纯粹是为了让这本书变得更笨重(定价就高了)。

第十四章:并发编程。这也是 Java 学习过程中最难的一块之一,另外一难是 Java 虚拟机。但这是初级程序员迈向高手的必经之路。

整体上来讲,《Java核心技术卷一》非常值得一读,广度和深度都恰到好处。强烈推荐。

我知道,有些同学因为工作时间的原因,一直没有时间读书。像《Java核心技术卷一》这样厚得像特朗普的脸皮一样的书,更是没有时间读了。不过,不要担心,二哥替大家解决了这个烦恼,我用了一个月的时间把这本书完整地读了一遍,并写了 9 篇高质量且通俗易懂的文章,供大家作为参考。

先来通过思维导图看一下这 9 篇 Java 核心技术博文涉及到的内容。

这本书在豆瓣的评分高达 9.1 分,但我总觉得有点虚高。

记得刚上大学那会,就在某宝上买了一本影印版的《Java 编程思想》,但由于初学 Java,对编程极度缺乏信心,导致看这本书有一种看天书的感觉。后来,去苏州参加工作的时候把它作为最宝贵的纪念品带了过去。

2014 年回洛阳的时候把它送给了一位关系还不错的同事,权当是分别的礼物吧。2016 年的时候,我又重新买了一本,希望自己能够夯实一下基础。但事与愿违,它被我束之高阁了,读起来无比的枯燥。2018 年的时候,我重新捧起它读了一遍,总觉得有一种莫名的负罪感。

《Java 编程思想》是个大部头,足足 880 页,文字更是密密麻麻。我不建议大家一个字一个字的读,知晓其中的精华就可以了。如果你觉得这本书读起来很痛苦,不妨来读一读我加工润色后分享博文,足足 25 篇,每一篇都很精彩。

先来通过思维导图看一下这 25 篇 Java 博文涉及到的知识点。

这本书的所有源代码已经开源在 GitHub,传送门:

https://github.com/BruceEckel/OnJava8-Examples

如果英语水平像我一样菜,看英文版比较费劲,可以在 GitHub 上查看大婶们的译本,传送门:

https://github.com/LingCoder/OnJava8

如果英语水平还不错,可以自行购买电子版的《On Java 8》,虽然比较贵。

第四本,《Effective Java》

《Effective Java》除了翻译让众多 Java 程序员诟病之外,再没有任何缺点了(有读者戏称:“这本书为翻译们作出了杰出的表率”)。其目标是帮助 Java 程序员更加有效地使用 Java 编程语言及其基本类库,主要涉及到 、、 包下面的类。

工作十年,分享看过的优质 Java 书籍

《Effective Java》第三版一共包含了 90 条极具实用价值的经验规则,每条规则都值得 Java 程序员在实战中去参照。这本书不需要按部就班地从头到尾读,可以随意挑选任意小节进行阅读,因为每条规则相对都是独立的,尽管它们之间会交叉引用,但并不妨碍我们随心所欲地阅读。

我这里整理了一份第三版的中文在线翻译文档,大家可以参照一下。

  • 01. 考虑使用静态工厂方法替代构造方法.md
  • 02. 当构造方法参数过多时使用builder模式.md
  • 03. 使用私有构造方法或枚类实现Singleton属性.md
  • 04. 使用私有构造方法执行非实例化.md
  • 05. 使用依赖注入取代硬连接资源(hardwiring resources).md
  • 06. 避免创建不必要的对象.md
  • 07. 消除过期的对象引用.md
  • 08. 避免使用Finalizer和Cleaner机制.md
  • 09. 使用try-with-resources语句替代try-finally语句.md
  • 10. 重写equals方法时遵守通用约定.md
  • 11. 重写equals方法时同时也要重写hashcode方法.md
  • 12. 始终重写 toString 方法.md
  • 13. 谨慎地重写 clone 方法.md
  • 14. 考虑实现Comparable接口.md
  • 15. 使类和成员的可访问性最小化.md
  • 16. 在公共类中使用访问方法而不是公共属性.md
  • 17. 最小化可变性.md
  • 18. 组合优于继承.md
  • 19. 如使用继承则设计,应当文档说明,否则不该使用.md
  • 20. 接口优于抽象类.md
  • 21. 为后代设计接口.md
  • 22. 接口仅用来定义类型.md
  • 23. 优先使用类层次而不是标签类.md
  • 24. 优先考虑静态成员类.md
  • 25. 将源文件限制为单个顶级类.md
  • 26. 不要使用原始类型.md
  • 27. 消除非检查警告.md
  • 28. 列表优于数组.md
  • 29. 优先考虑泛型.md
  • 30. 优先使用泛型方法.md
  • 31. 使用限定通配符来增加API的灵活性.md
  • 32. 合理地结合泛型和可变参数.md
  • 33. 优先考虑类型安全的异构容器.md
  • 34. 使用枚举类型替代整型常量.md
  • 35. 使用实例属性替代序数.md
  • 36. 使用EnumSet替代位属性.md
  • 37. 使用EnumMap替代序数索引.md
  • 38. 使用接口模拟可扩展的枚举.md
  • 39. 注解优于命名模式.md
  • 40. 始终使用Override注解.md
  • 41. 使用标记接口定义类型.md
  • 42. lambda表达式优于匿名类.md
  • 43. 方法引用优于lambda表达式.md
  • 44. 优先使用标准的函数式接口.md
  • 45. 明智审慎地使用Stream.md
  • 46. 优先考虑流中无副作用的函数.md
  • 47. 优先使用Collection而不是Stream来作为方法的返回类型.md
  • 48. 谨慎使用流并行.md
  • 49. 检查参数有效性.md
  • 50. 必要时进行防御性拷贝.md
  • 51. 仔细设计方法签名.md
  • 52. 明智审慎地使用重载.md
  • 53. 明智审慎地使用可变参数.md
  • 54. 返回空的数组或集合,不要返回 null.md
  • 55. 明智审慎地返回 Optional.md
  • 56. 为所有已公开的 API 元素编写文档注释.md
  • 57. 最小化局部变量的作用域.md
  • 58. for-each 循环优于传统 for 循环.md
  • 59. 了解并使用库.md
  • 60. 若需要精确答案就应避免使用 float 和 double 类型.md
  • 61. 基本数据类型优于包装类.md
  • 62. 当使用其他类型更合适时应避免使用字符串.md
  • 63. 当心字符串连接引起的性能问题.md
  • 64. 通过接口引用对象.md
  • 65. 接口优于反射.md
  • 66. 明智审慎地本地方法.md
  • 67. 明智审慎地进行优化.md
  • 68. 遵守被广泛认可的命名约定.md
  • 69. 只针对异常的情况下才使用异常.md
  • 70. 对可恢复的情况使用受检异常,对编程错误使用运行时异常.md
  • 71. 避免不必要的使用受检异常.md
  • 72. 优先使用标准的异常.md
  • 73. 抛出与抽象对应的异常.md
  • 74. 每个方法抛出的异常都需要创建文档.md
  • 75. 在细节消息中包含失败一捕获信息.md
  • 76. 保持失败原子性.md
  • 77. 不要忽略异常.md
  • 78. 同步访问共享的可变数据.md
  • 79. 避免过度同步.md
  • 80. executor 、task 和 stream 优先于线程.md
  • 81. 相比 wait 和 notify 优先使用并发工具.md
  • 82. 文档应包含线程安全属性.md
  • 83. 明智审慎的使用延迟初始化.md
  • 84. 不要依赖线程调度器.md
  • 85. 优先选择 Java 序列化的替代方案.md
  • 86. 非常谨慎地实现 Serializable.md
  • 87. 考虑使用自定义的序列化形式.md
  • 88. 保护性的编写 readObject 方法.md
  • 89. 对于实例控制,枚举类型优于 readResolve.md
  • 90. 考虑用序列化代理代替序列化实例.md

我在读这本书的时候,曾写过两篇文章,大家也可以阅读一下。

为什么要将局部变量的作用域最小化br> 面试官:兄弟,说说基本类型和包装类型的区别吧

第五本,《Java 络编程》

《Java 络编程》全面介绍了如何使用

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年11月11日
下一篇 2019年11月11日

相关推荐