jdk源码阅读_jdk源码阅读顺序 - CSDN
精华内容
参与话题
  • JDK源码阅读顺序

    万次阅读 多人点赞 2020-01-04 15:16:54
    很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。 标题为包名,后面序号为优先级1-4,优先级递减 1、java.lang 1) Object 1 2) String 1 3) ...

    很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。
    标题为包名,后面序号为优先级1-4,优先级递减
    1、java.lang

    1) Object 1
    2) String 1
    3) AbstractStringBuilder 1
    4) StringBuffer 1
    5) StringBuilder 1
    6) Boolean 2
    7) Byte 2
    8) Double 2
    9) Float 2
    10) Integer 2
    11) Long 2
    12) Short 2
    13) Thread 2
    14) ThreadLocal 2
    15) Enum 3
    16) Throwable 3
    17) Error 3
    18) Exception 3
    19) Class 4
    20) ClassLoader 4
    21) Compiler 4
    22) System 4
    23) Package 4
    24) Void 4
    

    2、java.util

    1) AbstractList 1
    2) AbstractMap 1
    3) AbstractSet 1
    4) ArrayList 1
    5) LinkedList 1
    6) HashMap 1
    7) Hashtable 1
    8) HashSet 1
    9) LinkedHashMap 1
    10) LinkedHashSet 1
    11) TreeMap 1
    12) TreeSet 1
    13) Vector 2
    14) Queue 2
    15) Stack 2
    16) SortedMap 2
    17) SortedSet 2
    18) Collections 3
    19) Arrays 3
    20) Comparator 3
    21) Iterator 3
    22) Base64 4
    23) Date 4
    24) EventListener 4
    25) Random 4
    26) SubList 4
    27) Timer 4
    28) UUID 4
    29) WeakHashMap 4
    

    3、java.util.concurrent

    1) ConcurrentHashMap 1
    2) Executor 2
    3) AbstractExecutorService 2
    4) ExecutorService 2
    5) ThreadPoolExecutor 2
    6) BlockingQueue 2
    7)AbstractQueuedSynchronizer 2
    8)CountDownLatch 2
    9) FutureTask 2
    10)Semaphore 2
    11)CyclicBarrier 2
    13)CopyOnWriteArrayList 3
    14)SynchronousQueue 3
    15)BlockingDeque 3
    16) Callable 4
    

    4、java.util.concurrent.atomic

    1) AtomicBoolean 2
    2) AtomicInteger 2
    3) AtomicLong 2
    4) AtomicReference 3
    

    5、java.lang.reflect

    1) Field 2
    2) Method 2
    

    6、java.lang.annotation

    1) Annotation 3
    2) Target 3
    3) Inherited 3
    4) Retention 3
    5) Documented 4
    6) ElementType 4
    7) Native 4
    8) Repeatable 4
    

    7、java.util.concurrent.locks

    1) Lock 2
    2) Condition 2
    3) ReentrantLock 2
    4) ReentrantReadWriteLock 2
    

    8、java.io

    1) File 3
    2) InputStream   3
    3) OutputStream  3
    4) Reader  4
    5) Writer  4
    

    9、java.nio

    1) Buffer 3
    2) ByteBuffer 4
    3) CharBuffer 4
    4) DoubleBuffer 4
    5) FloatBuffer 4
    6) IntBuffer 4
    7) LongBuffer 4
    8) ShortBuffer 4
    

    10、java.sql

    1) Connection 3
    2) Driver 3
    3) DriverManager 3
    4) JDBCType 3
    5) ResultSet 4
    6) Statement 4
    

    11、java.net

    1) Socket 3
    2) ServerSocket 3
    3) URI 4
    4) URL 4
    5) URLEncoder 4
    

    阅读笔记简版

    1、ArrayList

    1)Object[] elementData:数据存储
    2)int size:使用数量
    3)int modCount:操作次数
    4)初始化:
      a、指定容量初始化数组;
      b、不指定容量第一次add数据时初始化数组容量10
    5)扩容:
      a、1.5倍;
      b、不够取所需最小;
      c、新容量大于MAX_ARRAY_SIZE(Integer.MAX_VALUE-8),按所需容量取MAX_ARRAY_SIZE和Integer.MAX_VALUE较小值
    

    2、LinkedList

    1) Node {E item, Node prev, Node next}
    2) int size
    3) Node first
    4) Node last
    5) linkFirst(), linkLast(), linkBefore(), unLinkFirst(), unLinkLast(), unLink(), indexOf()
    6)int modCount
    

    3、HashMap

    1) Node{int hash, K key, V value, Node next}
    注:hash是根据key算的
    2) Node[] table:数据存储,默认大小16
    3) Set<Map.Entry> entrySet:用于Map遍历的集合
    4) int size:当前数量
    5) int threshold:size超过多少时需要扩容,默认16
    6) float loadFactor:负载因子,默认0.75f
    7)int modCount:操作次数
    8) put():根据key算hash,根据容量和hash算index,table[index]没有直接添加到数组中,table[index]有,若index位置同一个key则更新,否则遍历next是否有,有则更新,无则新增
    注:判断key是否相等,先比较hash,若相等在比较equals
    9)扩容:put后,当size>threshold时需要扩容,扩容时容量翻倍,重新算hash复制到新数组
    10)哈希冲突:1.7以前数组+链表,1.8开始数组+红黑树
    11)get()类似
    

    4、ConcurrentHashMap

    1) JDK1.7及以前:
    	a、Segment[] ,HashEntry[] , HashEntry{hash, k, v, next}
    	b、根据key算hash,根据hash和Segment的大小算位置,每个segment拥有一个自己的HashEntry[]
    	c、get():不加锁,volatile类型
    	d、put(): 对相应segment加锁
    	e、size():各HashEntry[] 之和,先不加锁算两遍,若一致则返回,若不一致则加锁重新计算
    2)JDK1.8
    	a、Node{hash, key, value, next}
    	b、Node[] table
    	c、大多数操作类似于HashMap,根据key算hash,在根据hash和容量算index,对table[index]加锁,从而达到更大的并发量
    	d、get(): 同HashMap
    	e、put(): 对table[index]加锁,如果table[index]为null则使用CAS操作,如果不为null对table[index]加synchronized
    

    5、Hashtable

    1) 结构实现与HashMap基本一致
    2)通过synchronized方法保证线程安全
    

    6、LinkedHashMap

    1)继承HashMap
    2) Entry{HashMap.Node, Entry before, after}
    3) Entry head, tail
    4) 重写newNode()添加节点时,除像HashMap中添加外,保存before、after信息
    

    7、TreeMap

    1)红黑树,即自平衡二叉查找树,时间复杂度O(logn)
    2)Entry{K k, V v, Entry parent, left, right, boolean color}
    3)Entry root,int size, int modeCount
    

    8、Object

    1) wait(), notify(), notifyAll(), wait(timeout)
    2) hashCode(), equals()
    3) clone()
    

    9、String

    1) final char[] value
    2) int hash
    3) equals(), startWith(), endWith(), replace
    

    10、AbstractStringBuilder

    1) char[] value
    2) int count
    3) 扩容:翻倍,不够取所需最小
    

    11、StringBuilder:继承AbstractStringBuilder
    12、StringBuffer

    1) 继承AbstractStringBuilder
    2) synchronized方法保证线程安全
    3) char[] toStringCache
    

    13、Set一般都是使用委托模式到Map
    14、AbstractMap维护EntrySet,AbstractSet维护Iterator,AbstractList维护Iterator

    展开全文
  • 一、类 1.1 类修饰符 A. Object是所有类的父类。 B.包括数组在内的所有对象都实现了Object类中的方法。...另外包含了一个静态代码块。 绿色打开的锁代表是public, 红色关闭的代表是private, ...

    一、类

    1.1 类修饰符

    A. Object是所有类的父类。

    B. 包括数组在内的所有对象都实现了Object类中的方法。

     

    1.2 类结构图

     

    二、字段

    1.1 字段列表

    无。

     

    三、方法

    3.1 方法列表

    注:如上图,共有12个方法。另外包含了一个静态代码块。 

            绿色打开的锁代表是public,  红色关闭的代表是private, 灰色的钥匙代表的protected。

    3.2 方法修饰符


    3.3 方法详解

    3.3.0 [静态]代码块

    如图: 就是简单的调用了一下registerNatives方法,初始化另外几个native的方法。

     

    3.3.1 构造函数

    默认的无参构造函数。

    注: 如果构造函数内什么操作都没有,那么该方法会省略不写,如Object。如果有特殊处理,则会手动写出来,如ArrayList。

     

    3.3.2 registerNatives()

    A. 首先native修饰的方法表明该方法的实现不是在JDK中,而是在操作系统中由C/C++中实现,并被编译成了 .dll 文件,由java去调用。对于不同平台,其具体的实现应该有所不同。

    B. 网上找了一下,该方法主要是针对该类中的几个本地方法如hashCode, getClass等进行注册,也就是初始化java方法映射到C的方法中。

     

    3.3.3 getClass()

    A. 返回此对象的运行时类。返回的类对象是由表示类的静态同步方法锁定的对象。

    B. 实例.getClass()调用的返回结果和Class.class结果返回相同,如下例子:

     

    3.3.4 hashCode()

    A. 返回对象的哈希值,该方法支持像HashMap这类的哈希表的实现。

    B. 每当JAVA应用程序执行过程中在同一对象上多次调用时,只要没有修改equals方法, 那么该方法必定返回相同的哈希码。

    C. 从应用程序的一次执行到同一应用程序的另一次执行,这个哈希值不需要保持一致。

    D. 如果俩个对象根据equals方法进行比较时二者相等,则这俩个对象调用hashCode方法获取的哈希码必定相同;  如果俩个对象根据equals方法进行比较二者不相等时,这俩个对象调用hashCode方法获取的哈希码也可能相同。此时,二者没有必然联系。但是,程序员应该知道,为不同的对象生成不同的整数结果可能会提高哈希表的性能。

    E. 只要合理可行,类对象定义的hashcode方法就不会为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换成整数来实现的,但是这种实现技术不是Java编程语言所需要的。)

     

    3.3.5 equals()

    A. 表示其他对象是否“等于”这个对象。

    B. 请注意,每当这个方法被覆盖时,通常都需要覆盖hashCode方法,以便维护hashCode方法的一般契约,该方法声明相等的对象必须具有相等的哈希值。

     

    3.3.6 clone

    A. 创建并返回此对象的副本。该方法执行的是“浅拷贝”,而不是“深拷贝”。该方法将创建该对象类的一个新实例,并使用该对象相应字段的内容初始化所有字段,就像通过赋值一样,这些字段的内容本身不是克隆的;

    B. 按照惯例,该方法返回的克隆对象应该是独立的。为了实现这种独立,在返回之前,可能需要通过super.clone()方法改变一个或多个该对象的字段。通常,这意味着,如果要复制的对象内部引用了一些可变对象,那么复制后返回的对象,对这些可变对象的引用应该是指向这些可变对象的副本;

    C. 如果一个类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常;Object类本身没有实现Cloneable接口,所以调用clone方法的如果是Object类的话,会导致在运行时抛出异常; 所有数组类型都被认为已经实现了Cloneable接口,而且一个数组T[]调用该方法的返回类型是数组T[],其中,T是任意的引用或原始数据类型。

     

    3.3.7 toString

    A. 返回一个表示这个对象的字符串。该字符串组成为: 类全名 + @ +  对象的哈希值的未签名的十六进制 组成。

    B. 如下图:

     

    3.3.8 notify()

    A. 激活正在等待此对象监视器的单个线程。如果有线程正在等待这个对象,那么会选择唤醒其中一个线程。选择是任意的,并由实施者自行决定。线程通过调用其中一个wait方法来等待对象的监视器;

    B. 在当前线程放弃此对象上的锁之前,唤醒的线程将无法继续。唤醒线程将以通常的方式与任何其他可能在该对象上为同步而主动竞争的线程竞争;例如,唤醒线程在成为下一个锁定该对象的线程时不享有可靠的特权或劣势;

    C. 此方法只能由该对象监视器的所有者线程调用。线程通过以下三种方式之一成为对象监视器的所有者: 

         c1. 通过执行该对象的同步实例方法;

         c2. 通过执行在对象上同步的synchronized语句体;

         c3. 对于Class类型的对象,通过执行该类的同步静态方法;

    D. 一次只能有一个线程拥有对象的监视器;

     

    3.3.9 notifyAll()

    A. 唤醒正在等待此对象监视器的所有线程。线程通过调用其中一个wait方法在对象的监视器上等待;

    B. 在当前线程放弃此对象上的锁之前,唤醒的线程将无法继续。唤醒的线程将以通常的方式与任何其他可能在该对象上为同步而主动竞争的线程竞争;例如,唤醒的线程在成为下一个锁定该对象的线程时不享有可靠的特权或劣势;

    C. 此方法只能由该对象监视器的所有者线程调用。有关线程成为监视器所有者的方式的描述,请参阅notify方法;

     

    3.3.10 wait(long timeout)

    A. 使当前线程等待,直到另一个线程为此对象调用notify方法或notifyall方法,或者指定的时间已过;

    B. 当前线程必须拥有此对象的监视器;

    C. 此方法使当前线程将自身置于此对象的等待集中,然后放弃此对象上的所有同步声明。出于线程调度目的,线程将被禁用,并处于休眠状态,直到发生以下四种情况之一: 
          c1. 其他一些线程调用此对象的notify方法,而线程恰好被任意选择为要唤醒的线程;

          c2. 其他一些线程为此对象调用notifyall方法;

          c3. 其它一些线程interrupt方法终端当前线程;

          c4. 指定的实时时间已过,或多或少。但是,如果超时为零,则不考虑实时性,线程只需等待通知;

    然后将线程从该对象的等待集中删除,并重新启用线程调度。然后,它以通常的方式与其他线程竞争在对象上同步的权利;一旦它获得了对象的控制权,它在对象上的所有同步声明都将恢复到当前状态。也就是说,在调用wait方法时的情况下。然后线程从wait方法的调用返回。因此,从wait方法返回时,对象和线程的同步状态与调用wait方法时的状态完全相同;

    D. 线程也可以在不被通知、中断或超时的情况下唤醒,这就是所谓的假唤醒。虽然在实践中很少发生这种情况,但是应用程序必须通过测试导致线程被唤醒的条件来防范这种情况,并且如果条件不满足,继续等待。换句话说,等待应该总是以循环的形式出现;

    E. 如果当前线程在等待前或等待时被任何线程中断,则会引发InterruptedException。在按照上述说明还原此对象的锁定状态之前,不会引发此异常;

    F. 请注意,wait方法在将当前线程放入该对象的等待集时,只解锁该对象;当线程等待时,可以同步当前线程的任何其他对象都将保持锁定状态。

    G. 此方法只能由该对象监视器的所有者线程调用。有关线程成为监视器所有者的方式的描述,请参阅notify方法。

     

     

    3.3.11 wait(long timeout, int nanos)

    A. 使当前线程等待,直到另一个线程为此对象调用notify方法或notifyall方法,或某个其他线程中断当前线程,或经过一定的实时时间;

    B. 此方法类似于一个参数的wait方法,但它允许更好地控制在放弃之前等待通知的时间。以纳秒为单位的实时量表示为:1000000*timeout+nanos(纳秒)。在所有其他方面,此方法与一个参数的方法wait(long)执行相同的操作。特别地,wait(0,0)与wait(0)的含义相同;

    C. 当前线程必须拥有此对象的监视器。线程释放此监视器的所有权,并等待直到出现以下两种情况之一:

         c1. 另一个线程通过调用notify或notifyall方法通知等待此对象监视器的线程唤醒;

         c2. 超时时间(由timeout毫秒加nanos纳秒参数指定)已过。

        然后线程等待,直到它可以重新获得监视器的所有权并继续执行;

    D. 与单参数版本一样,中断和虚假唤醒是可能的,并且该方法应始终在循环中使用;

    E. 此方法只能由该对象监视器的所有者线程调用。有关线程成为监视器所有者的方式的描述,请参阅notify方法;

     

    3.3.12 public final void wait()

    A. 使当前线程等待,直到另一个线程为此对象调用notify方法或notifyall方法。换句话说,这个方法的行为就好像它只是执行调用wait(0)方法;

    B. 当前线程必须拥有此对象的监视器。线程释放此监视器的所有权,并等待直到另一个线程通过调用notify方法或notifyall方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并继续执行。

    C. 与单参数版本一样,中断和虚假唤醒是可能的,并且该方法应始终在循环中使用;

    D. 此方法只能由该对象监视器的所有者线程调用。有关线程成为监视器所有者的方式的描述,请参阅notify方法;

     

    3.3.13 finalize()

    A. 当垃圾回收确定不再有对对象的引用时,由垃圾回收器对对象调用。子类重写Finalize方法以释放系统资源或执行其他清理;

    B. 通常finalize方法约定:如果Java虚拟机已经确定不再有任何手段可以通过任何尚未死亡的线程访问该对象,则调用它,除非由于某个其他对象或类的终结所采取的操作,而该对象或类已准备好finalized。Finalize方法可以采取任何操作,包括使该对象再次可用于其他线程;但是,Finalize的通常目的是在不可撤销地丢弃该对象之前执行清理操作;

    C. Object类对象的finalize方法执行任何特殊操作,它只是正常返回。Object的子类可能会覆盖此定义;

    D. Java编程语言不能保证哪个线程将调用任何给定对象的finalize方法。但是,可以保证调用finalize的线程在调用finalize时不会持有任何用户可见的同步锁。如果Finalize方法引发未捕获的异常,则忽略该异常并终止该对象的Finalize;

    E. 在已为对象调用finalize方法之后,不再采取进一步的动作,直到Java虚拟机再次确定不再有任何方法可以通过任何尚未被访问的线程访问该对象,包括其他对象或类准备完成的可能动作,此时物体可能被丢弃。

    F. 对于任何给定的对象,Java虚拟机绝不会对其进行多次调用finalize方法;

    G. Finalize方法引发的任何异常都会导致终止此对象的Finalize,但否则将被忽略。

     

     

    四. JDK8源码阅读系列链接

    1. JDK8源码阅读(一) java.util.Object
    2. JDK8源码阅读(二) java.util.Objects
    3. JDK8源码阅读(三) java.io.Serializable   
    4. JDK8源码阅读(四) java.lang.Comparable
    5. JDK8源码阅读(五) java.lang.CharSequence
    6. JDK8源码阅读(六) java.lang.String

    注: 今年要把JDK的一些基本的类的源码整理出来,欢迎大家指正和讨论。

             如果有错误的地方,欢迎各位老师指正。

             如果您觉得还不错,点个赞的话  我会很感激的,谢谢~

             转载请注明链接来源即可。

     

     

     

     

     

     

    展开全文
  • JAVA JDK源码在线阅读

    千次阅读 2019-08-17 19:09:44
    Java的版本是1.8.0_111,我把JDK源码发布到了github上,大家看起来也比较方便,地址: https://github.com/daiqingliang/java_jdk1.8.0_111 在提供一个rt.jar包源码的地址(JDK源码中用了很多rt.jar中的类,例如...

    Java的版本是1.8.0_111,我把JDK源码发布到了github上,大家看起来也比较方便,地址:

    https://github.com/daiqingliang/java_jdk1.8.0_111

    在提供一个rt.jar包源码的地址(JDK源码中用了很多rt.jar中的类,例如sun.misc.Unsafe类,都包含在rt.jar中):

    https://github.com/daiqingliang/rt-source.git

     

    下面是转载的JDK源码阅读顺序,原文:https://blog.csdn.net/qq_21033663/article/details/79571506

    很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。 
    标题为包名,后面序号为优先级1-4,优先级递减 
    1、java.lang

    1) Object 1
    2) String 1
    3) AbstractStringBuilder 1
    4) StringBuffer 1
    5) StringBuilder 1
    6) Boolean 2
    7) Byte 2
    8) Double 2
    9) Float 2
    10) Integer 2
    11) Long 2
    12) Short 2
    13) Thread 2
    14) ThreadLocal 2
    15) Enum 3
    16) Throwable 3
    17) Error 3
    18) Exception 3
    19) Class 4
    20) ClassLoader 4
    21) Compiler 4
    22) System 4
    23) Package 4
    24) Void 4



    2、java.util

    1) AbstractList 1
    2) AbstractMap 1
    3) AbstractSet 1
    4) ArrayList 1
    5) LinkedList 1
    6) HashMap 1
    7) Hashtable 1
    8) HashSet 1
    9) LinkedHashMap 1
    10) LinkedHashSet 1
    11) TreeMap 1
    12) TreeSet 1
    13) Vector 2
    14) Queue 2
    15) Stack 2
    16) SortedMap 2
    17) SortedSet 2
    18) Collections 3
    19) Arrays 3
    20) Comparator 3
    21) Iterator 3
    22) Base64 4
    23) Date 4
    24) EventListener 4
    25) Random 4
    26) SubList 4
    27) Timer 4
    28) UUID 4
    29) WeakHashMap 4



    3、java.util.concurrent

    1) ConcurrentHashMap 1
    2) Executor 2
    3) AbstractExecutorService 2
    4) ExecutorService 2
    5) ThreadPoolExecutor 2
    6) BlockingQueue 2
    7)AbstractQueuedSynchronizer 2
    8)CountDownLatch 2
    9) FutureTask 2
    10)Semaphore 2
    11)CyclicBarrier 2
    13)CopyOnWriteArrayList 3
    14)SynchronousQueue 3
    15)BlockingDeque 3
    16) Callable 4


    4、java.util.concurrent.atomic

    1) AtomicBoolean 2
    2) AtomicInteger 2
    3) AtomicLong 2
    4) AtomicReference 3



    5、java.lang.reflect

    1) Field 2
    2) Method 2


    6、java.lang.annotation

    1) Annotation 3
    2) Target 3
    3) Inherited 3
    4) Retention 3
    5) Documented 4
    6) ElementType 4
    7) Native 4
    8) Repeatable 4



    7、java.util.concurrent.locks

    1) Lock 2
    2) Condition 2
    3) ReentrantLock 2
    4) ReentrantReadWriteLock 2


    8、java.io

    1) File 3
    2) InputStream   3
    3) OutputStream  3
    4) Reader  4
    5) Writer  4


    9、java.nio

    1) Buffer 3
    2) ByteBuffer 4
    3) CharBuffer 4
    4) DoubleBuffer 4
    5) FloatBuffer 4
    6) IntBuffer 4
    7) LongBuffer 4
    8) ShortBuffer 4


    10、java.sql

    1) Connection 3
    2) Driver 3
    3) DriverManager 3
    4) JDBCType 3
    5) ResultSet 4
    6) Statement 4


    11、java.net

    1) Socket 3
    2) ServerSocket 3
    3) URI 4
    4) URL 4
    5) URLEncoder 4

    展开全文
  • PS: 由于当前主流使用的 JDK 版本仍是 1.8,因此源码阅读主要是 1.8 版本,有些地方可以参考 1.7(面试可能问到)。 2. 工具 工欲善其事,必先利其器。 需要的工具不多,IDE + Google 翻译足够了。 使用 IDE 的...

    1. 前言

    之前断断续续读过一部分 JDK 常用类的源码,这里想把过程中的一些心得和方法记录下来,如果能帮到需要的小伙伴就再好不过了!

    本文主要分享一下我的阅读工具和阅读顺序。

    PS: 由于当前主流使用的 JDK 版本仍是 1.8,因此源码阅读主要是 1.8 版本,有些地方可以参考 1.7(面试可能问到)。

    2. 工具

    工欲善其事,必先利其器。

    需要的工具不多,IDE + Google 翻译足够了。

    使用 IDE 的主要目的是可以写一些测试代码以便跟踪调试。这个还是很有必要的,跟进代码的执行流程更容易理解它的实现原理。

    直接在 IDE 打开源码文件,源码中的注释通常很详细,遇到不懂的地方 Google 翻译一下。也可以加上官方文档,其实源码里面注释跟文档是一样的,有些地方可能更详细,只不过官方文档排版更漂亮一些。

    JDK 1.8 官方文档链接:https://docs.oracle.com/javase/8/docs/api/

    当然,阅读的先后顺序也很重要,下面介绍下我的阅读顺序。

    3. 阅读顺序

    3.1 整体顺序

    JDK 中的代码非常多,不可能、也没必要全部读完,因此要有的放矢。从整体上来讲,顺序大概是:

    1. 集合框架类
      1. 主要包括 Collection、Map、Queue 等组成的一系列常用类和接口,包括 ArrayList、LinkedList、HashMap 等。
      2. 这部分内容日常开发使用较多,而且面试高频出现,因此可以先从这里入手。
    2. 并发包
      1. 即 java.util.concurrent (J.U.C) 包下的常用类,包括 ReentrantLock、ThreadPoolExecutor、AQS 等。
      2. 该部分提供了并发编程的常用工具类,也是面试高频。
    3. 其他常用类
      1. 例如 ThreadLocal、String、StringBuilder、StringBuffer 等。

    整体概览如下:

    我是如何阅读JDK源码的?

     

    具体到某一个类,如何去阅读它的源码实现呢?下面继续介绍。

    3.2 具体顺序

    3.2.1 类和接口

    如何阅读一个类的源码呢?主要步骤大概是:

    1. 先读接口代码。包括接口说明文档、各个方法的定义和说明文档。
    2. 再去读实现类的主要方法实现,通常有以下两条主线入口:
      1. 构造方法
      2. 常用方法

    在 Java 中,接口通常意味着是一种“标准”、或者“协议”。一个接口可以有多个实现类,它们都会按照接口的这种标准来实现接口的各个方法。因此,理解了一个方法的定义,再去看它的实现会更容易理解。

    下面以常用的 ArrayList 为例,分析如何去阅读它的源码。

    Java学习交流群:1106441130  欢迎讨论交流,可免费领取一份(Java学习视频,技术文档,电子书籍,面试等资料...)还能学习Java基础到项目实战课程!

    3.2.2 ArrayList 源码分析

    首先看下 ArrayList 的继承结构:

    我是如何阅读JDK源码的?

     

    可以看到它实现了很多接口,其中三个接口 Cloneable、RandomAccess、Serializable 都是空的,可以暂时忽略。主要去看 Iterable、Collection 以及 List 接口的方法定义。

    Iterable 接口:

    我是如何阅读JDK源码的?

     

    Collection 接口:

    我是如何阅读JDK源码的?

     

    List 接口:

    我是如何阅读JDK源码的?

     

    看起来方法挺多,其实不少都是我们平时会用到的,大部分理解起来并不困难,而且方法也都有注释。这部分难度不大。

    接下来根据前面提到的两条主线入口,分析 ArrayList 的源码如何阅读。

    • 构造器

    分析一个类的源码时,构造器通常是一个好的切入点。比如 ArrayList 第三个构造器如下:

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);    }}public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();    if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
    

    构造器中有不少成员变量,比如 elementData、EMPTY_ELEMENTDATA、DEFAULTCAPACITY_EMPTY_ELEMENTDATA 等,继续跟进这几个变量:

    private static final Object[] EMPTY_ELEMENTDATA = {};
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    transient Object[] elementData; // non-private to simplify nested class access
    

    由此可以得知,当我们写了 new ArrayList() 时,它的内部到底做了些什么。

    • 常用方法

    除了构造器,常用方法也是一个主要的入口,比如 add、remove 等。

    add 方法实现:

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    

    可以一行行跟进代码,查看 add 方法内部到底做了什么。

    其他方法的套路也是如此,不再一一说明。

    按照这样一条条主线走下来,就可以对 ArrayList 的实现原理有个整体的认知了。整体部分搞清楚之后,接下来还可以去读一些不太常用的方法,包括剩余的所有部分。

    PS: 这里只是以常用的 ArrayList 为例,其他包下的类的阅读步骤也大同小异。

    3.3 做笔记

    此外,做笔记也很重要。

    可以用思维导图梳理整体脉络,用笔记工具记录一个类的核心部分实现原理。

    当然,如果自己整理和写出来笔记更好,许多时候总觉得自己知道了,但是别人一问就懵了,可能还是没理解到位吧。

    有句话说得好:”教是最好的学“。当你能把某个知识点通俗易懂的讲给一个外行人,才是真的懂了。

    3.4 注意点

    刚开始读时,可能会遇到某些地方难以理解,可以尝试写测试代码断点跟踪调试,或者参考别人的博客。

    如果遇到某个点实在难以理解,也可以先跳过,过段时间再重新思考也许就豁然开朗了。

    展开全文
  • 为了方便学习JDK源码,我们首先需要搭建环境,可以对JDK源码进行修改,添加注释等操作。 Step1:创建项目 打开IDEA,创建一个普通的Java工程,选择好JDK。 Step2:导入源码 由于我们创建项目时选择了JDK8...
  • JDK源码阅读

    2020-05-03 01:09:19
    为了让自己更加深入了解Java语言机制以及常用的库函数,最近打算开始一期JDK源码阅读,相应内容都已经在本人的微信公众号上发布了,喜欢的同学请关注噢~有问题欢迎CSDN留言讨论:) JDK源码阅读(一)——Object和...
  • 阅读jdk源码

    万次阅读 2018-02-06 16:16:01
    1.首先介绍下如何导入jdk源码,需要下载jdk(不是jre),jdk包中会有一个src.zip,这个就是源码包 2.用idea新建一个普通java项目,把解压后的src所有文件拷到对应idea新建的java项目中,如下图: ...
  • JDK源码分析

    千次阅读 2020-01-26 21:53:38
    目录 1. java.lang 1.1 Object 1.1.1 equals() 1.1.2 toString() 1.1.3 clone() 1.2 String 1.2.1String如何存值 1.2.2 equals() ​ 1.2.3 startWith() 1.2....
  • JDK源码阅读指南(简洁版)

    千次阅读 2018-09-09 22:30:49
    1.Object 1) wait(), notify(), notifyAll(), wait(timeout) 2) hashCode(), equals() 3) clone() 2.String 1) char[] value ...3) equals(), startWith(), endWith(), replace ...3.AbstractStringBu...
  • > http://www.importnew.com/16599.html 例如这篇文章的作者就是通过阅读jdk源码来得到一些结论 这些人都是如何去阅读的? 为什么我看源码,无法获取到有效的信息呢? 阅读源码之前是否需要具备某些条件呢?
  • IDEA查看JDK源代码

    万次阅读 2019-06-28 12:03:58
    之前已经讲解过如何使用Eclipse查看源代码,IDEA作为一个集成开发环境越来越流行,今天学习以下如何使用Eclipse查看JDK的代码。 File->Project Structure,选择Platform Settings里的SDKs; 之后选择...
  • jdk8源码下载 与 idea 设置源码

    千次阅读 2019-04-02 12:38:33
    但我们一般安装的jdk都是SunJDK(OracleJDK),它只提供java和javax下的源代码,如果我们需要看sun.simc.Launcher这样的类的时候还是没有源代码,我们可以通过下载OpenJDK的源码来查看。 下载地址:...
  • 免费jdk1.8源码下载

    万次阅读 多人点赞 2017-09-15 11:12:12
    本人是很尊重原创的,但是拿着别人的“原创”(包括一些官方的资源等等)来为自己赚取积分,...所以分享jdk1.8的源码网盘下载链接和密码,希望大家也能够免费分享:链接:http://pan.baidu.com/s/1nvhzpED 密码:5cb1
  • idea中阅读jdk源码,并添加注释

    千次阅读 热门讨论 2019-11-13 10:15:09
    学会在idea(eclipse)中阅读、调试源码,是java程序员必不可少的一项技能。...下面就介绍下,如何在jdk源码中为所欲为,像在我们自己的代码中一样写注释、调代码: 打开idea,选择Project->File-&...
  • 如何在Eclipse下查看JDK源代码

    万次阅读 多人点赞 2017-06-02 14:14:11
    不会看JDK源代码,相当于没学过JAVA。  从百度上找到一篇帮助我解决了如何在Eclipse下查看JDK源代码 的文章。   在Eclipse中查看JDK类库的源代码!!!  设置:  1.点 “window”-> "Preferences" -> "Java" -> ...
  • Eclipse 中关联JDK源代码

    千次阅读 2016-04-27 17:42:17
    在Eclipse中,按F3快捷键可以查看类或方法的源代码(查看声明),当重装了Eclipse或JDK后,可能就不能够查看JDK中类或方法的源代码了,因为JDK源代码尚没有和项目关联。 解决方法: 右键项目,依次选择 构建...
  • mac下,在idea中查看jdk源码

    千次阅读 2014-11-12 15:04:23
    mac中自带的jdk并不包含源代码,所以在eclipse中无法查看, 需要到apple上去下载, 下载下来后,直接安装,默认设置就可以了,然后可以建个link,方便选择。 sudo -s cd /System/Library/Frameworks/Java...
  • 绝对良心提供百度网盘的jdk1.8源码下载包含sun包的

    万次阅读 多人点赞 2020-10-14 16:32:01
    jdk目录下是有源码的,但是源码不包含sun包, 但是openjdk网站有提供的: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/6bfaecb8ff77/src/share/classes/ 或者直接用百度网盘下载:...
  • Eclipse如何查看jdk源码

    千次阅读 多人点赞 2018-08-14 20:15:11
    还没有写代码,直接配置jdk源码路径 点击类名、方法名查看Java的jdk源码 当我们在写java程序时,查看所引用的类、以及类下面的方法实现,是java学习中必不可少的一个环节,有助于我们加深对java类的理解。...
  • 如何下载jdk源码、hotspot源码

    千次阅读 2020-05-01 13:37:10
    jdk的开源主要体现openjdk项目上,下面简单介绍一下jdk及其子项目hotspot的源码下载方式。 首先我们进入网址:http://hg.openjdk.java.net,这个网址下面列出了所有开源的openjdk项目,从中我们可以看到jdk项目。 ...
1 2 3 4 5 ... 20
收藏数 338,568
精华内容 135,427
关键字:

jdk源码阅读