转自:http://www.hollischuang.com/archives/489

一、基础篇

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

http://www.guru99.com/java-virtual-machine-jvm.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. 熟悉JavaString的使用,熟悉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/

Mockito:http://works.dgic.co.jp/djunit/

Jmockit:https://code.google.com/p/jmockit/

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修饰是否能够做到线程安全?你觉得该怎么做是线程安全的?


public class Sample {private static int count = 0;public static void increment() {count++;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

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

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


public static void main(java.lang.String[]);Code:Stack=2, Locals=2, Args_size=10:   iconst_01:   istore_12:   iinc    1, 15:   iload_16:   iconst_17:   imul8:   istore_19:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;12:  iload_113:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V16:  returnLineNumberTable: line 4: 0line 5: 2line 6: 5line 7: 9line 8: 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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类似)

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%'");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出:

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.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() 等其他工具类/函数完成下面功能

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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 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 工程师修炼之道相关推荐

  1. 《Java工程师修炼之道》内容概览

    最近几个月由于工作和正在筹备<Java工程师修炼之道>一书的原因一直没有写新的文章.不过,忙里偷闲,自己陆续读完了<格鲁夫给经理人的第一课>.<架构真经>.< ...

  2. Java工程师修炼之道

    转自:Java工程师修炼之道 一.软件开发的核心原则 此处所说的是软件开发应该遵循的一些核心原则: 1.Don't Repeat Yourself: 这是软件开发的一个基础原则,即不要做重复性劳动.也 ...

  3. Java工程师修炼之道! | 送10本书籍

    作者:著有<Java工程师修炼之道> 出处:来自Java工程师修炼之道一书节选内容 一.软件开发的核心原则 此处所说的是软件开发应该遵循的一些核心原则: 1.Don't Repeat Yo ...

  4. 《Java工程师修炼之道》学习笔记

    生活加油,摘一句子, 如果有一天你不再寻找爱情,只是去爱:你不再渴望成功,只是去做:你不再追逐成长,只是去修:一切才真正开始--纪伯伦                                 ...

  5. 《Web前端工程师修炼之道(原书第4版)》——我该从哪里开始呢

    本节书摘来自华章社区<Web前端工程师修炼之道(原书第4版)>一书中的我该从哪里开始呢,作者Jennifer Niederst Robbins,更多章节内容可以访问云栖社区"华章 ...

  6. 福利 | 抽奖送现金送书《Web前端工程师修炼之道》

    很多关注了我的公众号的粉丝可能都不知道我,趁这次机会简单介绍下. 你好,我是若川.江西人,某不那么知名的陶瓷大学毕业生,目前在杭州从事前端开发工作.常以若川为名混迹于江湖.更详细的可以点击关于我 我历 ...

  7. 前端html css3修炼之道,Web前端工程师修炼之道(原书第5版)

    Web前端工程师修炼之道(原书第5版) 作者:(美)珍妮弗·尼德斯特·罗宾斯(Jennifer Niederst Robbins) 著 出版日期:2020年10月 文件大小:179.64M 支持设备: ...

  8. 《Web前端工程师修炼之道(原书第4版)》——移动Web

    本节书摘来自华章社区<Web前端工程师修炼之道(原书第4版)>一书中的移动Web,作者Jennifer Niederst Robbins,更多章节内容可以访问云栖社区"华章社区& ...

  9. 《IT售前工程师修炼之道》2019年9月笔记

    <IT售前工程师修炼之道>2019年9月笔记 关于为什么读这本书 几周前,老同学开车载我的时候聊到他所在当地有名的科创园 IT公司(成立了5年)的事.三个月前,他公司的 IT 销售员 集体 ...

  10. 《Web前端工程师修炼之道(原书第4版)》——Web设计师是做什么的

    本节书摘来自华章社区<Web前端工程师修炼之道(原书第4版)>一书中的Web设计师是做什么的,作者Jennifer Niederst Robbins,更多章节内容可以访问云栖社区" ...

最新文章

  1. String与StringBuffer 理解
  2. 读取CSV内容,根据不同的图片标签放到指定文件夹
  3. php临时目录没有文件夹里,PHP上传 找不到临时文件夹的解决方法
  4. 基于jQuery的ajax系列之用FormData实现页面无刷新上传
  5. 人体工学腰垫,保腰神器,改善久坐腰酸背痛
  6. android图片文件的路径地址与uri的相互转换,android图片文件的路径地址与Uri的相互转换...
  7. 阿里云视频云 Retina 多媒体 AI 体验馆开张啦
  8. 周鸿祎:融360与360公司没有任何关系
  9. 微服务架构工作笔记002---了解Isito新一代微服务架构-服务网格
  10. 新手入坑自动驾驶,从 JetBot 机器人小车开始,能学到什么?
  11. Git分支简介与使用——Git的学习与使用(五)
  12. vue + wangeditor封装富文本组件
  13. 可持久化线段树(主席树)总结及板子
  14. (宏)Word修改段落行距为固定值24磅
  15. Texar安装、Textgenrnn安装
  16. Android底层开发
  17. /usr/bin/xauth: file /home/wj/.Xauthority does not exist
  18. qq邮箱下载附件时文件名显示为乱码怎么办。
  19. 荒野行动pc版服务器无响应,荒野行动PC版闪退怎么办 电脑版闪退解决方法
  20. 两种方法教你修改MAC地址 !

热门文章

  1. GJB用于试验的计算机软件,GJB9001C-2017版标准培训课件(最新修正版).ppt
  2. FPGA、AD9371、AD9009、RF SOC介绍
  3. Activiti 流程配置可视化:SpringBoot 集成 Activiti6 + Activiti Modeler
  4. 已知圆上两点坐标和半径求圆心
  5. linux svn 修改回退,玩转SVN-版本回退
  6. Chrome插件分享—不定期更新
  7. 介绍几款iPhone手机原型设计的工具
  8. C语言题目:输入角度a,输出a的正弦值(sin a)
  9. 查询linux信号量命令,Linux信号量动作和说明列表
  10. Linux 线程及线程间通信