JDK源码阅读顺序
很多java开发的⼩伙伴都会阅读jdk源码,然⽽确不知道应该从哪读起。以下为⼩编整理的通常所需阅读的源码范围。 标题为包名,后⾯序号为优先级1-4,优先级递减
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
resultset 遍历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、urrent
ConcurrentHashMap 1
Executor 2
AbstractExecutorService 2
ExecutorService 2
ThreadPoolExecutor 2
BlockingQueue 2
AbstractQueuedSynchronizer 2
CountDownLatch 2
FutureTask 2
Semaphore 2
CyclicBarrier 2
CopyOnWriteArrayList 3
SynchronousQueue 3
BlockingDeque 3
Callable 4
4、urrent.atomic
AtomicBoolean 2
AtomicInteger 2
AtomicLong 2
AtomicReference 3
5、flect
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、urrent.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
1) 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
Socket 3
ServerSocket 3
URI 4
URL 4
URLEncoder 4
阅读笔记简版
1、Object
1) wait(), notify(), notifyAll(), wait(timeout)
2) hashCode(), equals()
3) clone()
2、String
1) char[] value
2) int hash
3) equals(), startWith(), endWith(), replace
3、AbstractStringBuilder
1) char[] value
2) int count
3) 扩容:翻倍,不够取所需最⼩
4、StringBuffer
1) 继承AbstractStringBuilder
2) synchronized⽅法保证线程安全
3) char[] toStringCache
5、StringBuilder 继承AbstractStringBuilder
6、ArrayList
1) Object[] elementData
2) int size
3) 默认⼤⼩10
4) 扩容:翻倍,不够取所需最⼩
7、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()
8、HashMap
1) Node{int hash, K key, V value, Node next}
2) 默认容量16,负载因⼦0.75f
3) int size, modCount, threshold, float loadFactor
4) Node[] table
5) Set entrySet
6) put():根据key算hash,根据容量和hash算index,table[index]没有直接添加到数组中,table[index]有,若index位置同⼀个key则更新,否则遍历next是否有,有则更新,⽆则新增,最后根据thread与size判断是否扩容。注:扩容时容量翻倍,重新算hash复制到新数组 7)get()类似
注:先⽐较hash,若相等在⽐较equals
9、Hashtable
1) 结构实现与HashMap基本⼀致
2)通过synchronized⽅法保证线程安全
10、HashSet:委托给HashMap,其Value是同⼀个默认对象
11、LinkedHashMap继承HashMap
1) Entry{HashMap.Node, Entry before, after}
2) Entry head, tail
3) 重写newNode()添加节点时,除像HashMap中添加外,保存before、after信息
12、LinkedHashSet继承HashSet:不知道如何实现的顺序?
13、AbstractMap维护EntrySet,AbstractSet维护Iterator,AbstractList维护Iterator
14、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,不同CAS⽅式设置,根据key算hash,在根据hash和容量算index,对table[index]加锁,从⽽达到更⼤的并发量
d、get(): 同HashMap
e、put(): 对table[index]加锁
15、TreeMap
1)红⿊树,即⾃平衡⼆叉查树,时间复杂度O(logn)
2)Entry{K k, V v, Entry parent, left, right, boolean color}
3)Entry root,int size, int modeCount
16、TreeSet:委托TreeMap实现
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论