我大体把 Java 的复习分为以下几个方向。面试
JVM算法
JVM 是每个开发人员必备的技能,推荐看国内比较经典的 JVM 书籍,里面包含 JVM 的内存接口、类的加载机制等基础知识,是否是以为这些在面试中似曾相识?因此对于 JVM 方面的知识巩固与其在网上看一些零零碎碎的文章不如啃一下《深刻理解 Java 虚拟机:JVM 高级特性与最佳实践(第 2 版)》这本书,固然若是你的英文好则强烈推荐看 Oracle 最新发布的 JAVA 虚拟机规范。数据库
在啃书的时候切记不能图快,你对知识的积累不是经过看书的数量来决定,而是看书的深度。因此在看每一章节的时候看到不懂的要配合网上的文章理解,而且须要看几篇文章理解,由于一篇文章极可能是错误的。编程
排序算法和 Java 集合、工具类设计模式
这一个分类是每个人必须掌握并熟练使用的,那么为何我把它们放在一块儿呢?缓存
由于工具和集合类都源于算法,在准备算法复习以前你要理解,为何要必考算法——正是由于排序算法和咱们编程息息相关。举两个“栗子”:数据结构
你能够看一下Collections 中的MergeSort和sort 方法,你会发现 MergeSort 就是归并排序的实现,而 sort 方法结合了归并排序和插入排序,这样使得 sort 方法最差 O(NlogN) 最好能够达到 O(N) 的效果。那么只有你本身理解了排序方法的实现,才能更好地使用 Java 中的集合类。多线程
第二个“栗子”,你们都听闻过 TopN 问题吧,常常在面试中遇到请写一下 TopN 的实现,说到算法它就是一个大顶堆,说到 Java 它是一个 PriorityQueue 的实现,那么你理解了 TopN 问题,知道其时间复杂度、优缺点,是否是就能够熟练运用 Java 的工具类写更高效的程序了?架构
之因此排序算法和 Java 集合&工具类同样重要是由于它们和咱们天天的编程息息相关。面试官老是问排序算法也不是在为难你,而是在考察你的编程功底。因此你须要对着排序算法和基本的算法配合 Java 的集合类、工具类仔细研究一番,这样才能更深刻地理解他们的关联关系。并发
多线程和并发包
多线程和并发包,重要性就不赘述了,直接说一下学习方法。你首先要理解多线程不只仅是 Thread 和 Runnable 那么简单,整个并发包下面的工具都是在为多线程服务。对于多线程的学习切不可看几篇面试文章,或者几个关键字 CountDownLatch,Lock 巴拉巴拉就觉得理解了多线程的精髓,笔者这里整理了一个大图:
Redis、MySQL、ElasticSearch
存储相关都是咱们平时经常使用的工具,Redis、MySQL、ElasticSearch。知识点分为两方面,一方面是你平时使用过程当中积累的经验,另外一方面是你对其的深刻理解。因此这里的建议就是经过书籍来巩固技术知识, 《Redis设计与实现 (数据库技术丛书)》、《高性能 MySQL》、《ElasticSearch 权威指南》这三本书不必定是该领域最好的书籍,可是若是你吃透了,对于你对知识的理解和程序的设计一定有很大帮助。书里面的内容太多,仍是举两个“栗子”。
其一,使用 Redis 切不可只用他当作 Key-Value 缓存数据库。笔者了解到它的 5 种基本类型中一种类型叫作 Sorted Set。Sorted Set 里 items 内容大于 64 的时候同时使用了 Hash 和 SkipList 两种设计实现。这也会为了排序和查找性能作的优化。添加和删除都须要修改 SkipList,因此复杂度为 O(log(n))。 可是若是仅仅是查找元素的话能够直接使用 Hash,其复杂度为 O(1) ,其余的 range 操做复杂度通常为 O(log(n)),固然若是是小于 64 的时候,由于是采用了 ziplist 的设计,其时间复杂度为 O(n)。这样之后查询和更新阅读都变得简单,那是否是能够用其实现 TopN 的需求呢?这样相似的需求就不须要你查数据,再在内存里面计算和操做了。好比咱们简单的周排行,月排行均可以考虑使用这个数据结构实现,固然这并不必定是最好的解决方案,而是提供了一种解题思路。
此外,PriorityQueue 是优先队列咱们上文已经了解,那么 ElasticSearch 的 Query 也是用优先队列分别在每个分片上面获取,而后再合并优先队列你了解吗?这个“栗子”告诉咱们其实算法是相通的,你理解一个即可以触类旁通举一反三。
框架
一谈框架就想起来 Spring,一说 Spring 就想起来 IOC、AOP。由于你们都在用这个框架,因此对于框架也不须要看一些其余的,直接就深刻了解一下 Spring 就能够了。经过上面的叙述你已经了解了小编的思路,看什么都要看他的实现原理,因此直接推荐你一本书《Spring 技术内幕》而后对着本身现有的 Spring 项目 Debug,从请求的流转梳理知识点。Spring 出来这么久你们对基本的知识已经了然于胸,重要的是看其解决问题的思路和原理,栗子又来了。
好比须要实如今 Bean 刚刚初始化的时候作一些操做,是否是须要使用InitializingBean?那么具体怎么使用,它的原理是什么,Spring Bean 的生命周期是什么样子?经过具体的使用场景逐步展开说明,这样复习效果会更好一些,而后再逐步思考每个知识点里面涉及的更多知识点,好比 AOP 里面的 Proxy 都是基于什么原理实现,有什么优缺点。
分布式
这是一个老生常谈的话题,也是这几年比较火的话题,提及分布式就必定和 Dubbo 有关系,可是不能仅仅就理解到 Dubbo。
首先咱们须要思考它解决的问题,为何要引入 Dubbo 这个概念。随着业务的发展、用户量的增加,系统数量增多,调用依赖关系也变得复杂,为了确保系统高可用、高并发的要求,系统的架构也从单体时代慢慢迁移至服务 SOA 时代,Dubbo 应运而生,它做为 RPC 的出现使得咱们搭建微服务项目变得简单,可是咱们不只仅要思考 Dubbo带来的框架支撑。
同时须要思考服务的幂等、分布式事务、服务之间的 Trace 定位、分布式日志、数据对帐、重试机制等,与此同时考虑 MQ 对系统的解耦和压力的分担、数据库分布式部署和分库分表、限流、熔断等机制。因此最终总结是不只仅要看 Dubbo 的使用、原理,同时还要思考上下游和一些系统设计的问题,这块相对的知识点较多,能够针对上面抛出来的点各个击破。
设计模式
设计模式不少,可是经常使用的就几种,这个地方能够分两个方面准备:
学以至用,设计模式不是背出来的,而是用出来的。平时多注意思考当前项目的设计,是否能够套用设计模式,固然必须先理解每个设计模式存在的意义;
在现有框架中思考设计模式的体现,上面已经讲过框架怎么学习,以 Spring 为例,它里面用了超过 9 种设计模式,你都知道用到哪里了吗?若是不知道,试着把它们找出来,同时思考为何这么设计,所有找到之后,基本的设计模式的用法和原理你也就都理解了。
喜欢可加关注,加喜欢哦!