在Java路上,我看过的一些书、源码和框架(转)
原文地址:http://www.jianshu.com/p/4a41ee88bd82
物有本末,事有终始,知所先后,则近道矣

面试经历
关于Java面试,你应该准备这些知识点
关于Java面试,你应该准备这些知识点(续)
前段时间抽空整理了上面两篇面试经历,收到不少的关注,很多同学私信我平时都是如何get到这些知识的,是否有一些相关的书单,Java的源码太多了,应该如何看,框架的代码应该如何阅读等等问题。
现在想想,似乎以前也这样迷茫过,没有明确的方向,做过后端,做过前端,就因为啃完了一整本《JavaScript高级程序设计》,在面试的时候信誓旦旦说只做前端,不写后端代码。直到后来,碰巧有机会让我重新捡起Java,很感激有这次机会,也慢慢的明确了自己的方向。
我喜欢在拿到书的那一刻就写下当天的日期,方便以后可以知道这本书是何时买的,不知不觉中已经买了很多Java相关的书,同时也收获了很多。
书单
一直以来,这本书都被认为是面向Java程序员的经典教程和参考书,内容翔实、客观准确,不拖泥带水,与《Java编程思想》齐名。
推荐作为Java的入门书籍,记得这是当时入手的第一本书,爱护有加,毕竟贵啊。

感受设计演变过程中所蕴含的大智慧,体会乐与怒的程序人生中值得回味的一幕幕。
推荐作为设计模式的入门书籍,里面的实现的代码都是基于Java的,通过很生动的方式讲解了23中设计模式,但是设计模式的思想和精髓,还是需要在平时项目中慢慢领会以及运用。

深入剖析Tomcat4和Tomcat5中的每个组件,并揭示其内部工作原理,从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。
当时也不知道为什么会买这本书,功力不足,啃了很多遍也没有啃完,似乎已经找不到这本书了...

周志明老师的第一版书,JVM入门经典之作,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。
这是入手的第一本关于JVM的书籍,当时看了前面几章节,感觉自己在学习几年的Java白学了...前前后后啃了很多遍,因为看完会忘记

- 《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》
第二版,又入手了。

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

凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构本身,业界对重构的理解,还是开发工具对重构的支持力度,都与本书出版时不可同日而语,但书中所蕴涵的意味和精华,依然值得反复咀嚼,而且往往能够常读常新。
虽然不是每一条都适合自己,但总有指导意义的,选择喜欢的方式,开始愉快的重构吧,因为重构可以让你轻松应对各种需求变更。

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

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

围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍,从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁;
对于没有大型网站系统开发经验的同学来说,这确实是个福利,可以稍微的了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型网站的 Java 中间件的实践经验。

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

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

“蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇蟮之穴无可寄托者,用心躁也”。对于技术人员来说,如果长期忽略自身技术的根基而去一昧地追求高层框架技术,这无疑是舍本求末的做法。
我为什么会买这本书?前段时间手撕HotSpot的大部分源码,包括虚拟机启动,虚拟机参数解析,类加载,对象创建过程,YGC和FGC的实现,过程很痛苦,后来发现了此书,就入手看看和自己的理解是否有出入,以免一条道走到黑。

Ruby之父松本行弘推荐:上古传承之魔法,彻底揭开垃圾回收的秘密!
此书很新,在我手撕了HotSpot的GC部分源码之后,觉得可以入手看看大神是如何理解垃圾回收算法的。

适合于已具有一定java编程基本的读者,以及希望能够把强大的搜索功能添加到自己的应用程序中的开发人员
当时因为项目需要,才入手了此书。

历史上伟大的计算机科学著作之一
融深邃思想、实战技术与趣味轶事于一炉的奇书
带你真正领略计算机科学之美
阅读此书,难,难,难,只有在兴趣来临时翻两页....

源码
源码这种东西,看的快,忘的也快,最好的方法是学会整理,把资料整理成自己的知识。
好多人觉得JDK源码太多,无从下手,经常半途而非,以我的经验来说,最好的方法是当你在项目中用到了某个类,可以利用空闲时间去研究,当然这是在感兴趣的前提下,比如简单ArrayList是如何实现的,StringBuilder和StringBuffer有什么区别,HashMap的实现原理,带着问题去分析,从简单的类开始循序渐进,同时在分析过程中能够用自己的语言整理出来,就像一开始我写过关于ArrayList的文章《Java Collections Framework - ArrayList》,虽然内容很简单,但也算是一种尝试,至少可以写出来了,不管效果如何,剩下的只剩坚持了,自己尝试写过之后,可以加深理解和记忆。
看源码的时候,可以给自己定几个目标,毕竟一口吃不成胖子,只能慢慢的啃,路是走出来的,通过debug一步一步的走下去。
1、数据结构相关的类,如String、ArrayList,LinkedList,HashMap和ConcurrentHashMap等等。
2、线程并发相关的类,如Synchronized、ReentrantLock、ReadWriteLock、AQS和线程池的实现等。
如果一个类的实现很复杂,比如ConcurrentHashMap,就可以试着拆分成几个模块进行分析
深入浅出ConcurrentHashMap(1.8)
谈谈ConcurrentHashMap1.7和1.8的不同实现
ConcurrentHashMap的红黑树实现分析
深入分析ConcurrentHashMap1.8的扩容实现
如果看到后面已经不满足于JDK层面的实现原理了,可以尝试着看看HotSpot的源码,比如Synchronized关键字如何实现,String常量池如何实现,类对象如何创建,只要能想到的,都可以从源码中找到答案,答案就在那里,就看你能不能找到。
深入分析String.intern和String常量的实现原理
深入分析synchronized的JVM实现
深入分析Object.wait/notify实现机制
如何查看HotSpot VM的运行时数据
深入分析Object.finalize方法的实现原理
框架
曾有人说,你干嘛那么纠结于底层的实现,工作上又用不到了,有这时间还不如多看看框架之类的,我只能呵呵以对,框架固然重要,但是框架是会更新,会变的,而底层原理可以长久不衰,当你了解了一些JDK的底层实现,在阅读框架源码时,可以更加的得心应手。
以自己为例,由于项目需要,加上对高性能和多并发比较感兴趣,看过比较多的Netty源码,记得刚开始研究Netty源码,也是一筹莫展,后来从NIO入手,写了 《深入浅出NIO Channel和Buffer》,都是一些概念性的东西,自己写一遍是为了加深理解,后来不满足JDK中的socket实现,就尝试到处找资料,于是写了 《深入浅出NIO Socket实现机制》,有了这些基础之后,再尝试Netty,写了《Netty入门简介》,后来基于Netty写了个简单的服务,通过debug的方式,把Netty服务的启动、请求的accept、read和write调试了N遍,这N遍过程其实还是需要耐心的,于是才有了如下的文章:
Netty源码分析之服务启动
Netty源码分析之NioEventLoop
Netty源码分析之ChannelPipeline
Netty源码分析之accept过程
深入浅出Netty read
深入浅出Netty write
深入浅出Netty内存管理 PoolChunk
深入浅出Netty内存管理 PoolSubpage
深入浅出Netty内存管理 PoolChunkList
深入浅出Netty内存管理 PoolArena
深入浅出MappedByteBuffer
对源码熟悉了之后,可以尝试挖掘在框架中使用了哪些设计模式,框架的设计结构又是如何的,每一次实践都是一次进步,关键在于如何迈出第一步。

Java这条道,还有很长的路要走,共勉!
在Java路上,我看过的一些书、源码和框架(转)的更多相关文章
- Java编程思想第四版随书源码官方下载方法
见不少人在找net.mindview.util.Print,CSDN上有下载,收积分,以下是官网的下载方法,免费: 官网链接:http://mindview.net/ 电子书下载地址:http://w ...
- java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...
- java学习笔记(3)数据类型、源码、反码、补码、精度损失、基本数据类型互相转换
关于java中的数据类型: 1.数据类型的作用是什么? 程序当中有很多数据,每一个数据都是有相关类型的,不同数据类型的数据占用的空间大小不同. 数据类型的作用是指导java虚拟机(JVM)在运行程序的 ...
- Java 序列化和反序列化(二)Serializable 源码分析 - 1
目录 Java 序列化和反序列化(二)Serializable 源码分析 - 1 1. Java 序列化接口 2. ObjectOutputStream 源码分析 2.1 ObjectOutputSt ...
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
概要 前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...
- Java 集合系列07之 Stack详细介绍(源码解析)和使用示例
概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...
- Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...
- java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)
我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...
随机推荐
- [python] 查询mysql返回datetime类型数据的处理
Python 查询Mysql,如果是datetime类型,在json序列化的时候会出现问题. 在网上查了一下,解决方案基本都是遍历dict数据,如果是datetime则转化为字符串. from dat ...
- AGC 002E.Candy Piles(博弈论)
题目链接 \(Description\) 给定\(n\)堆糖,数量分别为\(a_i\).Alice和Bob轮流操作.每次可以吃掉最多的一堆,也可以每堆各吃掉一个.无法操作的人输,求谁能赢. \(n\l ...
- golang单例模式
1.定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问. 2.分类: 懒汉方式:指全局的单例实例在第一次被使用时构建. 饿汉方式:指全局的单例实例在类装载时构建. 3.实现: (1)懒汉方 ...
- Lua脚本性能优化指南
https://github.com/flily/lua-performance/blob/master/Guide.zh.md https://springrts.com/wiki/Lua_Perf ...
- 高质量PHP代码的50个实用技巧:非常值得收藏
http://www.finalshares.com/read-497?qq-2488
- 判断浏览器的类型$_SERVER['HTTP_USER_AGENT']和语言$_SERVER['HTTP_ACCEPT_LANGUAGE']
判断浏览器类型: $_SERVER["HTTP_USER_AGENT"] 判断浏览器类型的具体程序如下: <?php if(strpos($_SERVER["HTT ...
- docker 清理容器的命令
执行以下命令会彻底清除所有容器. docker rm -f $(docker ps -qa) rm -rf /var/lib/etcd /var/lib/cni /var/run/calico rm ...
- margin塌陷
我工作基本上就是写业务逻辑,不怎么写页面就一直觉得页面布局特高深.有天我同事问我,知道margin塌陷是什么东西不,我说我不知道(反正我也不用,管他呢),他说面试的时候问的(...那这必须得去看啊). ...
- GMA Round 1 YGGDRASIL
传送门 YGGDRASIL 在YGGDRASIL世界,一年有213天. Demiurge推广种植了一种植物,姑且称之为“黄金果”,它第一期生长需要140天,此后第i期生长需要的天数$a_i$满足$a_ ...
- javascript——10章 DOM
1.节点关系 (1)childNodes:返回节点的子节点集合 返回值:NodeList 对象,表示节点集合. 注:childNodes只能取到子级,不能取到子级的子级. childNodes所有节点 ...