深入JDK源码,这里总有你不知道的知识点!

Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础。

我们下面将总结和分析一下lang包下面最为基础和常用的几个部分。

1:常用的对象类型包

(1)其中最基础的类为Object,所有的对象都是继承于这个类的。我们知道所有的类如果没有显示的声明继承于哪个类的话,默认都会继承于Object类,这个类里面也有很多我们常用的方法的默认实现。

(2)然后就是字符串类了,我们常用的有String、StringBuilder和StringBuffer三个和字符串相关的类,在jdk1.8里面String类还增加了join静态方法用来结合多个字符串

(3)最好还有8种基本元素的包装类,里面对于每种不同类型的基本进行了包装,并提供了相应的操作方法。

2: 常用的异常类型包:

(1)异常全部继承于Throwable类,Throwable类是所有异常的基础类。

(2)Error类型是Throwable类的子类,这种异常表示的是一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等

(3)Exception类型是Throwable类的子类,这种异常表示程序可以处理、可以恢复的异常,对于这种异常应该在代码中进行处理,不应该被程序最终抛出。 Exception类又被分为两类,一类是需要检查的异常,是被强制要在代码中进行处理,另一类是运行时异常,是在代码运行的时候出错时出现。

3: 常用的接口包

(1)Comparable接口表示用于可以比较大小的类

(2)Runnable接口表示这个类是要被作为一个线程执行

(3)AutoCloseable接口表示类拥有资源,在销毁类的时候需要自动销毁拥有的资源。

(4)Iterable接口表示这个类可以执行foreach循环操作

4: 系统包

(1)System类,他里面包含了几个可以用于获得系统相关的有用方法。最常见的有获得系统时间,获得系统属性,获得系统0/1/2文件描述符,利用系统函数拷贝数组内容。

(2)Runtime类,他里面可以获得应用运行时的一些状态(主要包括使用的内存和cpu个数)和在应用运行时执行一些操作(程序退出、执行gc、设置退出时的钩子函数)。

(3)Thread类,他里面包括了线程相关的操作,主要有线程属性的设置(优先级、名称、类别)和改变线程运行状态(启动、睡眠、中断等)。

(4)ThreadLocal类主要是保存以线程级别的运行状态的类。

5: 注解包

这个系列的提供了可以用于自定义注解方法和一些常用的注解,其中最为重要的就是FunctionalInterface注解,一个接口如果使用了这个注解,则表示了具有lambda特性的接口。

6: 反射包

这个系列使得我们可以通过反射的方式得到对象的属性或者通过反射的方式执行对象的方法。主要常用的有Field、Method、Construct、Paramter、Array、Proxy几个类。

7: 其他包

其他类包括了一些不是太常用,但是在某些场景下特别有用的工具。

(1)Ref包提供了与 Java 垃圾回收器密切相关的引用类。这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 Java 垃圾回收器对它们所指向的对象进行回收。其好处就在于使者可以保持对使用对象的引用,同时 JVM 依然可以在内存不够用的时候对使用对象进行回收。

(2)Management包提供提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。最常用的有MemoryMXBean、MemoryPoolMXBean、RuntimeMXBean、ThreadMXBean四个获得不同类型数据的MXBean。

(3)Instrument包提供了提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务,利用它提供的Instrumentation类和ClassFileTrasformation类,利用这两个类加上-javaagent命令,可以在程序运行之前,完成对字节码的修改,利用这个方法可以有效的对程序进行监控。

最后附上一个关于jdk里面lang包里面常用类和方法的思维导图:

如果你觉得我们总结的知识可以帮到你,可以到加群: 632109190一起进行学习和讨论。

时间: 2024-10-08 14:45:21

深入JDK源码,这里总有你不知道的知识点!的相关文章

从JDK源码角度看并发的公平性

JAVA为简化开发者开发提供了很多并发的工具,包括各种同步器,有了JDK我们只要学会简单使用类API即可.但这并不意味着不需要探索其具体的实现机制,本文从JDK源码角度简单讲讲并发时线程竞争的公平性. 所谓公平性指所有线程对临界资源申请访问权限的成功率都一样,不会让某些线程拥有优先权.我们知道CLH Node FIFO等待队列是一个先进先出的队列,那么是否就可以说每条线程获取锁时就是公平的呢?关于公平性这里分拆成三个点分别阐述: ① 准备入队列的节点,此情况讨论的是线程加入等待队列时产生的竞争是

设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的1

最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u92-windows-x64),JDK安装路径里有个"src.zip"就是JDK的源码文件压缩包: 设置好环境变量的JAVA_HOME变量和PATH变量(JAVA_HOME变量值也是D:\Java\jdk-8u92-windows-x64). 然后打开Eclipse设置可以Debug模式调试

使用Eclipse跟踪JDK源码

首先我们要学会的是将JDK源码加载Eclipse中. 1.点"窗口"-->"首选项",选择左边的"Java"-->"已安装的JRE",然后选择我们安装的JRE,并单击它,然后选择右边的"编辑". 点"编辑"将出现如下的界面: 2.跟踪阅读源码 如上图,在我自己写的代码中包含了StringTokenizer类,我们要看它的具体定义,就只要按住"Ctrl"键,

eclipse中导入jdk源码、SpringMVC注解@RequestParam、SpringMVC文件上传源码解析、ajax上传excel文件

eclipse中导入jdk源码:http://blog.csdn.net/evolly/article/details/18403321, http://www.codingwhy.com/view/799.html. ------------------------------- SpringMVC注解@RequestParam:http://825635381.iteye.com/blog/2196911. --------------------------- SpringMVC文件上传源

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

JDK源码分析之concurrent包(三) -- Future方式的实现

上一篇我们基于JDK的源码对线程池ThreadPoolExecutor的实现做了分析,本篇来对Executor框架中另一种典型用法Future方式做源码解读.我们知道Future方式实现了带有返回值的程序的异步调用,关于异步调用的场景大家可以自行脑补Ajax的应用(获取返回结果的方式不同,Future是主动询问获取,Ajax是回调函数),这里不做过多说明. 在进入源码前,首先来看下Future方式相关的API: 接口Callable:有返回结果并且可能抛出异常的任务: 接口Future:表示异步

JDK源码之String、StringBuffer、StringBuilder

就String而言,平时工作中用得最多,但是很多时候还是用不好,有必要对他进行整体的分析下.如果看过Thinking in java,再看下JDK的源码,很多东西就会变得十分明了.现在对String的底层实现进行下分析. 首先是对构造函数而言,我工作中最常用到的可能就是new String(str)这个构造函数了,所以再在此关注这一个.这个构造函数是对传进来的String进行解析,将其放进一个数组当中,我们设定为arrayOfChar,String类定义了全局变量offset(偏移量),coun

阅读JDK源码有感

最近加班不是很严重,爱上了查看JDK源码,每天回来,准备一杯咖啡,开始阅读,受益良多.从上周开始阅读,觉得还是写下感想和学习心得比较好.以后每天阅读,每天记下收获.总体来说,我觉得JDK源码写得十分漂亮,无论是从代码风格还是从重用性来说,都是相当出色的.之前阅读过Thinking in java,感觉很多东西都不能深入理解,太过于理论化,现在结合JDK看来,又别有一番感悟.以前每次有面试,都会从网上收集一些面试题,死记硬背一些知识,HashMap与HashTable的区别啊之类的,但是看了JDK

JDK源码学习系列07----Stack

                                                               JDK源码学习系列07----Stack 1.Stack源码非常简单 package java.util; public class Stack<E> extends Vector<E> { // 版本ID.这个用于版本升级控制,这里不须理会! private static final long serialVersionUID = 122446316454

myeclipse调试代码的时候看不到变量的值和jdk源码重新编译

Q:myeclipse调试代码的时候看不到变量的值? A: 调试的类的Class文件里没有包含LocalVariableTable属性表, 这是因为在编译时,编译者为了减少文件大小而不把属性表的信息放在Class文件中. 使用命令为javac -g>http://hllvm.group.iteye.com/group/topic/25798--解决方法:需要重新编译一份用于debug版的. Q:重新编译jdk源码,启用debug信息 >http://www.cnblogs.com/thecat