一、基础篇

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.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中各种keyword

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.3. Java并发编程

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

​java.lang.Thread​java.lang.Runnable
java.util.concurrent.Callable java.util.concurrent.locks.ReentrantLockjava.util.concurrent.locks.ReentrantReadWriteLockjava.util.concurrent.atomic.Atomic*java.util.concurrent.Semaphorejava.util.concurrent.CountDownLatchjava.util.concurrent.CyclicBarrierjava.util.concurrent.ConcurrentHashMapjava.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. volatilekeyword的理解

C++ volatilekeyword和Java volatilekeyword 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修饰是否可以做到线程安全?你认为该怎么做是线程安全的?

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();
}
}


二、 进阶篇

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源码:

  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和伪共享

​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.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.3. 网络编程知识

2.3.1. Java RMI,Socket。HttpClient

2.3.2. 用Java写一个简单的静态文件的HTTPserver

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

2.3.3. 了解nginx和apacheserver的特性并搭建一个相应的server

​http://nginx.org/​

​http://httpd.apache.org/​

2.3.4. 用Java实现FTP、SMTP协议

2.3.5. 什么是CDN?假设实现?DNS起到什么作用?

搭建一个DNSserver 搭建一个 Squid 或 Apache Traffic Server server​​http://www.squid-cache.org/​http://trafficserver.apache.org/
http://en.wikipedia.org/wiki/Domain_Name_System

2.4. 框架知识

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

2.5. 应用server知识

熟悉使用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类似)

 sysdate
sysdate - 1
sysdate - 1/24
sysdate - 1/(12*2)


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

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


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

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

代码:

var a = 1;
var b = 2;
var c = function() {
var a = 3;
println(a);
println(b);
};
c();
println(a);
println(b);


输出:

3
2
1
2


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.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.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

四、 扩展篇

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/​​​

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() 等其它工具类/函数完毕以下功能

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


想一下上面的程序能不能写一个转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.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​