前言
从本文开始对JDK源码进行学习,内容包含Java中各种常见数据结构的底层实现原理和其他重要的Java函数的底层实现。本文包括JDK源码阅读环境搭建
创建Java源码学习项目
- 在idea中创建一个新的Java项目,起名为JavaSourceCodeLearn
- 在setting中将如下选项取消勾选,否则逐步调试时无法进入底层类
更换源码路径
- 在JDK保存的文件家中有src的压缩包(JDK8以前在JDK文件夹下,之后则在lib文件夹下)
- 将该src解压到某个文件夹内,记住这个路径
- 在项目的SDKs选项内将Sourcepath内的所有源替换为上一步创建的文件夹(这样做的目的是让我们能够给源码添加自己的注释)
遇到的坑
不要把复制的源码放在项目路径下,否则会引起错误
源码学习顺序
重要的部分都在java.base->java文件夹内
1、java.lang
- Object 1
- String 1
- AbstractStringBuilder 1
- StringBuffer 1
- StringBuilder 1
- Boolean 2
- Byte 2
- Double 2
- Float 2
- Integer 2
- Long 2
- Short 2
- Thread 2
- ThreadLocal 2
- Enum 3
- Throwable 3
- Error 3
- Exception 3
- Class 4
- ClassLoader 4
- Compiler 4
- System 4
- Package 4
- Void 4
2、java.util
- AbstractList 1
- AbstractMap 1
- AbstractSet 1
- ArrayList 1
- LinkedList 1
- HashMap 1
- Hashtable 1
- HashSet 1
- LinkedHashMap 1
- LinkedHashSet 1
- TreeMap 1
- TreeSet 1
- Vector 2
- Queue 2
- Stack 2
- SortedMap 2
- SortedSet 2
- Collections 3
- Arrays 3
- Comparator 3
- Iterator 3
- Base64 4
- Date 4
- EventListener 4
- Random 4
- SubList 4
- Timer 4
- UUID 4
- WeakHashMap 4
3、java.util.concurrent
- ConcurrentHashMap 1
- Executor 2
- AbstractExecutorService 2
- ExecutorService 2
- ThreadPoolExecutor 2
- BlockingQueue 2
7)AbstractQueuedSynchronizer 2
8)CountDownLatch 2 - FutureTask 2
10)Semaphore 2
11)CyclicBarrier 2
13)CopyOnWriteArrayList 3
14)SynchronousQueue 3
15)BlockingDeque 3 - Callable 4
4、java.util.concurrent.atomic
- AtomicBoolean 2
- AtomicInteger 2
- AtomicLong 2
- AtomicReference 3
5、java.lang.reflect
- Field 2
- Method 2
6、java.lang.annotation
- Annotation 3
- Target 3
- Inherited 3
- Retention 3
- Documented 4
- ElementType 4
- Native 4
- Repeatable 4
7、java.util.concurrent.locks
- Lock 2
- Condition 2
- ReentrantLock 2
- ReentrantReadWriteLock 2
8、java.io
- File 3
- InputStream 3
- OutputStream 3
- Reader 4
- Writer 4
9、java.nio
- Buffer 3
- ByteBuffer 4
- CharBuffer 4
- DoubleBuffer 4
- FloatBuffer 4
- IntBuffer 4
- LongBuffer 4
- ShortBuffer 4
10、java.sql
- Connection 3
- Driver 3
- DriverManager 3
- JDBCType 3
- ResultSet 4
- Statement 4
11、java.net
- Socket 3
- ServerSocket 3
- URI 4
- URL 4
- 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
- Node {E item, Node prev, Node next}
- int size
- Node first
- Node last
- linkFirst(), linkLast(), linkBefore(), unLinkFirst(), unLinkLast(), unLink(), indexOf()
6)int modCount
3、HashMap
- Node{int hash, K key, V value, Node next}
注:hash是根据key算的 - Node[] table:数据存储,默认大小16
- Set<Map.Entry> entrySet:用于Map遍历的集合
- int size:当前数量
- int threshold:size超过多少时需要扩容,默认16
- float loadFactor:负载因子,默认0.75f
7)int modCount:操作次数 - 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
- 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
- 结构实现与HashMap基本一致
- 通过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
- wait(), notify(), notifyAll(), wait(timeout)
- hashCode(), equals()
- clone()
9、String
- final char[] value
- int hash
- equals(), startWith(), endWith(), replace
10、AbstractStringBuilder
- char[] value
- int count
- 扩容:翻倍,不够取所需最小
11、StringBuilder:继承AbstractStringBuilder
12、StringBuffer
- 继承AbstractStringBuilder
- synchronized方法保证线程安全
- char[] toStringCache
13、Set一般都是使用委托模式到Map
14、AbstractMap维护EntrySet,AbstractSet维护Iterator,AbstractList维护Iterator
