我从毕业做程序员就开始用 Java,到现在已经工作快 20 年了。减去我做手游用 C++、Lua 的几年,再减去后来转管理写代码少的时间,我真正写 Java 代码的时间至少也在 10 年以上。

如果你问我“Java 已经精通了吗?”,说实话,还是有点心虚。

Java 博大精深,那么多知识点,肯定有我不懂的。另外,每个人对“精通”都有自己的理解,有人觉得是精于使用,有人觉得是精于底层原理,也有人觉得是精于框架。

但是,毕竟用 Java 十多年了,我可以说说我自己对“精通 Java”的理解。

Java 语言覆盖的知识很广泛,但是总的来说,最重要的是以下三个方面:

  1. Java 基础知识
  2. Java 并发编程
  3. JVM 底层知识

所以,所谓精通 Java 语言,可以大致等同于视为上述三个方面的精通。

Java 基础知识的精通主要体现在,能很顺畅的把 Java 的各种基础数据结构、各种内置对象,都融合到实际的场景中,能以最快的速度、最佳的方案,去解决实际中的工作问题。

比如,大家在项目中,经常是不会区分对象是强引用还是弱引用的,统统都是强引用。如果一个精通 Java 基础知识的工程师,就会根据实际情况,去灵活地运用强引用、弱引用。

Java 并发编程的精通主要体现在,能非常巧妙得把各种多线程设计模式以及并发包中的各种工具,去解决各种并发难题。

例如,使用 Future 和相关子类去提升程序的运行效率,用 CountDownLatch 去控制线程顺序。

JVM 底层知识的精通主要体现在,能很快速地通过优化 JVM,去提升项目的性能,也能非常迅速准确地去找到项目出现的底层问题,直接进行根源性的解决。

比如,我们正在写一个要嵌入到对方项目的一个监控客户端。这个客户端就需要保证不能因为它的嵌入,导致被嵌入项目的 CPU、内存出现大的耗费。也要保证,在不耗费大资源的情况下,还能快速无误地传递数据。这时候,我们就应该利用自己对 JVM 垃圾回收的深入理解,去搞对象池化。

总之,Java 语言本身的精通,就体现在能利用 Java 去最优的提供技术解决方案,也能创造性的解决各种复杂的技术难题。

下面咱们就分开看看,如何能精通这些知识和技能。

一、精通 Java 基础知识

要精通 Java 基础知识,大家可以深度思考一下我对各个知识点提出的几个问题:

Java 的类型转换

Java 是一种强类型语言,在编程中就离不开各种各样的类型转换。

可是大家有没有想过强制变换的底层细节是什么?有没有反过来想过,为什么 Java 向上转型是自动的,而向下转型却是强制的?

Java 的集合框架

Java 的集合框架用途是如此广泛,只要你开发个稍微复杂点的项目,就根本避不开要用它。在学习的时候,大家可以想想这么几个问题:

  • Java 的集合框架中的各种集合的最佳使用场景都是什么?
  • 集合框架中的各种集合的子类实现都是为了解决他们父类的哪些不足的?
  • 为什么在有了 Java 的集合框架后,我们还要使用 Guava 框架?

Java 的数组

Java 的数组大家都经常用了,可大家有没有想过:

  • 我们什么时候使用数组,什么时候使用集合?
  • Java 的底层是如何对数组的越界进行检查的?
  • 为什么 System.arrayCopy 方法会那么快?

Java 的 String

  • 你有没有仔细看过 String 的代码呢?
  • 有没有想过 String 为什么是不变的呢?
  • String 中的哪些方法创造出共享同一个 char 数组的字符串,又有哪些创造出有独立的 char 数组字符串呢?

接口和抽象类

Java 的接口和抽象类,在项目中如何最合适的使用一直都是一个不好解决的难题。大家在学习接口和抽象类的时候,可以想想:

  • Java 的接口相比抽象类有什么优势?又有什么劣势?
  • 它们之间的特点各有什么不同?
  • 有没有去看过一些开源项目中各个抽象类和接口是如何定义和使用的?

equals 和 hashcode

Java 的 equals 和 hashcode 方法之间总是有着重要的关联。

  • 为什么重写 equals 方法要求 hashcode 方法也要跟着重写?
  • hashcode 方法都有哪些用处?

Java 的泛型和枚举

Java 的泛型和枚举对初学者来说是个比较难理解的知识点。还请大家多去查证一下:

  • 泛型和枚举是为了解决什么问题才会被引入的?
  • Java 的泛型和枚举都有什么独有的特点?
  • 泛型和枚举使用最经常出现的错误都有哪些?

Java 的 IO、NIO

IO 和 NIO 这里的学习,我在以前的文章也提过几次了。除了以前文章提过的一些学习建议,这里也有几个问题还请大家思考一下:

  • Java 的 IO 有什么缺陷才会引入 NIO 的?
  • NIO 中有哪些是经常被开源框架着重使用的?

Java 的网络编程

Java 的网络原生编程大家可能真的不常用,但是它确实是 Java 中的非常重要的基础,Java 的各种和网络相关的重要开源框架,之所以能拥有如此卓越的性能,都离不开 Java 原生网络底层优秀。

  • 常用的 Java 开源网络框架,常用的编程模式有哪些?
  • Java 提供的网络编程基础,是不是还有什么不足之处?

Java 的正则表达式

Java 的正则表达式,可能很多工作多年的程序员掌握的也不好。但是,在做字符串匹配相关的业务时,是绕不开它的。

大家除了学习怎么使用正则表达式以外,还需要思考下:

  • 有相同功能,但是写法不同的正则表达式之间,性能是不是有大的差别?
  • 正则表达式能不能表达取反这个逻辑?
  • 正则表达式在匹配上有哪些不够用的地方?

Java 的 JDBC

  • 为什么我们总是习惯于 JDBC 的框架?
  • 我们有没有办法使用 JDBC 去获取数据库中的各种元数据?
  • JDBC 的整体架构是什么样的?
  • 有没有什么独特的地方你曾经在某些开源框架中见过?

Date、Time、Calendar

  • Java 的 Date、Time、Calendar 为什么难用?
  • 有没有你觉得可以改进的地方?
  • 为什么 JodaTime 这个框架会被人认为胜过 Java 的原生 Date、Time等。

2、精通 Java 并发编程

要精通 Java 并发编程,像准确理解进程和线程啊,弄懂死锁、Race Condition、编程模式什么的啊,已经算是必要的前提了。在这个基础上,大概要在基础上再深入学习如下三个方面:

线程的基础知识

这部分注意两个细微的知识点以及理解一个模型。

第一个知识点是 volatile 的特性,使用场景和底层实现细节。第二个知识点是 wait 和 sleep 的区别,掌握到 JVM 实现细节最好。

这两个知识点是妨碍咱们精通线程知识的两大主要阻碍。

除了这两个知识点,更要深入理解的就是 Java 的内存模型——除了了解 Java 的内存模型是个什么东西之外,还需要知道 Java 的内存模型为什么这样设计,这样设计的好处是什么,带来的问题又是什么?

Java 并发框架

这里说的并发框架,主要说的是 java.util.concurrent 下的接口和类。

建议除了跟着书练习一遍使用之外,最好是把里面的源码读一下。

多线程编程模式

以前我说大家找工作了解下多线程编程模式,看书就可以了。但是要精通的话,除了看书之外,最好找一些著名开源项目来学习。

比如 Netty,对照着多线程编程模式,把 Netty 中实现的模式代码都好好看一遍,明白各种模式的优缺点和模式之间是如何一起混用以达到最佳效果的。

3、精通 JVM 底层

对于 JVM 的学习,我曾经写过一篇文章,大家可以参考学习:如何学JVM

除了这篇文章的建议以外,我最近对研究 JVM 又有了一些新的感悟,补充如下:

  • 字节码方面:可以看《深入理解 JVM 字节码》

  • JVM 的垃圾回收方面:建议以《垃圾回收的算法与实现》为纲领,开始选择性的读《深入 Java 虚拟机:JVM G1GC 的算法与实现》,《JVM G1 源码分析和调优》其中一本书。

以上就是我对“精通 java”的理解。

怎么样,看完是不是心情很沉重,感觉学不动了?有这种感觉很正常,如果时间倒回十几年,我一下看到这么多内容我也发愁。

以上说的是给大家一个参考,你也可以问问身边的技术大牛对精通的理解。然后结合自己的工作现状,找到一个自己认可的方向,慢慢学起了。

只要我们尽力做了,谁都可以成为自己的英雄。


你好,我是四猿外。

一家上市公司的技术总监,管理的技术团队一百余人。

我从一名非计算机专业的毕业生,转行到程序员,一路打拼,一路成长。

我会把自己的成长故事写成文章,把枯燥的技术文章写成故事。

欢迎关注我的公众号,关注后可以领取高并发、算法学习资料。

学多少年才算“精通Java”?的更多相关文章

  1. 怎样才算精通Linux

    1.掌握至少50个以上的常用命令(包括grep.awk.sed.ps.find等等吧,熟练使用,基础的选项不用man) 2.熟悉Gnome/KDE等X-windows桌面环境操作 3.掌握.tgz.. ...

  2. 何为“精通Java”

    何为精通Java?本来Java仅仅是一门语言,但从应用技术的角度来看,精通Java是可以无边无际的.很可能你可以对James说:我精通J2EE.JVM.Java服务器.大数据等等一些和Java相关的应 ...

  3. Java进阶(二十)解疑答惑之何时字符串才算真正为空?

    解疑答惑之何时字符串才算真正为空? 在一次编码过程中,有一个现象一直困扰着自己,经过后台的不断调试,才发现原来有时候字符串的空非空.测试代码如下: // medname可为药品名称或药品ID Stri ...

  4. 你真的精通Java吗?

    简历和自我介绍上经常能够读到“精通Java”这样的话,有人和我说,精通Java的人太多了,精通Java已经不能算亮点.不能给自己加分了.可是事实真是这样吗? 对于语言的学习,我有一种观点,一是纵向,即 ...

  5. 我觉得主要靠积累,难度不是问题,主要靠时间积累,以及兴趣带来的学习能力(我觉得至少5年全职Qt开发经验,才能算精通)

    顺便想请教一下,你用QT有几年了? 3年不到 那感觉怎么样?是比较难,还是不难但需要时间才能掌握全部? 很多东西真的要拿来做项目了,才会懂.要靠积累.一开始看看理论貌似都很简单. 但是QT和C++本身 ...

  6. 资源很多,你却不会使用——以不变应万变才是自学Java的正确方法

    鄙人乐于寻找学习方法,在这里提出自己的见解,希望可以帮助想玩好Java而又感觉很难上手的同学对Java不再恐惧 现状 我们的同学们除了某月,某婷等等大神以外,想必仍然存在着一大批同学根本没有摸索到学习 ...

  7. 怎么样才算是精通 C++?

    C++是一门非常奇妙的语言.让人又爱又恨. 在知乎上看到的一个帖子.怎么样才算是精通C++,这里节选一些精彩的回复. 链接:http://www.zhihu.com/question/20201972 ...

  8. 如何精通java技术

    如何精通java技术 | 浏览:173 | 更新:2013-05-15 14:42 | 标签:java 对于一个程序员来说,精通JAVA可以说是他们的最高境界了.那么对于JAVA程序员来说,怎么才能精 ...

  9. 黑马程序员:轻松精通Java学习路线连载1-基础篇!

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

随机推荐

  1. Python_string.Template的使用

    Template是python string提供的一个字符串模板功能.主要用于文本处理 from string import Template s = Template('$who 在 $do') t ...

  2. JMeter_使用正则和JSON提取器参数化(常用于提取token)

    一.使用正则表达式提取器提取token 查看登录响应参数找出token.图中token为 "ticketString": "ccf26b17-a96f-4913-8925 ...

  3. vs2017 winform 组件 -- 总结

    1.ComboBox  [下拉框] (1) 添加选项 this.[控件名].Items.Add("内容") (2)设置下拉框 自动完成 模式 和 数据源 this.[控件名].Au ...

  4. centos7 配置rm命令失效。

    之前写过一篇alias别名的方法,但这个方法配置rm命令在重启后就无效了.而且重启后得输入source alias_test.sh.才可以 centos7 alias别名永久生效 原因是:root用户 ...

  5. 免费增加几个T电脑空间方法,拿去不谢

    大家好,我是咔咔 不期速成,日拱一卒 在刷吾爱时猛然间看到一篇帖子名为,免费增加几个T电脑空间方法,拿去不谢,作为一名电脑磁盘深度缺乏者,这种文章怎能逃离我的法眼. 点进去大概瞅了一眼,大致意思就是把 ...

  6. 马哈鱼血缘分析工具部署介绍--win 10

    马哈鱼血缘分析工具部署介绍--win 10 随着大数据技术的发展与普及,数据治理和数据质量变得越来越重要,数据血缘分析在业界悄然兴起并得到了广泛流行,马哈鱼是国内少有的一款专业且易用的血缘分析工具.本 ...

  7. 【JavaWeb】CVE-2016-4437 Shiro反序列化漏洞分析及代码审计

    Shiro反序列化漏洞分析及代码审计 漏洞简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.   Apache Shiro默认使用了CookieRe ...

  8. 「Python实用秘技04」为pdf文件批量添加文字水印

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...

  9. django_url配置

    前言 我们在浏览器访问一个网页是通过url地址去访问的,django管理url配置是在urls.py文件.当一个页面数据很多时候,通过会有翻页的情况,那么页数是不固定的,如:page=1.也就是url ...

  10. 巧用 Base62 解决字段太短的问题

    最近银联一纸 259 号改造通知,所有支付机构开始改造支付交易,上传终端信息. 不知道其他支付机构的小伙伴针对这次改造是否开始了? 由于这次银联给的时间非常少,我们这边改动涉及到相关上游一起改造,所以 ...