Java工程师成神之路 | 2020正式版

Posted Hollis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java工程师成神之路 | 2020正式版相关的知识,希望对你有一定的参考价值。

△Hollis, 一个对Coding有着独特追求的人△
这是Hollis的第 262 篇原创分享
作者 l Hollis
来源 l Hollis(ID:hollischuang)

主要版本更新时间更新内容
v3.02020-04-13知识体系完善,在v2.0的基础上,新增20%左右的知识点;
调整部分知识的顺序及结构,方便阅读和理解;
通过GitHub Page搭建,便于阅读
v2.02019-02-19结构调整,更适合从入门到精通;
进一步完善知识体系;
新技术补充;
v1.12018-03-12增加新技术知识、完善知识体系
v1.02015-08-01首次发布;


基础篇


面向对象


什么是面向对象

面向对象与面向过程

面向对象的三大基本特征

面向对象的五大基本原则


封装、继承、多态

什么是多态

方法重写与重载

Java的继承与实现

Java的继承与组合

构造函数与默认构造函数

类变量、成员变量和局部变量

成员变量和方法作用域


平台无关性

Java如何实现的平台无关性的

JVM还支持哪些语言


值传递

值传递、引用传递

为什么说Java中只有值传递


Java基础知识


基本数据类型

8种基本数据类型

整型中byte、short、int、long的取值范围

什么是浮点型?

什么是单精度和双精度?

为什么不能用浮点型表示金额?


自动拆装箱

自动拆装箱

Integer的缓存机制

如何正确定义接口的返回值(boolean/Boolean)类型及命名(success/Success)


String

字符串的不可变性

String的长度限制

JDK 6和JDK 7中substring的原理及区别

replaceFirst、replaceAll、replace区别

String、StringBuilder和StingBuffer之间的区别与联系

String对“+”的重载

字符串拼接的几种方式和区别

String.valueOf和Integer.toString的区别

switch对String的支持

字符串池

常量池(运行时常量池、Class常量池)

intern


Java中各种关键字

transient

instanceof

volatile

synchronized

final

static

const


集合类

Collection和Collections的区别

常用集合类的使用

Set和List区别

ArrayList和LinkedList和Vector的区别

SynchronizedList和Vector的区别

Set如何保证元素不重复

HashMap、HashTable、ConcurrentHashMap区别

Java 8中Map相关的红黑树的引用背景、原理等

HashMap的容量、扩容、hash等原理

Java 8中stream相关用法

Apache集合处理工具类的使用

不同版本的JDK中HashMap的实现的区别以及原因

Arrays.asList获得的List使用时需要注意什么

Collection如何迭代

Enumeration和Iterator区别

如何在遍历的同时删除ArrayList中的元素

fail-fast 和 fail-safe

CopyOnWriteArrayList

ConcurrentSkipListMap


枚举

枚举的用法

枚举的实现

枚举与单例

Enum类

Java枚举如何比较

switch对枚举的支持

枚举的序列化如何实现

枚举的线程安全性问题


IO

字符流、字节流

输入流、输出流

字节流和字符流之间的相互转换

同步、异步

阻塞、非阻塞

Linux 5种IO模型

BIO、NIO和AIO的区别

三种IO的用法与原理

netty


反射

什么是反射

反射有什么作用

Class类

java.lang.reflect.*


动态代理

静态代理

动态代理

动态代理和反射的关系

动态代理的几种实现方式

AOP


序列化

什么是序列化与反序列化

Java如何实现序列化与反序列化

Serializable 和 Externalizable 有何不同

为什么需要序列化

serialVersionUID

为什么serialVersionUID不能随便改

transient

序列化底层原理

序列化如何破坏单例模式

protobuf

为什么说序列化并不安全


注解

元注解

自定义注解

Java中常用注解使用

注解与反射的结合

如何自定义一个注解?

Spring常用注解


泛型

什么是泛型

类型擦除

泛型带来的问题

泛型中K T V E ?object等的含义

泛型各种用法

限定通配符和非限定通配符

上下界限定符extends 和 super

List和原始类型List之间的区别?

List和List之间的区别是什么?


单元测试

junit

junit和Spring的结合

mock

mockito

内存数据库(h2)


正则表达式

java.lang.util.regex.*


常用的Java工具库

apache-commons

google-guava

netty


API&SPI

API

API和SPI的关系和区别

如何定义SPI

SPI的实现原理


异常

Error和Exception

异常类型

异常相关关键字

正确处理异常

自定义异常

异常链

try-with-resources

finally和return的执行顺序


时间处理

时区

冬令时和夏令时

时间戳

Java中时间API(Java 8)

格林威治时间

CET、UTC、GMT、CST几种常见时间的含义和关系

SimpleDateFormat的线程安全性问题

Java 8中的时间处理

如何在东八区的计算机上获取美国时间

yyyy和YYYY有什么区别?


编码方式

什么是ASCII?

Unicode

有了Unicode为啥还需要UTF-8

UTF8、UTF16、UTF32区别

有了UTF8为什么还需要GBK?

GBK、GB2312、GB18030之间的区别

URL编解码

Big Endian和Little Endian

如何解决乱码问题


语法糖

Java中语法糖原理、解语法糖

常见语法糖原理:switch 支持 String 与枚举、泛型、自动装箱与拆箱、方法变长参数、枚举、内部类、条件编译、 断言、数值字面量、for-each、try-with-resource、Lambda表达式、本地变量类型推断、record


JMS

什么是Java消息服务

JMS消息传送模型


JMX

java.lang.management.* 

javax.management.*


Java 8

lambda表达式

Stream API

时间API


阅读源代码

String

Integer

Long

Enum

BigDecimal

ThreadLocal

ClassLoader & URLClassLoader

ArrayList & LinkedList

HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap

HashSet & LinkedHashSet & TreeSet


Java并发编程


并发与并行

什么是并发

什么是并行

并发与并行的区别


线程
线程与进程的区别

线程的实现

线程的状态

线程优先级

线程调度

多线程如何Debug

守护线程


创建线程的多种方式

继承Thread类创建线程

实现Runnable接口创建线程

通过Callable和FutureTask创建线程

通过线程池创建线程


线程池

自己设计线程池

submit() 和 execute()

线程池原理

为什么不允许使用Executors创建线程池


线程安全

什么是线程安全

多级缓存和一致性问题

CPU时间片和原子性问题

指令重排和有序性问题

线程安全和内存模型的关系

happens-before

as-if-serial



可重入锁

阻塞锁

乐观锁与悲观锁

数据库相关锁机制

分布式锁


无锁

CAS

CAS的ABA问题


锁优化

偏向锁

轻量级锁

重量级锁

锁消除

锁粗化

自旋锁

死锁

什么是死锁

死锁的原因

如何避免死锁

写一个死锁的程序

死锁问题如何排查


synchronized

synchronized是如何实现的?

synchronized和lock之间关系

不使用synchronized如何实现一个线程安全的单例

synchronized和原子性

synchronized和可见性

synchronized和有序性


volatile

编译器指令重排和CPU指令重排

volatile的实现原理

内存屏障

volatile和原子性

volatile和可见性

volatile和有序性

有了symchronized为什么还需要volatile


线程相关方法

start & run

sleep & wait

notify & notifyAll

ThreadLocal

ThreadLocal 原理

ThreadLocal 底层的数据结构


写代码解决生产者消费者问题


并发包

同步容器与并发容器

Thread

Runnable

Callable

ReentrantLock

ReentrantReadWriteLock

Atomic*

Semaphore

CountDownLatch

ConcurrentHashMap

Executors



底层篇


JVM


JVM内存结构

运行时数据区域

运行时数据区哪些是线程独享

堆和栈区别

方法区在不同版本JDK中的位置

堆外内存

TLAB

Java中的对象一定在堆上分配吗?


垃圾回收

GC算法:标记清除、引用计数、复制、标记压缩、分代回收、增量式回收

GC参数

对象存活的判定

垃圾收集器(CMS、G1、ZGC、Epsilon)


JVM参数及调优

-Xmx

-Xmn

-Xms

-Xss

-XX:SurvivorRatio

-XX:PermSize

-XX:MaxPermSize

-XX:MaxTenuringThreshold


Java对象模型

oop-klass

对象头


HotSpot

即时编译器

编译优化


Java内存模型


计算机内存模型

缓存一致性

MESI协议

可见性

原子性

顺序性

happens-before 

as-if-serial

内存屏障

synchronized

volatile

final



虚拟机性能监控与故障处理工具

jps

jstack

jmap

jstat

jconsole

jinfo

jhat

javap

btrace

TProfiler

Arthas


类加载机制

classLoader

类加载过程是线程安全的吗?

类加载过程

双亲委派(破坏双亲委派)

模块化(jboss modules、osgi、jigsaw)


打包工具

jar、jlink、jpackage


编译与反编译

什么是编译

什么是反编译

编译工具:javac

反编译工具:javap 、jad 、CRF


JIT

JIT优化(逃逸分析、栈上分配、标量替换、锁优化)




进阶篇


Java底层知识

字节码

class文件格式

CAFEBABE


位运算

用位运算实现加、减、乘、除、取余


设计模式


设计模式的六大原则

开闭原则

里氏代换原则

依赖倒转原则

接口隔离原则

迪米特法则(最少知道原则)

合成复用原则


创建型设计模式

单例模式

抽象工厂模式

建造者模式

工厂模式

原型模式


结构型设计模式

适配器模式

桥接模式

装饰模式

组合模式

外观模式

享元模式

代理模式


行为型设计模式

模版方法模式

命令模式

迭代器模式

观察者模式

中介者模式

备忘录模式

解释器模式

状态模式

策略模式

责任链模式

访问者模式


单例的七种写法

懒汉——线程不安全

懒汉——线程安全

饿汉

饿汉——变种

静态内部类

枚举

双重校验锁


为什么推荐使用枚举实现单例?


三种工厂模式的区别及联系

简单工厂、工厂方法、模板工厂


会使用常用设计模式

适配器模式

策略模式

模板方法模式

观察者模式

外观模式

代理模式


不用synchronized和lock,实现线程安全的单例模式


nio和reactor设计模式


Spring中用到了哪些设计模式


网络编程知识


常用协议

tcp、udp、http、https

用Java实现FTP、SMTP协议


OSI七层模型

每一层的主要协议


TCP、UDP

三次握手与四次关闭

流量控制和拥塞控制

tcp粘包与拆包


TCP/IP

IPV4

IPV6


HTTP

http/1.0 http/1.1 http/2之间的区别

http和https的区别

http中 get和post区别

常见的web请求返回的状态码

404、302、301、500分别代表什么

用Java写一个简单的静态文件的HTTP服务器


http/2


Java RMI,Socket,HttpClient


cookie 与 session

cookie被禁用,如何实现session


了解nginx和apache服务器的特性并搭建一个对应的服务器


进程间通讯的方式


什么是CDN?如果实现?


DNS

什么是DNS

记录类型:A记录、CNAME记录、AAAA记录等

域名解析

根域名服务器

DNS污染

DNS劫持

公共DNS:114 DNS、Google DNS、OpenDNS


代理

反向代理

正向代理

反向代理服务器


框架知识


Servlet

生命周期

线程安全问题

filter和listener

web.xml中常用配置及作用


Hibernate

什么是OR Mapping

Hibernate的缓存机制

Hibernate的懒加载

Hibernate/Ibatis/MyBatis之间的区别


MyBatis

Mybatis缓存机制

#和$的区别

mapper中传递多个参数

Mybatis动态sql

Mybatis的延迟加载


Spring

Bean的初始化

AOP原理

实现Spring的IOC

spring四种依赖注入方式


Spring MVC

什么是MVC

Spring mvc与Struts mvc的区别


Spring Boot

Spring Boot 2.0

起步依赖

自动配置

Spring Boot的starter原理

自己实现一个starter

为什么Spring Boot可以通过main启动web项目


Spring Security


Spring Cloud

服务发现与注册:Eureka、Zookeeper、Consul

负载均衡:Feign、Spring Cloud Loadbalance

服务配置:Spring Cloud Config

服务限流与熔断:Hystrix

服务链路追踪:Dapper

服务网关、安全、消息


应用服务器知识

JBoss

tomcat

jetty

Weblogic

工具

git & svn

maven & gradle


git技巧

分支合并

冲突解决

提交回滚


maven技巧

依赖树

依赖仲裁


Intellij IDEA

常用插件:Maven Helper、FindBugs-IDEA、阿里巴巴代码规约检测、GsonFormat、Lombok plugin、.ignore、Mybatis plugin


高级篇


新技术


Java 9

Jigsaw

Jshell

Reactive Streams


Java 10

局部变量类型推断

G1的并行Full GC

ThreadLocal握手机制


Java 11

ZGC

Epsilon

增强var


Java 12

Switch 表达式


Java 13

Text Blocks

Dynamic CDS Archives


Java 14

Java打包工具

更有价值的NullPointerException

record类型


Spring 5

响应式编程


Spring Boot 2.0


http/2


http/3


性能优化

使用单例

使用Future模式

使用线程池

选择就绪

减少上下文切换

减少锁粒度

数据压缩

结果缓存

Stream并行流

GC调优

JVM内存分配调优

SQL调优


线上问题分析


dump

线程Dump

内存Dump

gc情况

dump分析


dump分析及获取工具

jstack

jstat

jmap

jhat

Arthas


dump分析死锁


dump分析内存泄露


自己编写各种outofmemory,stackoverflow程序

HeapOutOfMemory

Young OutOfMemory

MethodArea OutOfMemory

ConstantPool OutOfMemory

DirectMemory OutOfMemory

Stack OutOfMemory Stack OverFlow


Arthas

jvm相关

class/classloader相关

monitor/watch/trace相关

options

管道

后台异步任务


常见问题解决思路

内存溢出

线程死锁

类加载冲突

load飙高

CPU利用率飙高

慢SQL


使用工具尝试解决以下问题,并写下总结

当一个Java程序响应很慢时如何查找问题

当一个Java程序频繁FullGC时如何解决问题

如何查看垃圾回收日志

当一个Java应用发生OutOfMemory时该如何解决

如何判断是否出现死锁

如何判断是否存在内存泄露

使用Arthas快速排查Spring Boot应用404/401问题

使用Arthas排查线上应用日志打满问题

利用Arthas排查Spring Boot应用NoSuchMethodError


编译原理知识


编译与反编译

Java代码的编译与反编译


Java的反编译工具

javap

jad

CRF


即时编译器

编译器优化


操作系统知识


Linux的常用命令

find、grep、ps、cp、move、tar、head、tail、netstat、lsof、tree、wget、curl、ping、ssh、echo、free、top


进程间通信


服务器性能指标

load

CPU利用率

内存使用情况

qps

rt


进程同步

生产者消费者问题

哲学家就餐问题

读者写者问题


缓冲区溢出


分段和分页


虚拟内存与主存


虚拟内存管理


换页算法

数据库知识


mysql 执行引擎


MySQL 执行计划

如何查看执行计划

如何根据执行计划进行SQL优化


索引

Hash索引&B树索引

普通索引&唯一索引

聚集索引&非聚集索引

覆盖索引

最左前缀原则

索引下推

索引失效


回表


SQL优化


数据库事务和隔离级别

事务的ACID

事务的隔离级别与读现象

事务能不能实现锁的功能


编码方式

utf8

java工程师成神之路

转载
http://www.hollischuang.com/archives/489
https://linux.cn/article-6739-1.html

一、基础篇

1.1 JVM

1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收

http://www.jcp.org/en/jsr/detail?id=133 
http://ifeve.com/jmm-faq/ 

1.1.2. 了解JVM各种参数及调优

1.1.3. 学习使用Java工具

jps, jstack, jmap, jconsole, jinfo, jhat, javap, …
http://kenai.com/projects/btrace 
http://www.crashub.org/ 
https://github.com/taobao/TProfiler 
https://github.com/CSUG/HouseMD 
http://wiki.cyclopsgroup.org/jmxterm 
https://github.com/jlusdy/TBJMap 

1.1.4. 学习Java诊断工具

http://www.eclipse.org/mat/ 
http://visualvm.java.net/oqlhelp.html 

1.1.5. 自己编写各种outofmemory,stackoverflow程序

HeapOutOfMemory
Young OutOfMemory
MethodArea OutOfMemory
ConstantPool OutOfMemory
DirectMemory OutOfMemory
Stack OutOfMemory
Stack OverFlow

1.1.6. 使用工具尝试解决以下问题,并写下总结

当一个Java程序响应很慢时如何查找问题
当一个Java程序频繁FullGC时如何解决问题,如何查看垃圾回收日志
当一个Java应用发生OutOfMemory时该如何解决,年轻代、年老代、永久代解决办法不同,导致原因也不同

1.1.7. 参考资料

http://docs.oracle.com/javase/specs/jvms/se7/html/ 
http://www.cs.umd.edu/~pugh/java/memoryModel/ 
http://gee.cs.oswego.edu/dl/jmm/cookbook.html 

1.2. Java基础知识

1.2.1. 阅读源代码

java.lang.String
java.lang.Integer
java.lang.Long
java.lang.Enum
java.math.BigDecimal
java.lang.ThreadLocal
java.lang.ClassLoader & java.net.URLClassLoader
java.util.ArrayList & java.util.LinkedList
java.util.HashMap & java.util.LinkedHashMap & java.util.TreeMap
java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet

1.2.2. 熟悉Java中各种变量类型

1.2.3. 熟悉Java String的使用,熟悉String的各种函数

1.2.4. 熟悉Java中各种关键字

1.2.5. 学会使用List,Map,Stack,Queue,Set

上述数据结构的遍历
上述数据结构的使用场景
Java实现对Array/List排序
java.uti.Arrays.sort()
java.util.Collections.sort()
Java实现对List去重
Java实现对List去重,并且需要保留数据原始的出现顺序
Java实现最近最少使用cache,用LinkedHashMap

1.2.6. Java IO&Java NIO,并学会使用

java.io.*
java.nio.*
nio和reactor设计模式
文件编码,字符集

1.2.7. Java反射与javassist

反射与工厂模式
java.lang.reflect.*

1.2.8. Java序列化

java.io. Serializable
什么是序列化,为什么序列化
序列化与单例模式
google序列化protobuf

1.2.9. 虚引用,弱引用,软引用

java.lang.ref.*
实验这些引用的回收

1.2.10. 熟悉Java系统属性

java.util.Properties

1.2.11. 熟悉Annotation用法

java.lang.annotation.*

1.2.12. JMS

javax.jms.*

1.2.13. JMX

java.lang.management.*
javax.management.*

1.2.14. 泛型和继承,泛型和擦除

1.2.15. 自动拆箱装箱与字节码

1.2.16. 实现Callback

1.2.17. java.lang.Void类使用

1.2.18. Java Agent,premain函数

java.lang.instrument

1.2.19. 单元测试

Junit, http://junit.org/  
Jmockit, https://code.google.com/p/jmockit/ 
djUnit, http://works.dgic.co.jp/djunit/ 

1.2.20. Java实现通过正则表达式提取一段文本中的电子邮件,并将@替换为#输出

java.lang.util.regex.*

1.2.21. 学习使用常用的Java工具库

commons.lang, commons.*…
guava-libraries
netty

1.2.22. 什么是API&SPI

http://en.wikipedia.org/wiki/Application_programming_interface 
http://en.wikipedia.org/wiki/Service_provider_interface 

1.2.23. 参考资料

JDK src.zip 源代码
http://openjdk.java.net/ 
http://commons.apache.org/ 
https://code.google.com/p/guava-libraries/ 
http://netty.io/ 
http://stackoverflow.com/questions/2954372/difference-between-spi-and-api 
http://stackoverflow.com/questions/11404230/how-to-implement-the-api-spi-pattern-in-java 

1.3. Java并发编程

1.3.1. 阅读源代码,并学会使用

java.lang.Thread
java.lang.Runnable
java.util.concurrent.Callable
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.locks.ReentrantReadWriteLock
java.util.concurrent.atomic.Atomic*
java.util.concurrent.Semaphore
java.util.concurrent.CountDownLatch
java.util.concurrent.CyclicBarrier
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.Executors

1.3.2. 学习使用线程池,自己设计线程池需要注意什么

1.3.3. 锁

什么是锁,锁的种类有哪些,每种锁有什么特点,适用场景是什么
在并发编程中锁的意义是什么

1.3.4. synchronized的作用是什么,synchronized和lock

1.3.5. sleep和wait

1.3.6. wait和notify

1.3.7. 写一个死锁的程序

1.3.8. 什么是守护线程,守护线程和非守护线程的区别以及用法

1.3.9. volatile关键字的理解

C++ volatile关键字和Java volatile关键字
happens-before语义
编译器指令重排和CPU指令重排
http://en.wikipedia.org/wiki/Memory_ordering 
http://en.wikipedia.org/wiki/Volatile_variable 
http://preshing.com/20130702/the-happens-before-relation/ 

1.3.10. 以下代码是不是线程安全?为什么?如果为count加上volatile修饰是否能够做到线程安全?你觉得该怎么做是线程安全的?

  1. public class Sample{ private static int count =0; public static void increment(){ count++; } }

1.3.11. 解释一下下面两段代码的差别

  1. // 代码1
  2. public class Sample {
  3. private static int count = 0;
  4. synchronized public static void increment() {
  5. count++;
  6. }
  7. }
  8. // 代码2
  9. public class Sample {
  10. private static AtomicInteger count = new AtomicInteger(0);
  11. public static void increment() {
  12. count.getAndIncrement();
  13. }
  14. }

1.3.12. 参考资料

http://book.douban.com/subject/10484692/ 
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html 

二、 进阶篇

2.1. Java底层知识

2.1.1. 学习了解字节码、class文件格式

http://en.wikipedia.org/wiki/Java_class_file 
http://en.wikipedia.org/wiki/Java_bytecode 
http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings 
http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ 
http://asm.ow2.org/ 

2.1.2. 写一个程序要求实现javap的功能(手工完成,不借助ASM等工具)

如Java源代码:

  1. public static void main(String[] args) {
  2. int i = 0;
  3. i += 1;
  4. i *= 1;
  5. System.out.println(i);
  6. }

编译后读取class文件输出以下代码:

  1. public static void main(java.lang.String[]);
  2. Code:
  3. Stack=2, Locals=2, Args_size=1
  4. 0: iconst_0
  5. 1: istore_1
  6. 2: iinc 1, 1
  7. 5: iload_1
  8. 6: iconst_1
  9. 7: imul
  10. 8: istore_1
  11. 9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  12. 12: iload_1
  13. 13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
  14. 16: return
  15. LineNumberTable:
  16. line 4: 0
  17. line 5: 2
  18. line 6: 5
  19. line 7: 9
  20. line 8: 16

2.1.3. CPU缓存,L1,L2,L3和伪共享

http://duartes.org/gustavo/blog/post/intel-cpu-caches/ 
http://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html 

2.1.4. 什么是尾递归

2.1.5. 熟悉位运算

用位运算实现加、减、乘、除、取余

2.1.6. 参考资料

http://book.douban.com/subject/1138768/ 
http://book.douban.com/subject/6522893/ 
http://en.wikipedia.org/wiki/Java_class_file 
http://en.wikipedia.org/wiki/Java_bytecode 
http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings 

2.2. 设计模式

2.2.1. 实现AOP

CGLIB和InvocationHandler的区别,http://cglib.sourceforge.net/ 
动态代理模式
Javassist实现AOP,http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ 
ASM实现AOP,http://asm.ow2.org/ 

2.2.2. 使用模板方法设计模式和策略设计模式实现IOC

2.2.3. 不用synchronized和lock,实现线程安全的单例模式

2.2.4. nio和reactor设计模式

2.2.5. 参考资料

http://asm.ow2.org/ 
http://cglib.sourceforge.net/ 
http://www.javassist.org/ 

2.3. 网络编程知识

2.3.1. Java RMI,Socket,HttpClient

2.3.2. 用Java写一个简单的静态文件的HTTP服务器

实现客户端缓存功能,支持返回304
实现可并发下载一个文件
使用线程池处理客户端请求
使用nio处理客户端请求
支持简单的rewrite规则
上述功能在实现的时候需要满足“开闭原则”

2.3.3. 了解nginx和apache服务器的特性并搭建一个对应的服务器

http://nginx.org/ 
http://httpd.apache.org/ 

2.3.4. 用Java实现FTP、SMTP协议

2.3.5. 什么是CDN?如果实现?DNS起到什么作用?

搭建一个DNS服务器
搭建一个 Squid 或 Apache Traffic Server 服务器
http://www.squid-cache.org/ 
http://trafficserver.apache.org/ 
http://en.wikipedia.org/wiki/Domain_Name_System 

2.3.6. 参考资料

http://www.ietf.org/rfc/rfc2616.txt 
http://tools.ietf.org/rfc/rfc5321.txt 
http://en.wikipedia.org/wiki/Open/closed_principle 

2.4. 框架知识

spring,spring mvc,阅读主要源码
ibatis,阅读主要源码
用spring和ibatis搭建java server

2.5. 应用服务器知识

熟悉使用jboss, https://www.jboss.org/overview/  
熟悉使用tomcat, http://tomcat.apache.org/  
熟悉使用jetty, http://www.eclipse.org/jetty/ 

三、 高级篇

3.1. 编译原理知识

3.1.1. 用Java实现以下表达式解析并返回结果(语法和Oracle中的select sysdate-1 from dual类似)

  1. sysdate
  2. sysdate -1
  3. sysdate -1/24
  4. sysdate -1/(12*2)

3.1.2. 实现对一个List通过DSL筛选

  1. QList<Map<String, Object>> mapList = new QList<Map<String, Object>>;
  2. mapList.add({"name": "hatter test"});
  3. mapList.add({"id": -1,"name": "hatter test"});
  4. mapList.add({"id": 0, "name": "hatter test"});
  5. mapList.add({"id": 1, "name": "test test"});
  6. mapList.add({"id": 2, "name": "hatter test"});
  7. mapList.add({"id": 3, "name": "test hatter"});
  8. mapList.query("id is not null and id > 0 and name like ‘%hatter%‘");

要求返回列表中匹配的对象,即最后两个对象;

3.1.3. 用Java实现以下程序(语法和变量作用域处理都和JavaScript类似):

代码:

  1. var a = 1;
  2. var b = 2;
  3. var c = function() {
  4. var a = 3;
  5. println(a);
  6. println(b);
  7. };
  8. c();
  9. println(a);
  10. println(b);

输出:

  1. 3212

3.1.4. 参考资料

http://en.wikipedia.org/wiki/Abstract_syntax_tree 
https://javacc.java.net/ 
http://www.antlr.org/ 

3.2. 操作系统知识

Ubuntu
Centos
使用linux,熟悉shell脚本

3.3. 数据存储知识

3.3.1. 关系型数据库

MySQL
如何看执行计划
如何搭建MySQL主备
binlog是什么
Derby,H2,PostgreSQL
SQLite

3.3.2. NoSQL

Cache
Redis
Memcached
Leveldb
Bigtable
HBase
Cassandra
Mongodb
图数据库
neo4j

3.3.3. 参考资料

http://db-engines.com/en/ranking 
http://redis.io/ 
https://code.google.com/p/leveldb/ 
http://hbase.apache.org/ 
http://cassandra.apache.org/ 
http://www.mongodb.org/ 
http://www.neo4j.org/ 

3.4. 大数据知识

3.4.1. Zookeeper,在linux上部署zk

3.4.2. Solr,Lucene,ElasticSearch

在linux上部署solr,solrcloud,新增、删除、查询索引

3.4.3. Storm,流式计算,了解Spark,S4

在linux上部署storm,用zookeeper做协调,运行storm hello world,local和remote模式运行调试storm topology。

3.4.4. Hadoop,离线计算

Hdfs:部署NameNode,SecondaryNameNode,DataNode,上传文件、打开文件、更改文件、删除文件
MapReduce:部署JobTracker,TaskTracker,编写mr job
Hive:部署hive,书写hive sql,得到结果
Presto:类hive,不过比hive快,非常值得学习

3.4.5. 分布式日志收集flume,kafka,logstash

3.4.6. 数据挖掘,mahout

3.4.7. 参考资料

http://zookeeper.apache.org/ 
https://lucene.apache.org/solr/ 
https://github.com/nathanmarz/storm/wiki 
http://hadoop.apache.org/ 
http://prestodb.io/ 
http://flume.apache.org/
http://logstash.net/
http://kafka.apache.org/
http://mahout.apache.org/ 

3.5. 网络安全知识

3.5.1. 什么是DES、AES

3.5.2. 什么是RSA、DSA

3.5.3. 什么是MD5,SHA1

3.5.4. 什么是SSL、TLS,为什么HTTPS相对比较安全

3.5.5. 什么是中间人攻击、如果避免中间人攻击

3.5.6. 什么是DOS、DDOS、CC攻击

3.5.7. 什么是CSRF攻击

3.5.8. 什么是CSS攻击

3.5.9. 什么是SQL注入攻击

3.5.10. 什么是Hash碰撞拒绝服务攻击

3.5.11. 了解并学习下面几种增强安全的技术

http://www.openauthentication.org/ 
HOTP http://www.ietf.org/rfc/rfc4226.txt 
TOTP http://tools.ietf.org/rfc/rfc6238.txt 
OCRA http://tools.ietf.org/rfc/rfc6287.txt 
http://en.wikipedia.org/wiki/Salt_(cryptography) 

3.5.12. 用openssl签一个证书部署到apache或nginx

3.5.13. 参考资料

http://en.wikipedia.org/wiki/Cryptographic_hash_function 
http://en.wikipedia.org/wiki/Block_cipher 
http://en.wikipedia.org/wiki/Public-key_cryptography 
http://en.wikipedia.org/wiki/Transport_Layer_Security 
http://www.openssl.org/ 
https://code.google.com/p/google-authenticator/ 

四、 扩展篇

4.1. 相关知识

4.1.1. 云计算,分布式,高可用,可扩展

4.1.2. 虚拟化

https://linuxcontainers.org/ 
http://www.linux-kvm.org/page/Main_Page 
http://www.xenproject.org/ 
https://www.docker.io/ 

4.1.3. 监控

http://www.nagios.org/ 
http://ganglia.info/ 

4.1.4. 负载均衡

http://www.linuxvirtualserver.org/ 

4.1.5. 学习使用git

https://github.com/ 
https://git.oschina.net/ 

4.1.6. 学习使用maven

http://maven.apache.org/ 

4.1.7. 学习使用gradle

http://www.gradle.org/ 

4.1.8. 学习一个小语种语言

Groovy
Scala
LISP, Common LISP, Schema, Clojure
R
Julia
Lua
Ruby

4.1.9. 尝试了解编码的本质

了解以下概念
ASCII, ISO-8859-1
GB2312, GBK, GB18030
Unicode, UTF-8
不使用 String.getBytes() 等其他工具类/函数完成下面功能

  1. public static void main(String[] args) throws IOException {
  2. String str = "Hello, 我们是中国人。";
  3. byte[] utf8Bytes = toUTF8Bytes(str);
  4. FileOutputStream fos = new FileOutputStream("f.txt");
  5. fos.write(utf8Bytes);
  6. fos.close();
  7. }
  8. public static byte[] toUTF8Bytes(String str) {
  9. return null; // TODO
  10. }

想一下上面的程序能不能写一个转GBK的?
写个程序自动判断一个文件是哪种编码

4.1.10. 尝试了解时间的本质

时区 & 冬令时、夏令时
http://en.wikipedia.org/wiki/Time_zone 
ftp://ftp.iana.org/tz/data/asia 
http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%99%82%E5%8D%80 
闰年, http://en.wikipedia.org/wiki/Leap_year 
闰秒, ftp://ftp.iana.org/tz/data/leapseconds 
System.currentTimeMillis() 返回的时间是什么

4.1.11. 参考资料

http://git-scm.com/ 
http://en.wikipedia.org/wiki/UTF-8 
http://www.iana.org/time-zones 

4.2. 扩展学习

4.2.1. JavaScript知识

4.2.1.1. 什么是prototype

修改代码,使程序输出“1 3 5”: http://jsfiddle.net/Ts7Fk/ 

4.2.1.2. 什么是闭包

看一下这段代码,并解释一下为什么按Button1时没有alert出“This is button: 1”,如何修改:
http://jsfiddle.net/FDPj3/1/ 

4.2.1.3. 了解并学习一个JS框架

jQuery
ExtJS
ArgularJS

4.2.1.4. 写一个Greasemonkey插件

http://en.wikipedia.org/wiki/Greasemonkey   

4.2.1.5. 学习node.js

http://nodejs.org/ 

4.2.2. 学习html5

ArgularJS, https://docs.angularjs.org/api 

4.2.3. 参考资料

http://www.ecmascript.org/ 
http://jsfiddle.net/ 
http://jsbin.com/ 
http://runjs.cn/ 
http://userscripts.org/ 

五、 推荐书籍

《深入Java虚拟机》
《深入理解Java虚拟机》
《Effective Java》
《七周七语言》
《七周七数据》
《Hadoop技术内幕》
《Hbase In Action》
《Mahout In Action》
《这就是搜索引擎》
《Solr In Action》
《深入分析Java Web技术内幕》
《大型网站技术架构》
《高性能MySQL》
《算法导论》
《计算机程序设计艺术》
《代码大全》
《JavaScript权威指南》

以上是关于Java工程师成神之路 | 2020正式版的主要内容,如果未能解决你的问题,请参考以下文章

Java 工程师成神之路 | 2019正式版

033. Java 工程师成神之路 | 2019正式版

转:Java工程师成神之路~(2018修订版)

Java工程师成神之路系列文章

java工程师成神之路

汇报下《Java工程师成神之路》的进展