接下来的几天开始JDK源码的学习和总结,之前看《java编程思想》的时候看到java的基础知识有很多,其中支撑着这些基础的基础中的基础当属JDK。JDK的基础代码里面又分了很多基础的模块,今天从最基础的java.lang包开始学习。本次JDK源码学习系列以JDK1.7为准。
  观察JDK的源码,可以看到,java.lang包下面最为基础和常用的几个部分包括:常用的对象类型包,常用的异常类型包,常用的接口包,系统包,注解包,反射包,其它包。

一、常用的对象类型包
1、Object类
  类Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。在Object类的方法里面会经常用到hashCode()和==与equals()的区别,有关==、equals()和hashcode()的源码分析请参看本人的另一篇博文。 java中的==、equals()、hashCode()源码分析
2、字符串类
  在字符串类中,最常用到的是String、StringBuilder和StringBuffer三个类,有关这三个类的比较参看本人的一下博文: String Stringbuilder StringBuffer的区别和应用
  本次JDK源码学习的是1.7版本,在这里简单提一下,1.8版本里面String类还增加了join静态方法用来结合多个字符串,有兴趣的同学可自行搜索学习。
3、8种基本元素的包装类
八种基本类型:

六种数字类型:
      四个整数型(byte,short,int,long)
     两个浮点型(douvle,float)
一种字符类型:char
一种布尔型:boolean

包装类对每种不同类型的基本进行了包装,并提供了相应的操作方法。

二、常用的异常类型包
1、Throwable类

  Throwable类是java中所有错误或者异常的超类,只有当对象是此类(或者其子类之一)的实例时,才能通过JVM或者Java的throw语句抛出。类似的,只有Throwable类或者其子类才可以是catch子句中的参数类型。Throwable包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。
2、Error类
  Error类是Throwable类的子类,这种异常一般表示与JVM有关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。
3、Exception类
  Exception类也是Throwable类的子类,这种异常是程序可以处理、可以恢复的异常,对于这种异常应该在代码中进行处理,不应该被程序最终抛出。Exception类又被分为两类,一类是需要检查的异常,是被强制要在代码中进行处理,一类是运行时异常,是在代码运行时出现的。

三、常用的接口包
1、Comparable接口

  Comparable接口用于可以比较大小的类。此接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序,类的comparaTo方法被称为它的自然比较方法。
  实现此接口的对象列表(和数组)可以通过Collection.sort和Arrays.sort进行自动排序。实现此接口的对象可以用做有序映射中的键或有序集合中的元素,无需指定比较器。
2、Runable接口
  Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了 Runnable。
  此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非你打算修改或增强类的基本行为,否则不应为该类创建子类。有关Runable和Thread的区别和使用请参看本人的另一篇博文:【Java线程】Thread && Runnable必知必会
3、Cloneable接口
  实现了Cloneable接口的类可以合法的使用Object.clone()方法对其实例进行按字段复制。 如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。 按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
  注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
  有关java对象的克隆以及属性拷贝请参看本人以下博文:Java提高—对象克隆(复制)/对象属性拷贝深复制浅复制: 深复制VS浅复制(MemberwiseClone方法介绍)
4、Iterable接口
Iterable接口表示这个类可以执行foreach循环操作。

四、系统包
1、System类
  System类包含一些有用的类字段和方法,是final类型,所以不能被实例化。在System类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分实用方法。
2、 Runtime类
   Runtime类里面可以获得应用运行时的一些状态(主要包括使用的内存和cpu个数)和在应用运行时执行一些操作(程序退出、执行gc、设置退出时的钩子函数)。
3、 Thread类
   Thread类里面包括了线程相关的操作,主要有线程属性的设置(优先级、名称、类别)和改变线程运行状态(启动、睡眠、中断等)。Thread的sleep()和wait()方法的区别

4、ThreadLocal类
  该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。每个线程都保持对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。

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

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

1、AccessibleObject类
  java.lang.reflect.AccessibleObject类是Field,Method和Constructor类对象的基类。 它提供了将反射对象标记为在使用它时抑制默认Java语言访问控制检查的功能。 当使用Fields,Methods或Constructors类对象来设置或获取字段,调用方法,或创建和初始化新的类实例时,执行访问分别检查(对于public,默认(包)访问,protected和private成员) 。 在反射对象中设置可访问标志允许具有足够权限的复杂应用程序(如Java对象序列化或其他持久性机制)以被禁止的方式操作对象。
2、Array类
  java.lang.reflect.Array类提供静态方法来动态创建和访问Java数组。 Array允许在get或set操作期间扩展转换,但如果发生缩小转换,则会抛出IllegalArgumentException异常。
3、Constructor类
  java.lang.reflect.Constructor类提供了一个类的单个构造函数的信息和访问权限。 构造函数允许在将实际参数传到newInstance()与底层构造函数的形式参数进行匹配时进行扩展转换,但如果发生缩小转换,则会抛出IllegalArgumentException异常。
4、Field类
  java.lang.reflect.Field类提供有关类或接口的单个字段的信息和动态访问。反射的字段可以是类(静态)字段或实例字段。字段允许在获取或设置访问操作期间扩展转换,但如果发生缩小转换,则会引发IllegalArgumentException。
5、Method类
  java.lang.reflect.Method类提供有关类或接口上单个方法的信息和访问权限。反映的方法可以是类方法或实例方法(包括抽象方法)。 当匹配实际参数以使用底层方法的形式参数调用时,方法允许扩展转换,但如果发生缩小转换,则会引发IllegalArgumentException异常。
6、Modifier类
  java.lang.reflect.Modifier类提供了用于解码类和成员访问修饰符的静态方法和常量。修饰符集合被表示为具有表示不同修饰符的不同位位置的整数。表示修饰符的常量的值取自“Java虚拟机规范”第4.1,4.4,4.5和4.7节中的表中。
7、Proxy类
  java.lang.reflect.Proxy类提供用于创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。

动态代理的使用在日常工作也会经常用到,如果理解不清楚,这部分的内容也是有一定的难度。通过学习源码可以加深自己对动态代理的理解,参看本人以下博文: 【动态代理】从源码实现角度剖析JDK动态代理

七、其它包
其他类包括了一些不是太常用,但是在某些场景下特别有用的工具。
(1)Ref包提供了与Java垃圾回收器密切相关的引用类。这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍Java垃圾回收器对它们所指向的对象进行回收。其好处就在于使者可以保持对使用对象的引用,同时JVM依然可以在内存不够用的时候对使用对象进行回收。
(2)Management包提供提供管理接口,用于监视和管理Java虚拟机以及Java虚拟机在其上运行的操作系统。最常用的有MemoryMXBean、MemoryPoolMXBean、RuntimeMXBean、ThreadMXBean四个获得不同类型数据的MXBean。
(3)Instrument包提供了提供允许Java编程语言代理检测运行在JVM上的程序的服务,利用它提供的Instrumentation类和ClassFileTrasformation类,利用这两个类加上-javaagent命令,可以在程序运行之前,完成对字节码的修改,利用这个方法可以有效的对程序进行监控。

java.lang包常用类和方法的思维导图:

【JDK源码】java.lang包常用类详解相关推荐

  1. 【JDK源码】java.io包常用类详解

    看完java.io的JDK源码,在网上发现一篇关于java.io中的类使用的文章总结的很全面,看完之后在原文的基础上加了一些自己的总结如下构成了本篇文章.原文地址 一.Java Io流 1. Java ...

  2. 【JDK源码】java.util.concurrent.atomic包常用类详解

    java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...

  3. 从源码分析RocketMQ系列-MQClientInstance类详解

    导语   在之前的分析中,看到有一个类MQClientInstance,这个无论是在Producer端还是在Consumer端都是很重要的一个类,很多的功能都是从这个类发起的,这边分享中就来详细的看看 ...

  4. java线程池ThreadPoolExecutor类详解

    线程池有哪些状态 1. RUNNING:  接收新的任务,且执行等待队列中的任务 Accept new tasks and process queued tasks  2. SHUTDOWN: 不接收 ...

  5. Mybatis源码学习(三)SqlSession详解

    前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...

  6. Java中的Runtime类详解

    Java中的Runtime类详解 1.类注释 /**Every Java application has a single instance of class Runtime that allows ...

  7. Caddy源码阅读(一)Run详解

    Caddy源码阅读(一)Run详解 前言 本次系列会讲解 caddy 整个生命周期涉及到的源码. 平时我们使用 caddy 都是使用 它的 二进制 分发文件,现在来分析 caddy 的 Run 函数. ...

  8. centos7 mysql 源码安装_CentOS7.4 源码安装MySQL8.0的教程详解

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以下为本人2018.4.23日安装过程的记录.整个过程大 ...

  9. stringtokenizer java_基于Java中的StringTokenizer类详解(推荐)

    StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析 ...

最新文章

  1. 洛谷P1110 报表统计 multiset stl好题
  2. java linux文件夹大小_Linux_Linux文件夹大小查看办法, 1. du -sh查看当前文件 - phpStudy...
  3. sql 新建发布 找不到存储过程_pgRouting教程九:使用GeoServer发布WMS/WFS接口
  4. PHP+Mysql 实现用户登录,注册界面
  5. mysql将查到的数据删除_MySQL数据库的基本操作——增、删、改、查
  6. EF使用CodeFirst创建数据库和表
  7. Java中怎么把文本追加到已经存在的文件
  8. openlayers添加按钮_OpenLayers3加载常用控件使用方法详解
  9. 20210424:力扣第237周周赛(下)
  10. 步骤1:mybatis工程的创建
  11. Linux(ARM glibc)使用libhybris调用Android(ARM bionic)
  12. 通过导航栏切换页面动画
  13. java --map遍历
  14. 【Android TV 开发】安卓电视调试 ( 开启网络远程调试 )
  15. project.management.cattle.io not found
  16. 机房计算机组网方案,网络机房测试方案
  17. CentOS 7 搭建企业内网 DNS 服务器
  18. Android 自定义控件之画篮球
  19. 永远不能懈怠,要记住,黎明之前,最为黑暗
  20. Resistors in Paralle题解

热门文章

  1. 手把手教您如何识别翻新机子
  2. 转发一份GoldenGate 配置文档,里面有参数说明,值得看
  3. Linux Shell常用技巧(五)
  4. Android 3D开发,OpenGL ES 的使用(一)
  5. index 把@前的截断作为
  6. API网关—系统的门面要如何做呢?
  7. 《阿里巴巴数据中台实践》深入理解
  8. 字符串的方法、注释及示例1.
  9. POJ 3723 - Conscription ( 最大权森林 / 最小生成树 )
  10. 《计算机网络》读书笔记(一)--计算机网络体系结构