精华内容
下载资源
问答
  • JDK源码阅读

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

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

    JDK源码阅读(一)——Object和String

    JDK源码阅读(二)——AbstractStringBuilder,StringBuffer与StringBuilder

    JDK源码阅读(三)—— Integer

    个人微信公众号
    谢谢关注~愿一起进步!

    展开全文
  • JDK源码阅读顺序

    万次阅读 多人点赞 2018-03-15 17:42:23
    很多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

    展开全文
  • JDK源码阅读笔记
  • 一、JDK源码的重要性JDK源码的重要性不言而喻,平时的面试、深入学习等都离不开JDK的源码。当然,JDK源码是非常优秀的...二、搭建JDK源码阅读项目1、新建项目并导入JDK源码首先新建一个普通的Java项目,笔者这里...

    一、JDK源码的重要性

    JDK源码的重要性不言而喻,平时的面试、深入学习等都离不开JDK的源码。当然,JDK源码是非常优秀的代码,我们之所以阅读JDK源码,就是为了理解底层原理、学习优秀的设计模式和思想。不过JDK源码也是相当难啃的知识点,我们一定要有信心,不要畏难,硬着头皮去学习,一定会有很大的收获的。

    二、搭建JDK源码阅读项目

    1、新建项目并导入JDK源码

    首先新建一个普通的Java项目,笔者这里将项目取名为jdkSourceLearn,大家可自行选择。

    3f4be75f526bee7fe47acacb899d3928.png

    bb68e16368b15202e20c609752962f0b.png

    建议大家新建两个目录,一个叫source,放置JDK源码;一个叫test,放置测试用例。这样层次结构较为清晰,方面学习。

    3ab7dcf219b124debfb15217d2e4d554.png

    现在导入JDK源码,找到安装JDK的目录,里面有个叫src.zip的文件,那个就是源码的压缩文件。将其解压完毕后直接拷贝到项目的source目录下即可。

    e9c448133caf2329c24a21ce74e0aa94.png

    50f446e09be2e5f142ca7d438c8c2040.png

    2、创建测试用例尝试调试

    这里在test目录下创建一个相关测试用例并尝试进行调试。

    package cn.mambalhb.test;
    
    import java.util.HashMap;
    import java.util.Set;
    
    public class HashMapTest {
    
        public static void main(String[] args) {
            HashMap<String, String> map = new HashMap<>();
    
            map.put("aaa", "AAA");
            map.put("bbb", "BBB");
            map.put("ccc", "CCC");
    
            Set<String> keys = map.keySet();
            for (String key : keys) {
                System.out.println(key + "===>" + map.get(key));
            }
        }
    
    }

    设置断点并点击调试后,通常需要等待项目Build一会,这个时候会出现一堆错误,下面来一个一个解决。

    3、解决相关问题

    (1)系统资源不足

    问题提示如下:

    36e81b991ca4a75a49bf4f99e12407d7.png

    通过提示可以看出导致这个错误出现的原因是内存不够。解决办法当然是加大内存。 点击File-->Settings-->Build,Execution,Deployment-->Compiler,将Build process heap size(Mbytes)选项加大,默认值是700,笔者这里调至1200:

    75ac68338eb29cc2a2e01a1e8a382514.png

    (2)程序包com.sun.tools.javac.*不存在

    问题提示如下:

    c642fe377b00ac6e88aac20bc9822f5c.png

    这是缺少tools的jar包所导致的。 点击File-->Project Structure-->Libraries

    5c071d3e429cfc7f74915feeb01423a0.png

    选择JDK安装目录,在lib目录下找到tools.jar,点击ok导入即可。

    79cb70206564b04c59f1f69fbadb9655.png

    (3)找不到符号UNIXToolkit、FontConfigManager

    问题提示如下:

    eaedcdb2745f4da2c223ff53015c19b7.png

    34d81a9cfd1b0761eebd8972244800a8.png

    这是因为在Windows平台下缺少了两个java类文件所导致的。 这两个类文件可在OpenJDK网站上找到。

    a587b527e3f6108e638a57bbdeb01820.png

    注意这里选择自己相应的JDK版本,笔者的是jdk1.8.0_162。

    a290fec3a172473eeae7987ec72ae376.png

    ef2dfd06ba20890f8c9d83d503fb0251.png

    c7ad28a83e3632a3a32412eaa5a70054.png

    6375ba2a89e6454067fb9d8d947dc4fd.png

    2e6aa4e9a7a51ca641901047c89f2e03.png

    8a5742aa848724f3a2936bd576df6a80.png

    9069700d2fa8804b512b74babdee1d10.png

    d7ec1f548d66166bd00328ee1c6ddc41.png

    4063096ac1414fef5cf93cc484df81f0.png

    d5649dd385174331fc6f132347bb206f.png

    找到这两个类文件的位置后,将它们复制进项目如下图所示的位置中。

    d40e8e53fdc967e72ec9b49736ec14fd.png

    此时再调试或者运行测试用例的时候,可以看到已经成功运行。

    17ee3d5c48b6599290735b5df52025b2.png

    三、完善项目设置

    1、允许调试进入

    此时如果我们打断点进行单步调试的话,可以发现点击Step Into无法进入源码内部,因为JDK源码的受保护的,无法进入,但是点击Force Step Into是可以进入源码内部的。如果想要直接按F7(即点击Step Into)进入源码内部的话,需要做如下设置: 点击File-->Settings-->Build,Execution,Deployment-->Debugger-->Stepping,取消勾选Do not step into the classes

    b74f14bae357b9e29377e24f0aad0787.png

    2、编辑源码文件

    如果我们想要对源码文件做记录或者注释时,会发现源码文件是只读的,无法编辑。因为此时项目关联的源码文件还不是刚才复制进项目的文件,而是jdk安装目录下的源码文件。重新将项目关联的源码文件设置成该项目下的源码文件即可。 点击File-->Project Structure-->SDKs

    bbc2ad02a83120049541696c302e0a8b.png

    这里将原先的jdk安装目录下关联的源码路径删除,添加刚才拷贝至项目目录下的源码路径。

    694c4d159bf2feef0b39a7c7dd69ac2c.png

    这个时候,再进行调试进入源码内部的时候,可以发现,文件上面的小锁标志已经不见了,源码文件也可以进行注释记录了。

    8ad04b4c94ae282eebac5daded6bd205.png

    四、总结

    至此,关于JDK源码阅读项目的搭建已经完成。平时学习源码的时候,不能只是光看,一定要动手调试,在调试的过程中阅读源码,做记录,写注释,缺一不可。将输入转化为输出,坚持下去。

    展开全文
  • 主要介绍了jdk源码阅读Collection详解,具有一定借鉴价值,需要的朋友可以参考下
  • JDK 源码 阅读

    2015-03-19 15:32:49
    To be continuing.......  持续修改中。。。。 1. StringBuffer 所处类层次 ... 所有的method直接或间接加synchronized。 所以我们如果是单线程情况下也考虑到这个会不会影响到效率。当然可能JIT可以进行这个优化,...

    To be continuing....... 

    持续修改中。。。。


    1. StringBuffer

    所处类层次


    易忽略点:

    - 这个类是线程安全的。 所有的method直接或间接加synchronized。 所以我们如果是单线程情况下也考虑到这个会不会影响到效率。当然可能JIT可以进行这个优化,待我接下来验证。

    - 默认情况下一个长为16个字符的数组被创建来存储字符串。


    相关学习点:

    - 当我们把Long, Integer 加到其中时。我们要先技术这个数字要多少个字符来存放。 这里的小技巧即使 用正数来求,负数加一。在求正数时,从1位开始比较1位必定小于10,接下来2位的必定小于100,以此类推。在计算integer要占的字符数时,边界值是直接缓存于数组中的。


    2. Integer/Long

    相关学习点:

    - 在 Long 的package 方法getChars中有一整数乘法的为计算转化。   例如 a * 100 可以转化为 (a<<6) + (a<<5) + (a<<2) 。 原因就是 100的二进制为 1100100 。

    - 在小于65536(10000 0000 0000 0000)的整数除10的整数运算中。我们可以把这个运算转换为快速的位运算。 a/10(整数运算)  --->  (a * 52429) >>> (16+3)。 这里 1<< 19 = 524288.   52429/524288 = 0.10000038146972...   说到这就明白了。  但还是有一点是为什么选择19,不是20也不是18. 原因是 52429 < 65536 ,  所以a 是16位内的数 52429乘上后不会越过整型的正数的界。同时取小于19的值 计算精度会低于取19。


    展开全文
  • jdk源码阅读一:ArrayList
  • 搭建JDK8源码阅读环境 创建一个Java项目(最基础的Java项目就可以),jdk源码在jdk目录中的src.zip中,解压后把解压的目录复制到创建的项目中。 创建一个测试用例,打断点调试运行一下。 会报如下图中的错误 ...
  • JDK源码阅读工程搭建

    2020-03-30 23:47:18
    JDK源码阅读工程搭建 前几天在B站看了CodeSheep的视频,搭建一个JDK源码阅读的工程,觉得这个可以有,于是也自己搭了一套,分享一下 首先创建一个普通的Java工程 基本的工程创建好后,我们找到jdk的安装目录,在...
  • JDK源码阅读——LinkedList
  • 一、JDK源码的重要性 ...二、搭建JDK源码阅读项目 1、新建项目并导入JDK源码 首先新建一个普通的Java项目,笔者这里将项目取名为jdk-learn,大家可自行选择。 现在导入JDK源码,找到安装...
  • JDK源码阅读环境搭建

    2020-10-18 15:54:47
    JDK源码阅读环境一、新建项目 一、新建项目 新建一个java项目
  • 上文阅读直达车:【震精】LinkedList源码竟然可以这样玩!!注意源码版本为JDK1.81.删除1.2remove()在LinkedList中remove()和removeFirst()是相同的在LinkedList中的删除其实就是通过修改上一个节点和指向下一个节点...
  • JDK源码阅读项目搭建之记录

    千次阅读 2020-03-28 14:09:20
    一、JDK源码的重要性 JDK源码的重要性不言而喻,平时的深入学习、面试等都离不开JDK的源码。当然,JDK源码是非常优秀的代码,...二、搭建JDK源码阅读项目 1、新建项目并导入JDK源码 首先新建一个普通的Java项目,笔...
  • 搭建JDK源码阅读环境

    2020-12-04 00:34:27
    搭建JDK源码阅读环境 我们在日常的开发中多多少少都会接触到源码,比如你直接点击HashMap会自动跳到HashMap的源码文件。 但是当你想要深入源码,在阅读源码时给某些逻辑加一些注释时,原有的源码是不支持编辑的。 ...
  • jdk源码阅读——ArrayList
  • jdk源码阅读-ArrayList
  • jdk源码阅读(一)

    2019-05-16 07:10:21
    jdk源码阅读(一)
  • JDK源码阅读
  • JDK源码阅读——Collection

    千次阅读 2016-03-19 22:47:15
    JDK源码阅读——Collection
  • JDK源码阅读之AbstractListAbstractList概述AbstractList类图AbstractList的两个内部迭代器Iterator 迭代器ListIteratorAbstractList的重要方法AbstractList的两个内部类AbstractList源码阅读感受说明 AbstractList...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,801
精华内容 1,520
关键字:

jdk源码阅读