是时候该开始读一读JDK源码了
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
为什么要读JDK源码
当然不是为了装,毕竟谁没事找事虐自己 ...
1、面试跑不掉。现在只要面试Java相关的岗位,肯定或多或少会会涉及JDK源码相关的问题。
2、弄懂原理才不慌。我们作为JDK的使用者,虽然说天天用得很开心,但是有时候遇到问题还是得跟到底层源码去看看,才能帮助我们更好的弄懂原理,
3、学习优秀的代码、思想和模式。JDK毕竟是一个优秀的代码库,我们天天用,源码也就在里面,作为一个有志向的程序员,读一读源码也能让我们吸取到更多优秀的思想和模式。
4、睡前催眠。额 …… 不过的确有效(滑稽)。
源码难吗?
废话,当然有难度啦,不然我也不会到现在都还没看完,而且看了也经常忘,哭唧唧...
毕竟像JDK这种源码,和我们平常练手写小例子、写业务代码不一样,人家毕竟是 类库,为了性能、稳定性、通用性,扩展性等因素考虑,加入了很多辅助代码、泛型、以及一些设计模式上的考量,所以看起来肯定没有那么轻松,**没办法一眼看穿它。
**
所以这玩意儿肯定是一个长期的过程,我个人建议(包括我自己也是这样),有时候遇到一些问题,可以针对性地把某些组件或者某个部分的源码,跟到底层去看看,然后做点笔记,写点注释啥的,这样慢慢就能渗透到很多的内容了。
但是我们一定要有足够的信心,我坚信代码人家都写出来了,我就不信我看不懂!
源码该怎么看
1、方法一:按需阅读。如果对某个组件、语法或者特性感兴趣,或者遇到什么问题疑惑,可以有针对性地跟到底层源码按需查看,这也是一种比较高效,能快速树立信心的阅读方式。
2、方法二:系统化阅读。具体阅读内容和顺序建议下文详述。
3、多调试:如果仅仅靠眼睛看,然后脑补画面调试还是比较吃力的,最好还是借助IDE动手调试起来,走两步就知道了。
4、别光读,记得读完留下点什么。我觉得看了多少不重要,重要的是能输出多少,多总结、归纳,写注释,记笔记
所以下文准备搭建一个Java源码的阅读和调试环境,建议人手一个,每当心血来潮时、遇到问题时、碰到疑惑时、闲得无聊时都可以打开工程看一看源码,做做笔记和注释。
搭建源码阅读调试环境
我个人觉得看源码这个事情还是应该单独搞一个Java工程,源码放里面,测试代码也放里面,集中调试,集中看代码,集中写注释比较方便一些。
1、创建源码阅读项目
选择最普通的Java基础项目即可:
2、创建两个目录
分别为:
- source:稍后放置JDK源码进去
- test:放置测试代码,里面还可以按需要建立层级子目录
3、导入JDK源码
有很多小伙伴问JDK的源码在哪里呢?
远在天边,仅在眼前,其实在的JDK安装目录下就能找到。
JDK安装目录下有一个名为src.zip压缩包,这正是JDK源码!
将其解压后拷贝到上面项目的source目录下,这样JDK源码就导入好了。
有些小伙伴会有疑问,为什么要将JDK源码导一份放到这个项目里? 其实主要原因还是方便我们在源码里阅读、调试、以及做笔记和注释。
至于这份JDK源码怎么用上,下文继续阐述。
4、调试并运行
我们可以在test目录里去随意编写一段测试代码。
比如我这里就以HashMap为例,在test目录下创建一个子目录hashmap,然后在里面创建一个测试主入口文件Test.java,随意放上一段测试代码:
然后启动调试即可。
不过接下来会有几个问题需要一一去解决。
问题一:启动调试时Build报错,提示系统资源不足
解决方法: 加大Build process heap size。
设置方法:Preferences --> Build,Execution,Deployment --> Compiler,将默认700的数值加大,比如我这里设置为1700:
问题二:想从外层代码F7单步调试进入JDK源码内部,结果发现进不去
这是因为调试时,JDK源码受保护,一般单步调试不让进,但是可以设置。
解决方法:
Preferences --> Build,Execution,Deployment --> Debugger --> Stepping
问题三:如何对JDK源码做注释?
调试进入JDK源码以后,发现不能进行注释,每个文件上都有一个小锁的图标,这是因为现在关联的源码并不是我们项目里刚拷进去的源码,而是JDK安装目录下的src.zip只读压缩包。
解决办法: 重新关联JDK源码路径为本项目路径下的这一份JDK源码。
这样一来,我们就可以愉快地对JDK源码调试以及做注释了。
源码结构和阅读顺序
JDK源码毕竟太庞大了,所有都看不太现实,我们还是愿意根据日常使用和面试考察的频繁度来挖取重要的内容先看一看。
如果自己没有特别的规划,可以按照如下所示的建议阅读顺序往下进行:
具体的内容简介如下:
1、java.lang
这里面其实就是Java的基本语法,比如各种基本包装类型(Integer、Long、Double等)、基本类(Object,Class,Enum,Exception,Thread)等等...
2、java.lang.annotation
包含Java注解基本元素相关的源码
3、java.lang.reflect
包含Java反射基本元素相关的代码
4、java.util
这里面放的都是Java的基本工具,最典型和常用的就是各种容器和集合(List、Map、Set)
5、java.util.concurrent
大名鼎鼎的JUC包,里面包含了Java并发和多线程编程相关的代码
6、java.util.function +java.util.stream
包含Java函数式编程的常见接口和代码
7、java.io
包含Java传统I/O相关的源码,主要是面向字节和流的I/O
8、java.nio
包含Java非阻塞I/O相关的源码,主要是面向缓冲、通道以及选择器的I/O
9、java.time
包含Java新日期和期间相关的代码,最典型的当属LocalDateTime、DateTimeFormatter等
10、java.math
主要包含一些高精度运算的支持数据类
11、java.net
主要包含Java网络通信(典型的如:Socket通信)相关的源代码。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-03-26
本文作者:CodeSheep
本文来自:“掘金”,了解相关信息可以关注“掘金”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
“新基建”时代,物联网产业“加速度”
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 2020年初,新冠肺炎“黑天鹅”不期而至。疫情之下,经济不可避免深受影响,于是从2月中下旬开始,中央与地方政府密集发声、发布投资计划,力促“新基建”发展,旨在短期内“稳投资”、中长期为社会经济深入发展提供“新赋能”。 物联网是“新基建”的重要组成部分,同时,它也在“抗疫”中发挥出极大价值。物联网迎来了发展转折点,预期在行业增长速度、重点领域的发展,以及业务模式上都有变化。 行业整体:预期增速加快 根据国内相关研究机构数据,近年来国内物联网市场增速稳定在20%~25%,但笔者预期在新冠肺炎疫情后期及“新基建”的时代,增速将达到25%~30%,主要原因有4个方面。 首先,在此次抗击新冠肺炎疫情中,一些物联网业务爆发性增长,在固化需求后,得以迈上加速增长轨迹。在疫情中,体温检测、居家隔离监测、小区安全管理等需求大增,不可否认,部分市场将在疫情后退潮,但仍有部分需求将得以固化。一是暴露痛点,需要修补完善的,如智慧医疗、应急管理等;二是应急项目上马后,发觉效果良好,值得大范围推广的,如智能社区广播...
- 下一篇
新冠肺炎传染图谱建模与分析
一、背景与数据来源介绍 新型肺炎作为一种存在潜伏期的传染病,分析其传染关系及接触关系非常有利于疫情的防控,对疫后的研究分析也有帮助。本文将介绍基于图数据库对新型肺炎图谱进行建模与分析的过程及效果。 图数据库(Graph Database)是一种复杂关系数据的处理系统,一种使用顶点、边和属性来表示与存储数据,并以图结构进行语义查询的数据库。图数据库的关键概念是边,通过边将顶点连接在一起,从而进行快速的图检索操作。 图数据库非常适合用于分析此类关联关系数据,此次使用百度开源的HugeGraph图数据库作为分析工具。分析数据数据均来源于各地卫健委或权威网站公开公布,如北京、石家庄、温州、南昌、宜春等城市。分析场景包括: 疫情中分析,如:病例接触了哪些人以及个人的风险分析、高风险群体分析等; 疫情后分析,如:病毒传播路径、病毒变异、抗体等分析。 新型肺炎传染图谱 本次演示共导入了5类实体数据:包括正常人、病例、地址、交通工具、医院等数据信息,以及各类实体之间的关联关系,如“病例乘坐某交通工具”关系。 数据导入后效果 导入数据详细介绍如下: 1、病例数据:共导入了43条病例数据,包括病例的年龄...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果