怎样学习java

本人Java全靠自学并通过校招拿到阿里巴巴offer,分享一下本人自学Java的方法论。

本回答长达2万+字,而且非常硬核,建议大家可以点赞收藏防止迷路。

Java技术栈说实在的知识点很多,绝不仅仅是学一门语言和一个数据库那么简单。

要让我们的程序运行在流量洪峰下还能保证结果正确,我们需要处理好并发问题。
实际生产环境中我们的应用一定是分布式的,我们还需要用到各种框架(rpc服务框架、消息中间件、除了关系型数据库还可能用到nosql、newsql),还需要掌握分布式设计知识。
当程序遇到内存飙高的问题我们排查的时候需要掌握JVM知识
在面对复杂业务场景为了写出优雅、可维护性强的代码我们需要掌握设计模式以及DDD(领域驱动设计)。
部分大数据场景我们还需要用到实时计算框架flink或spark

先贴一张本人总结的Java技术栈脑图

方法论吐血总结(必看)

这里吐血整理了一些实践中踩坑总结的经验,希望大家少走弯路。

  • 一定要理论结合实践,不要只看书,一定要多动手看代码、写代码。
  • 不要一开始就抱着大块头的书去啃,也不要从头到尾啃,要抓重点。一开始掌握最基本的知识就可以,然后就可以开始实践了。
  • 学习建议看书+视频结合的方式,视频会更生动,不会那么枯燥。

下面再详细讲讲Java如何打好牢固的基础

(一)计算机基础课程

打牢基础!打牢基础!打牢基础!重要的事情说三遍!

基础非常重要,不管你以后从事什么方向,应用开发也好,大数据开发也要,客户端工程师也好,要想吃得开必须依赖这些基础课程:操作系统、组成原理、计算机网络、数据结构、算法、数据库

计算机基础课程的学习,我之前有回答过,大家直接戳下面的回答,这里不做赘述:

 

(二)Java语言基础

Java语言基础知识主要包含如下内容

  • 集合:list、map、set等。
  • 反射
  • 并发:synchronized、volatile、final关键字。
  • IO:基本IO的体系包括有InputStream , OutputStream, Reader/Writer,文件读取,各种流读取等。
    NIO、AIO的区别和使用场景。
  • 异常

异常类继承体系:

  • java 8 函数式编程

书籍推荐:

(1)入门强烈推荐《head first java》

语言非常轻松,相比《java编程思想》而言更适合入门。

 

(2)并发编程学习推荐《java并发编程实战》

豆瓣评分9.0分。深入浅出地介绍了java线程和并发,是一本完美的java并发参考手册。英文功底好的可以直接阅读原版,翻译的并不是那么好。

 

关于Java语言从入门到进阶的书籍阅读顺序,我的这个回答已经获得了1300+赞和收藏

 

(三)JVM

JVM体系结构概览:

核心知识点整理:

书籍推荐:

(1)jvm学习推荐《深入理解java虚拟机》

对于理解java虚拟机内存管理、类加载机制、常用调优方法非常有用。

 

(2)另外推荐一本网络书籍《深入理解java内存模型》

书中首先介绍了java内存模型的抽象以及happens-before。然后详细讲解了重排序以及顺序一致性原理,最后介绍了volatile的内存语义实现以及锁机制。

(四)数据库

1、关系型数据库-mysql知识点归纳:

 

推荐书籍:

(1)入门篇-《MySQL必知必会》

非常薄,只有200来页,花几天时间就能刷完,SQL 语法入门好书,推荐!

这本书的特点是注重实用性,紧贴实战需要,基本没有什么理论的堆砌,完完全全就是一本实践指南。读懂后基本mysql的用没问题了。

 

(2)进阶篇-《高性能mysql》

本书深度讲解了mysql引擎架构、索引设计、SQL查询优化的实战技巧、复制、分片等原理,还有运维技能。

书很厚,内容非常全面,适合精读,弄清整本书,也就能精通数据库了。

 

2、SQL VS NoSQL VS NewSQL的区别是什么?

sql通常用来指结构化查询语言或者代指关系型数据库如mysql、PostgreSQL。

NewSQL:关系型数据模型,并提供了良好的伸缩性等特性。

他们三者之间的核心差别是什么呢?

特性 SQL NoSQL NewSQL
是否关系模型 关系模型 不遵循关系模型
ACID 否,CAP
SQL支持 支持 schema-free 两者都支持(schema-free/schema-fixed)
OLTP 支持不佳 不支持 支持的非常好
伸缩性(scaling) 垂直伸缩 水平伸缩 都支持
是否分布式数据库
应用场景 大数据,社交网络,IOT 电商,通信
示例 MySQL,PostgreSQL Hbase,Cassandra,DynamoDB,MongoDB VoltDB, CockroachDB, NuoDB

推荐书籍:

《Hbase权威指南》

 

《Cassandra权威指南》

 

(五)并发编程

生产环境中,我们的代码通常要应对巨大的流量,因此我们必须处理后并发问题。并发问题处理不好,会造成不可预料的损失,严重会造成巨大资损。典型的场景有库存扣减、抢优惠券等。

并发编程知识点整理:

来自网友总结:
processon.com/mindmap/6
github.com/CL0610/Java-

推荐书籍:《Java并发编程实战》

 

(六)常用开发框架-spring

spring是一个轻量级java开发框架,最早由Rod Johnson,目的是解决企业级应用开发的业务逻辑层和其他各层的耦合问题。其最根本的使命是解决企业级应用开发的复杂性

spring的核心:控制反转(IOC)和面向切面编程(AOP)。

spring的优点

  • 解耦,简化开发。开发者可以将所有对象创建和依赖关系维护,交给spring管理。
  • AOP编程的支持。可以方便的实现对程序进行权限拦截、监控等功能。
  • 非常方便集成各种优秀框架。如mybatis、hibernate。
  • 降低javaee api的使用难度,进行了比较好的封装。

spring模块组成

Spring Core:Spring核心模块,包含控制反转(IOC)和依赖注入(DI)。
spring-beans 模块:提供了BeanFactory工厂模式的一个经典实现(Spring将管理对象称为Bean)
Spring Context:访问定义和配置对象的媒介。
Spring AOP:面向切面编程AOP实现,以动态代理技术为基础,允许定义各种拦截器,方便解耦。
Spring JDBC:提供了JDBC的抽象层,消除了JDBC编码的繁琐工作和不同数据库厂商的处理逻辑,简化JDBC。
Spring JMS:JAVA消息发送和接收服务。
Spring ORM:ORM框架支持,集成了hibernate、jpa和jdo用于资源管理、dao的实现和事务。
Spring Web:为创建Web应用程序提供支持。
Spring Test:提供了对 JUnit 和 TestNG 测试的支持、
Spring Aspects:该模块为与AspectJ的集成提供支持。
Spring Web:Spring框架支持与Struts集成,为基于web的应用程序提供了上下文。

从用户视角看:

spring在面试中问的频率非常高,是我们必须掌握使用和设计原理的开发框架。

 

(七)常用开发框架-mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

官网:mybatis.org/mybatis-3/z

(八)设计模式

设计模式是一套被反复使用、多数人知晓、经过分类的、代码设计经验的总结。

使用设计模式的作用是为了代码可重用性、增加可维护性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化

遵循设计模式七大原则:单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则、合成/聚合复用原则

使用设计模式能够增加系统的健壮性,易修改性和可扩展性,当你进行开发的软件规模比较大的时候,良好的设计模式会给编程带来便利,让系统更加稳定,这些在自己编写小程序的时候是体现不出来的。

需要掌握22种核心的设计模式

refactoringguru.cn/desi

(九)分布式

生产环境中我们的应用部署通常是分布式、多机器部署的,因此会涉及分布式问题的处理,如服务跨机房调用、消息通信、分库分表等等。是非常重要且有难度的一块。

这是网上搜到的淘宝3.0架构:服务化。

学习路径:

(1)这里首先推荐书籍《数据密集型应用系统设计》

这本书知识面非常广,涵盖了分布式系统设计的方方面面,将深奥的分布式知识深入浅出的讲解,非常容易懂。英文较好的可以直接读影印版,难度不大。看完这本书后,理论基本上入门了。

 

网上的评价都非常高:

pdos.csail.mit.edu/6.82
pdos.csail.mit.edu/6.82

(十)大数据计算

随着我们进入DT时代,数据成为最重要的资产,数据的处理变得越来越重要。

Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目

早期,Flink 是做 Batch 计算的,但是在 2014 年,StratoSphere 里面的核心成员孵化出 Flink,同年将 Flink 捐赠 Apache,并在后来成为 Apache 的顶级大数据项目,同时 Flink 计算的主流方向被定位为 Streaming,即用流式计算来做所有大数据的计算。

flink架构:

flink资料推荐:《基于Apache Flink的流处理》

Apache Flink PMC成员力作,书中展示了如何使用Flink DataStream API实现可伸缩的流式应用,以及怎么样在业务环境中持续运行和维护这些应用。对于入门是非常好的一本书。

 

最后,要想打好Java基础,一定要多练手实战项目

建议找那些贴近实际互联网项目、功能齐全的项目,麻雀虽小五脏俱全,这里推荐几个优质的github高star的项目,可以戳下面回答看:

 

下面这些高赞回答你可能也会感兴趣:

 

希望总结的这几万字学习方法论能对你有所帮助。

如果觉得不错,可以给个赞

https://www.zhihu.com/question/471957392?rf=55723495