我曾在携程旅行网做过 Java 技术专家,下面就作为 Java 面试官的角度来尝试回答一波。
市面上的 Java 培训班很多,而且都是流水线式的培养,如果零基础为了入行报 Java 培训班可以理解,但是后面还需要自己针对地补缺补差,一般培训班出来的学生存在两个普遍问题:
- 只会机械地记忆一些知识点,深问一些原理就不知道了;
- 项目的经验基本都是千篇一律的 XXX 系统,很容易看出来是经过包装的。
当然,核心的问题在于缺乏主动性和方向性,不知道接下来该补充什么,培训班与科班学的好的相比,本来就先失一着,如果接下来不知道失之东隅收之桑榆,那这条路基本很难走的长远。
接下来,我将从 Java 基础知识、Java 框架、计算机基础和工程实践等四个方面来说一下学习方法,并推荐一些经典书籍,书不多,都是我自己买过实体书并读过的,具有可操作性。
以下是行文思路:
一、Java 基础知识
Java 的基础知识包括如下部分:
1. 基础语法部分
01、Java 基础语法与运行/编译环境
- JRE/JDK
- Java 变量和字面值
- Java 数据类型
- Java 操作符
- Java 输入输出
- Java 表达式 & 语句 & 代码块
- Java 注释
02、Java 流程控制
- Java if else
- Java switch 语句
- Java for 循环
- Java while 循环
- Java break 语句
- Java continue 语句
03、Java 数组
- Java 数组
- 多维数组
- Java 数组复制
04、Java 面向对象
- Java 类和对象
- Java 方法
- Java 方法重载
- Java 构造方法
- Java 字符串
- Java 访问权限
- Java this 关键字
- Java final 关键字
- Java 递归
- Java instanceof 操作符
- Java 继承
- Java 方法重写
- Java super 关键字
- 抽象类 & 抽象方法
- Java 接口
- Java 多态
- Java 封装
- 嵌套&内部类
- Java static 关键字
- Java 匿名内部类
- Java 单例
- Java 枚举类
- Java 枚举构造方法
- Java 枚举字符串
- Java 反射
05、Java 异常处理
- Java 异常简介
- Java 异常处理
- Java try catch
- Java throw 和 throws
- Java 捕获多个异常
- Java try-with-resources
- Java 注解
- Java 注解类型
- Java 日志
- Java 断言
06、Java 集合与队列
- Java 集合框架
- Java 集合接口
- Java List 接口
- Java ArrayList
- Java Vector
- Java Stack
- Java 队列接口
- Java 优先级队列
- Java 双端队列接口
- Java LinkedList
- Java 数组队列
- Java 阻塞队列接口
- Java ArrayBlockingQueue
- Java LinkedBlockingQueue
- Java Map 接口
- Java HashMap
- Java LinkedHashMap
- Java WeakHashMap
- Java EnumMap
- Java SortedMap 接口
- Java NavigableMap 接口
- Java TreeMap
- Java ConcurrentMap 接口
- Java ConcurrentHashMap
- Java Set 接口
- Java HashSet
- Java EnumSet
- Java LinkedHashSet
- Java SortedSet 接口
- Java NavigableSet 接口
- Java TreeSet
- Java 集合算法
- Java 迭代器接口
- Java ListIterator 接口
07、Java I/O
- Java InputStream
- Java OutputStream
- Java FileInputStream
- Java FileOutputStream
- Java ByteArrayInputStream
- Java ByteArrayOutputStream
- Java ObjectInputStream
- Java ObjectOutputStream
- Java BufferedInputStream
- Java BufferedOutputStream
- Java PrintStream
- Java Reader
- Java Writer
- Java InputStreamReader
- Java OutputStreamWriter
- Java FileReader
- Java FileWriter
- Java BufferedReader
- Java BufferedWriter
- Java StringWriter
- Java PrintWriter
学习 Java 基础知识推荐以下两本书:
- 《Java核心技术卷1 基础知识》
- 《Java核心技术卷2高级特性》
2. Java 并发编程(多线程)
- 进程与线程的区别
- 多线程的入门类和接口
- 线程组和线程优先级
- 线程的状态及主要转化方法
- 线程间的通信
- 重排序和 happens-before
- volatile
- synchronized 与锁
- CAS 与原子操作
- AQS
- 计划任务
- Stream 并行计算原理
- Fork/Join
- 通信工具类
- CopyOnWrite
- 并发集合容器
- 锁接口和类
- 阻塞队列
- 线程池原理
Java 并发编程首推《Java并发编程实战》:
另外《Java并发编程的艺术》这一本也不错。
3. Java 网络编程
- 《Java网络编程》
- 《Java网络编程精解》
4. Java 虚拟机
无论是 Java 面试还是想成为 Java 高手或者在一些项目中进行性能调优都必须掌握的知识,一般需要掌握以下内容:
- Java 内存结构
- 堆
- 栈
- 垃圾回收
- JVM 内存区域
- Java 虚拟机栈
- class 文件
- 字节码指令
- JVM 参数调优
- Java 对象模型
- HotSpot
- 类加载机制
- 编译和反编译
- 反编译工具(javap)
- JIT
- 虚拟机性能监控和故障处理工具(jps、jstack、jmap、jstat、jconsole、javap)
推荐的书是《深入理解Java虚拟机》,这本书现在已成了 Java 虚拟机中的经典的经典,建议从事 Java 开发的同学一定要好好看一看。
另外,《揭秘Java虚拟机——JVM设计原理与实现》这本书也不错。
5. Java Web
- 《深入分析Java Web技术内幕 修订版》
完整的书单在这里:
二、Java 框架
1. Netty
搞 Java 的如果不熟悉 Netty 框架,那很难成为高手,虽然我们平常开发基本不会直接用到 netty,但是各种框架底层基本上都用的是 Netty,学习 Netty 可以分两步走:
第一步,学会如何使用 Netty,推荐《Netty In Action》(中译名:《Netty 实战》),或者看《Netty 权威指南》,这本书也很不错。
第二步,深入研究 Netty 的源码,学习源码中各种技术,netty 的官方源码地址:
https://github.com/netty/netty
2. SSM 框架
现在 Java 的主流开发基本使用 SSM 框架,所谓 SSM 框架指的是 Spring + Spring MVC + MyBatis。
关于 SSM 的书,其实没有特别好的,可以自己搭个框架,边看边调试,或者结合一些网络实例视频来学习。推荐:
三、计算机基础知识
所谓“基础不牢,地动山摇”。
如果你现在是个学生,或者刚走上工作岗位不久,可能对这句话的体会不深,等你工作多年以后,尤其是人到中年,每次跳槽谈薪资时,或者是想去的公司不要自己,或者喜欢的岗位给不到满意的薪资时,你可能才会意识到基本功的重要性,基本功会内化为一个技术人员的技术素养。大家平常在一起吃饭时看不出差别,但遇到问题,如何解决时,内功扎实的和不扎实的,就千差万别了。
对基础知识的掌握程度决定着技术这条路将来能走多远,且新技术不断产生,根本学不完,而掌握基础原理可以以不变应万变。
1、算法与数据结构
建议你应该好好准备算法和数据结构,做到常见的算法和数据结构知识点都能熟悉。如果你是应届生,毕业求职的时候可以轻松拿一些大厂(BAT 等)的 offer,至少不会挂在算法数据结构上面;社招的话,也是非常重要的加分项。一毕业去大厂的好处点击这里。
(1). 严谨的教材
- 《数据结构与算法分析:C 语言描述》
- 《算法导论》
(2). 轻松活泼的教材
- 《大话数据结构》
- 《编程之美》
《编程之美》是一本特别能锻炼思维能力的算法书。
严谨的教材适合系统学习,轻松活泼的教材适合提高学习兴趣、非科班的同学。
(3). 适当刷题还是有必要的
- 《剑指 offer》
- 《程序员代码面试指南 IT名企算法与数据结构题目最优解》
2、操作系统原理
操作系统无论是面试还是自我提高的五大基础之一,我的建议学习操作系统知识时,不一定要看完所有操作系统书籍,但一定将一些基础概念(如进程、线程、内存模式等)看懂、理清。
- Tanenbaum.A.S《现代操作系统》
你如果还有时间强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》。这本书同时涉及到了 Windows 和 Linux 两个操作系统平台,用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节,甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚,同时也分析了 C Runtime(CRT)、glibc 这样的操作系统接口库的原理和执行逻辑,是一本实实在在帮你实战操作系统原理的好书。
- 《程序员的自我修养:链接、装载与库》
3、计算机网络
学习计算机网络除了掌握网络基础知识(比如三次握手和四次挥手),还要熟悉网络编程。
- 《计算机网络:自顶向下方法》
网络编程方面的实战书来,我推荐韩国人尹圣雨写的这本《TCP/IP 网络编程》,这本书也适合无任何 Socket API 编程经验的小白,这本书涵盖从基础的 Socket API 到高级的 IO 网络模型,有非常详细和生动的例子。
- 《TCP/IP 网络编程》
4、数据库
数据库需要掌握的基础知识有:
(1)熟悉基本 SQL 操作 包括增删改查(insert、delete、update、select语句),排序 order,条件查询(where 子语句),限制查询结果数量(LIMIT语句)等
(2)稍微高级一点的 SQL 操作(如 Group by,in,join,left join,多表联合查询,别名的使用,select 子语句等)
(3)索引的概念、索引的原理、索引的创建技巧
(4)数据库本身的操作,建库建表,数据的导入导出
(5)数据库用户权限控制(权限机制)
(6)MySQL的两种数据库引擎的区别
(7)SQL 优化技巧
以上属于对开发的基本的数据库知识要求,你可以找一本相关入门级的数据库图书推荐:
- 《MySQL技术内幕(第5版)》
高级开发除了以上要求还要熟悉高可用 MySQL、主从同步、读写分离、分表分库等技术,这些技术的细节一定要清楚,它们是你成为技术专家或者高级架构的必备知识。我们在实际面试时,在讨论高可用服务服务方案时,很多面试者也会和我们讨论到这些技术,但是不少面试者只知道这些技术的大致思想,细节往往说不清楚,细节不会就意味着你的高可用方案无法落地,企业需要可以落地的方案。
这些技术我首推《高性能 MySQL》这本书,这本书高级开发者一定要通读的,另外还有 2 本非常好的图书也推荐一下:一本是《MySQL 排错指南》,读完这本书以后,你会对整个“数据库世界”充满了清晰的认识;另外一本是《数据库索引设计与优化》,这本书读起来非常舒服,尤其是对于喜欢算法和数据结构的同学来说。
- 《高性能 MySQL》
- 《MySQL 排错指南》
- 《数据库索引设计与优化》
5、编译原理与计算机组成原理
- 《编译系统透视:图解编译原理》
- 《计算机组成与设计:硬件软件接口》
书单在这里:
四、Java 代码规范与工程实践
Java 是一门纯面向对象的编程语言,大量使用设计模式,如果想写出地道高效的 Java 代码,光基础知识是不够的,还得学习一些 Java 编码技巧和工程实践方面的书。推荐以下书籍:
- 《Effective Java》
- 《阿里Java开发手册》
- 《重构_改善既有代码的设计》
1、设计模式
- 《大话设计模式》
2、代码规范与风格优化
- 《重构:改善既有代码设计》
- 《程序设计实践》
- 《代码整洁之道》
这两本书特别推荐学生朋友看一下,能大幅度地提高你实际编码的技巧和编码风格。
五、面经与刷题
我也根据自己当面试官和面试者的经验整理一套 Java 面经和面试题,现在也分享给你:
链接: https://pan.baidu.com/s/1vwBBZ9oE5h0hxab8aEiHJw 提取码: 1pzc
我自己拿阿里 offer 的经验在这里。
六、写给 Javaer 的话
Java 越来越卷了,按目前的态势,供大于求,所以如果你现在还是学生,你有大把读书的机会,一定要珍惜大好读书时光。工作年限不长的同学,也应该尽快在工作的早些年把基本功打扎实。
努力学习成为卷王吧~
原创不易,如果觉得有帮助,请给
点个赞吧~