0

    Java学习路线图(整理中,欢迎纠正)

    2023.04.26 | admin | 245次围观

    * 如果有点不明白nio的意图的话,了解一下c10k问题。

    * 如果身体没有异样的话,大概了解一下操作系统(包括C语言)提供的select, poll, epoll, kqueue等接口。

    * 如果身体仍然没有异样的话,试着用java.nio写一个文件服务器。

    * 如果还有精力的话,上网扒一扒有没有其他的通信库,如netty等。

    2. 如果关心Web还有HTTP,就学习一下HTTP协议,以及用Java进行HTTP的客户端编程。

    * 如果还舒服,学学HTML,写写HTML的静态网页(不需要Java)

    * 如果还舒服,用Java写一个基于DOM、XPath或者CSS Selector的网页解析器(爬网页)。

    * 如果还舒服,学学Java的Servlet接口(先别学jsp)进行Web服务器端编程。学学标准的Servlet容器怎么用,包括web.xml的用法以及listener、filter等概念。以及某个Servlet容器(如Jetty或者Tomcat)的具体用法。

    * 如果仍然还舒服,试着学一种模板语言(如haml, velocity, freemarker,【还有其他更好的框架吗?我不知道】, String.format,如果真的想学JSP的话JSP倒是也行,但不推荐)。

    * 如果仍然觉得舒服,学学Spring框架中的Web框架,或者Struts,看你的口味。

    * 如果还舒服,看看Spring Bean Container以及里面各种乱七八糟的工具。

    * 如果还舒服,或者有需求虚拟网络编辑器没有桥接模式,了解一下什么是RESTful Web Service,复习一下HTTP,找找适合的Java工具。

    * 你可能会觉得Jackson是一个解析JSON用的好用的东西。

    【数据库】学习一下关系数据库(计算机专业的应该学过,复习一下),包括SQL。选一个数据库管理系统熟悉一下(比如MariaDB,或者(如果你不讨厌Oracle的话)用被Oracle收购了的MySQL。先脱离Java单独学学)。然后看它们的官方文档教你怎么用Java连接这种数据库。这中间会涉及到JDBC接口。同时一定要知道SQL注入安全漏洞,以及掌握如何用PreparedStatement防止注入!!。建议看

    * 可能中间会涉及“事务”问题,让你不知不觉地开始去了解java transaction api(JTA)。

    * 如果还舒服,学一学对象关系转换(如Hibernate)。

    * 也可以学学非关系数据库,以及如何用Java访问它们。

    【日志记录】学习一下slf4j和logback的用法。

    * 如果有精力的话,大概了解一下世界上有多少种Java日志框架,以及slf4j是怎么桥接这些框架的。

    【构建(build)系统】学习一下Ant的用法。

    * 如果还舒服的话,学习一下用Ivy从Maven的仓库里下载软件包,解决依赖关系。

    【版本控制】学习一种分布式版本控制器(如Git、Mercurial、Bzr、Darcs等,推荐Git)的基本用法虚拟网络编辑器没有桥接模式,以及如何用它管理Java工程。希望你已经开始使用Maven了,并且知道为什么把IDE生成的工程文件(如eclipse的.project,.classpath和.metadata)放入版本控制器不好。然后了解一下如何在IDE中使用版本控制(Eclipse自带Git插件)。

    * 如果感觉很舒服的话,为你们实验室搭建一个Linux+SSH+Git服务器,装个GitLab(一种Web界面)。

    * 了解“集中式版本控制器”和“分布式版本控制器”的区别,并说服同事们不要再用SVN、CVS或者SourceSafe等老旧的“集中式版本控制器”了。

    * 开设一个GitHub账户。如果你不喜欢Git,就用BitBucket等。

    【持续集成】自己(或者为你们实验室)搭建一个持续集成(Continuous Integration)服务器,如Jenkins,定期编译你的程序。建议同时使用Git等分布式版本控制器。

    * 如果你做开源软件,试试GitHub和Travis。

    【零碎工具】淘一淘java.nio.files里面有什么好用的东东,然后再淘一淘Apache Commons Lang和Commons IO里有什么好用的工具。Commons Logging就不要再用了,用SLF4j和Logback。

    【XML】学学XML、DOM、XPath。XML这东西到处都可能用到。也可以用它写自己的配置文件。

    * 如果觉得不舒服了,就学学JSON和YAML。

    * 如果还是不舒服,就学学文本文件解析。

    【语法分析和编译器】学学Antlr或者别的Parser Generator的用法

    * 如果觉得舒服,自己写一个计算器。

    * 如果还觉得舒服,自己写一种Domain-Specific Language (DSL)。

    【高效容器】学学FastUtil或者Trove,如果你需要进行大量数值运算的话。

    【分布式计算】学学MapReduce的思想以及它的实现。

    * 如果还舒服,学学Scala语言以及号称比MapReduce快得多的Apache Spark。

    【进程间通信】看看ActiveMQ、MINA和RMI。

    【其他语言(JVM)】学习另一门跑在JVM上的语言或者实现(如Groovy、Scala、Clojure、JRuby、Jython、JavaScript……)

    * 如果还舒服,学一学Java Scripting API(注意不是JavaScript。给个链接:),然后试着在自己的Java程序里嵌入脚本。

    【其他语言(非JVM)】学习另一门通用脚本语言(如Python、Ruby,其实perl也行,但不推荐),知道什么时候Java不是最好的选择。

    【Java语言和Java虚拟机】通读一遍(一目十行地读,不用细读)Java Language Specification,以及Java Virtual Machine Specification。

    * 了解以下解释器(interpreter)、编译器(compiler)、即时编译器(just-in-time compiler)和优化器(optimiser)的概念。

    * 如果对编译器的话题不感到畏惧,了解一下method JIT和tracing JIT的概念和区别。

    【内存管理】学学垃圾回收的几种基本算法,包括mark-sweep、mark-compact、semi-space、generational、mark-region等,各自的性能,以及为什么朴素的reference counting是不完整的。知道为什么finalizer性能很糟糕,而且标准并不要求finalizer在程序退出前一定会执行。

    * 如果还舒服,了解一下如何设置Java虚拟机的堆大小限制(如HotSpot虚拟机的-Xmx选项等)。

    * 了解一下Java里的WeakReference以及SoftReference和PhantomReference,以及它们什么时候有用,以及为什么它们实现起来有些困难。

    * 如果有精力,了解一下Hotspot虚拟机的内存管理算法是什么样的。

    【动态装载】学学Java的动态装载(class loading)

    * 如果还舒服的话,学学OSGI以及它的一种实现(如Felix或者Equinox)

    * 如果仍然很舒服的话,学学写基于Eclipse平台的程序。不是Eclipse集成开发环境,只是利用他们的图形框架,写自己的应用程序。

    * 如果还觉得舒服的话,写Eclipse集成开发环境的插件。

    【本地/外语接口】学习一下Java Native Interface(JNI),试着写一个Java和C语言混合编程的程序。

    * 如果觉得不舒服了或者觉得欲仙欲死,就学一学Java Native Access(JNA),试一试不用任何胶水代码而从Java直接装载C库,直接调用C函数。

    * 如果连JNA也懒得学,就学一学SWIG,自动生成绑定。

    * 如果觉得舒服,就学一学Java Virtual Machine Tooling Interface(JVMTI),用C程序来监视JVM的状态。

    【密码学】学一学密码学,包括编码、密码分析、攻击、对称密钥、公钥系统、数字签名、哈希算法等,看看Java有没有实现。

    * 如果觉得有点不舒服(你应该不会觉得舒服吧,除非你是学密码学的,要不然总会觉得自己写的程序有安全漏洞),就写一个“人品计算器”来放松一下,要求每次输入同一个姓名,得到的人品值是固定的,但又要让人无法用别人的人品值猜自己的人品值。

    【移动终端】学一学Android开发。

    * 如果有精力的话,看看Dalvik虚拟机是怎么回事。

    * 建议买一个iPhone或者iPad,或许你再也不想用Android手机或者平板了。

    【历史】如果觉得有些无聊,就去挖一挖历史上比较火的可能和Java相关技术,比如:

    * Applet,想想它比起html5+css3+javascript的缺点在哪里。

    * AWT、Swing,想想为什么很少有人用Java写图形界面程序。你觉得Swing的程序看上去舒服吗?中国人和残疾人喜欢用Swing程序吗?

    * JNDI,想想它比起Spring Bean Container的缺点在哪里。

    * JSP,想想它比起MVC结构的缺点在哪里。

    * WSDL/SOAP,把它们和XML-RPC、RESTful Web Service比较一下。

    * XSLT,以及为什么它是图灵完备的。可是它真的比Java本身更好用吗?

    * Log4j、java.util.logging、Apache Commons Logging,各自有什么问题,以及Log4j的作者本人为什么又开发了SLF4j和Logback?

    * Java最早是为什么设计的?

    * Type erasure是怎么回事?为什么ArrayList不行但ArrayList就可以?挖一挖历史。

    --

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论