1. 看一下以下类的源代码

  • java.lang.String
  • 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

2. 浏览一下以下类的接口及说明

  • java.io.*
  • java.lang.*
  • java.lang.management.*
  • java.lang.ref.*
  • java.lang.reflect.*
  • java.util.*
  • java.net.*
  • Java实现对Array/List排序
  • java.uti.Arrays.sort()
  • java.util.Collections.sort()
  • Java实现对List去重
  • Java实现对List去重,并且需要保留数据原始的出现顺序
  • Java实现通过正则表达式提取一段文本中的电子邮件,并将 @ 替换为 # 输出

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

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

4. 什么是 API & SPI ?

5. 学习使用Java工具

6. 学习使用Java诊断/分析工具

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

【 没有问题也要创造问题、解决问题 】

  • 当一个Java程序响应很慢时如何查找问题?
  • 当一个Java程序频繁 FullGC 时如何解决问题?
  • 当一个Java应用发生 OutOfMemoryError 时该如何解决?

8. 学习各个Java版本的一些变化和特点

  • Java5
  • Java6
  • Java7
  • Java8

相关资料

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

1. Java内存模型是什么?

2. synchronized的作用是什么?

3. volatile的作用是什么?

4. 判断代码是不是线程安全?

试着回答这些问题: 为什么?如果为count加上volatile修饰是否能够做到线程安全?你觉得该怎么做是线程安全的?

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

5. 学会使用java.uti.concurrent.**下面的类

  • java.util.concurrent.locks.ReentrantLock
  • java.util.concurrent.locks.ReentrantReadWriteLock
  • java.util.concurrent.atomic.Atomic*
  • java.util.concurrent.ConcurrentHashMap
  • java.util.concurrent.Executors

6. 分析并解释两段代码的差别

// 代码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. http://www.cs.umd.edu/~pugh/java/memoryModel/
  2. http://gee.cs.oswego.edu/dl/jmm/cookbook.html
  3. http://book.douban.com/subject/10484692/
  4. http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

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

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

3. 使用CGLIB做一个AOP程序

4. 使用ASM实现AOP的功能

相关资料

  1. http://book.douban.com/subject/1138768/
  2. http://book.douban.com/subject/6522893/
  3. http://en.wikipedia.org/wiki/Java_class_file
  4. http://en.wikipedia.org/wiki/Java_bytecode
  5. http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
  6. http://asm.ow2.org/
  7. http://cglib.sourceforge.net/

1. 用Java实现静态文件HTTP服务器

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

2. 了解 nginx 和 apache 服务器

了解相关特性并搭建对应的服务器

3. 用Java实现FTP、SMTP协议

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

相关资料

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

1. 什么是DES、3DES、AES?

2. 什么是RSA、DSA?

3. 什么是MD5,SHA1?

4. 什么是PBKDF2, bcrypt, scrypt?

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

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

7. 什么是DOS、DDOS、CC攻击?

8. 什么是CSRF攻击?

9. 什么是XSS攻击?

10. 什么是SQL注入攻击?

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

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

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

相关资料

  1. http://en.wikipedia.org/wiki/Cryptographic_hash_function
  2. http://en.wikipedia.org/wiki/Block_cipher
  3. http://en.wikipedia.org/wiki/Public-key_cryptography
  4. http://en.wikipedia.org/wiki/Transport_Layer_Security
  5. http://www.openssl.org/
  6. https://code.google.com/p/google-authenticator/

1. 什么是prototype?

2. 什么是闭包?

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

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

  • jQuery
  • ExtJS
  • Dojo
  • AngularJS

4. 写一个Greasemonkey插件

5. 用node.js写个程序

相关资料

  1. http://www.ecmascript.org/
  2. http://jsfiddle.net/
  3. http://jsbin.com/
  4. http://runjs.cn/
  5. http://userscripts.org/

  1. 用Java实现以下表达式解析并返回结果(语法和Oracle中的select sysdate-1 from dual类似):
    sysdate
    sysdate - 1
    sysdate - 1/24
    sysdate - 1/(12*2)
    
  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. 用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
    

相关资料

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

  1. 关系型数据库
    • MySQL
      • 如何看执行计划?
      • 如何搭建MySQL主备?
      • binlog是什么?
      • 了解MySQL Server和引擎的关系
    • Derby, H2, PostgreSQL (任选一个)
    • SQLite (主要用于手持设备等,用作嵌入式数据库)
  2. 图数据库
    • neo4j
  3. 宽表数据库
    • Cassandra
    • HBase
  4. KV存储
    • Memcached
    • Redis
    • LevelDB

相关资料

  1. http://db-engines.com/en/ranking

  1. 学习使用一个开源的操作系统
    • Linux
      • CentOS
      • Ubuntu
    • *BSD
      • FreeBSD
      • NetBSD
      • OpenBSD

  1. 学习使用git
  2. 学习使用构建工具
  3. 学习一个小语种语言
    • Groovy
    • Scala
    • LISP, Common LISP, Schema, Clojure
    • R, Julia
    • Lua
    • Ruby
    • Rust
  4. 尝试了解编码的本质
    • 了解以下概念
      • 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的?
    • 写个程序自动判断一个文件是哪种编码
  5. 尝试了解时间的本质
  6. 了解浮点数
    • 0.1 + 0.1 + 0.1等于多少?
    • IEEE 754

相关资料

  1. http://git-scm.com/
  2. http://rogerdudler.github.io/git-guide/index.zh.html
  3. http://en.wikipedia.org/wiki/UTF-8
  4. http://www.iana.org/time-zones
  5. http://zh.wikipedia.org/wiki/IEEE_754
  6. http://en.wikipedia.org/wiki/IEEE_floating_point

  1. 参考node.js用Java实现一个 :)

相关资料

  1. 以上大部分相关资料