Java工程师成神之路
发布日期:2021-08-26 15:47:29 浏览次数:9 分类:技术文章

本文共 4551 字,大约阅读时间需要 15 分钟。

一、基础篇

1.1 JVM

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

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

1.1.3. 学习使用Java工具

jps, jstack, jmap, jconsole, jinfo, jhat, javap, …
1.1.4. 学习Java诊断工具
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. 参考资料
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,
Jmockit,
djUnit,
1.2.20. Java实现通过正则表达式提取一段文本中的电子邮件,并将@替换为#输出
java.lang.util.regex.*
1.2.21. 学习使用常用的Java工具库
commons.lang, commons.*…
guava-libraries
netty
1.2.22. 什么是API&SPI
1.2.23. 参考资料
JDK src.zip 源代码
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指令重排
1.3.10. 以下代码是不是线程安全?为什么?如果为count加上volatile修饰是否能够做到线程安全?你觉得该怎么做是线程安全的?
public class Sample {
private static int count = 0;
public static void increment() {
count++;
}
}
1.3.11. 解释一下下面两段代码的差别
// 代码1
public class Sample {
private static int count = 0;
synchronized public static void increment() {
count++;
}
}

// 代码2

public class Sample {
private static AtomicInteger count = new AtomicInteger(0);
public static void increment() {
count.getAndIncrement();
}
}
1.3.12. 参考资料
二、 进阶篇

2.1. Java底层知识

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

2.1.2. 写一个程序要求实现javap的功能(手工完成,不借助ASM等工具)
如Java源代码:
public static void main(String[] args) {
int i = 0;
i += 1;
i *= 1;
System.out.println(i);
}
编译后读取class文件输出以下代码:
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: iconst_0
1: istore_1
2: iinc 1, 1
5: iload_1
6: iconst_1
7: imul
8: istore_1
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: return
LineNumberTable:
line 4: 0
line 5: 2
line 6: 5
line 7: 9
line 8: 16
2.1.3. CPU缓存,L1,L2,L3和伪共享
2.1.4. 什么是尾递归
2.1.5. 熟悉位运算
用位运算实现加、减、乘、除、取余
2.1.6. 参考资料
2.2. 设计模式

2.2.1. 实现AOP

CGLIB和InvocationHandler的区别
动态代理模式
Javassist实现AOP
ASM实现AOP
2.2.2. 使用模板方法设计模式和策略设计模式实现IOC
2.2.3. 不用synchronized和lock,实现线程安全的单例模式
2.2.4. nio和reactor设计模式
2.2.5. 参考资料
2.3. 网络编程知识
2.3.1. Java RMI,Socket,HttpClient
2.3.2. 用Java写一个简单的静态文件的HTTP服务器
实现客户端缓存功能,支持返回304
实现可并发下载一个文件
使用线程池处理客户端请求
使用nio处理客户端请求
支持简单的rewrite规则
上述功能在实现的时候需要满足“开闭原则”
2.3.3. 了解nginx和apache服务器的特性并搭建一个对应的服务器
2.3.4. 用Java实现FTP、SMTP协议
2.3.5. 什么是CDN?如果实现?DNS起到什么作用?
搭建一个DNS服务器
搭建一个 Squid 或 Apache Traffic Server 服务器
2.3.6. 参考资料
2.4. 框架知识
spring,spring mvc,阅读主要源码
ibatis,阅读主要源码
用spring和ibatis搭建java server
2.5. 应用服务器知识
熟悉使用jboss,
熟悉使用tomcat,
熟悉使用jetty,
三、 高级篇

3.1. 编译原理知识

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

sysdate
sysdate - 1
sysdate - 1/24
sysdate - 1/(12*2)
3.1.2. 实现对一个List通过DSL筛选
QList

转载地址:https://blog.csdn.net/weixin_33890499/article/details/90684426 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android异步加载图像(含线程池,缓存方法)
下一篇:linux设备驱动之I2C

发表评论

最新留言

很好
[***.229.124.182]2024年03月30日 13时37分35秒