核心

在rt.jar包

参考

ClassLoader

public static final Boolean FALSE = new Boolean(false);

public static Boolean valueOf(String s) { return parseBoolean(s) ? TRUE : FALSE; }

  1. - parseBoolean
  2. - getBoolean // 和系统属性有关
  3. - 实现了Comparable 接口,所以 compareTo 静态方法 compare
  4. - 逻辑运算
  5. - logicalAnd
  6. - logicalOr
  7. - logicalXor
  8. <a name="NbEFA"></a>
  9. #### Charactor
  10. - valueOf, 注意部分会用到缓存,
  11. ```java
  12. static final Character cache[] = new Character[127 + 1];
  13. static {
  14. for (int i = 0; i < cache.length; i++)
  15. cache[i] = new Character((char)i);
  16. }
  17. //.....
  18. if (c <= 127) { // must cache
  19. return CharacterCache.cache[(int)c];
  20. }
  21. return new Character(c);
  • hashCode, equals,toString
  • isValidCodePoint
  • isBmpCodePoint
  • isSupplementaryCodePoint
  • isHighSurrogate
  • isLowSurrogate
  • isSurrogate
  • isSurrogatePair
  • charCount
  • toCodePoint
  • codePointAt
  • codePointAtImpl
  • codePointBefore
  • highSurrogate
  • lowSurrogate
  • toChars
  • codePointCount
  • offsetByCodePoints
  • isLowerCase
  • isUpperCase
  • isTitleCase
  • isDigit
  • isDefined
  • isLetter
  • isLetterOrDigit
  • isAlphabetic
  • isIdeographic
  • isJavaIdentifierStart
  • isJavaIdentifierPart
  • isUnicodeIdentifierStart
  • isUnicodeIdentifierPart
  • isIdentifierIgnorable
  • toLowerCase
  • toUpperCase
  • toTitleCase
  • digit
  • getNumericValue
  • isSpaceChar
  • isWhitespace // 空白符包含:空格、tab键、换行符
  • isISOControl ??
  • getType
  • forDigit
  • getDirectionality ??
  • isMirrored //类似各种括号,需要一对一对的
  • compareTo
  • compare
  • reverseBytes
  • getName

Number

  • 定义了xxxValue方法,用于类型转换

    Byte ,

  • Byte用 ByteCache做了缓存 所以用valueOf 返回的同值的都是同一个地址对象

    1. static final Byte cache[] = new Byte[-(-128) + 127 + 1];
    2. static {
    3. for(int i = 0; i < cache.length; i++)
    4. cache[i] = new Byte((byte)(i - 128));
    5. }
  • parseByte 从String 转Byte

  • 实现 Number定义的方法,实现都是强转,不会有精度丢失
  • 实现了Comparable 接口
  • toUnsignedInt 与 toUnsignedLong

    Short,

  • 表示范围 从 jdk概览(挖坑) - 图3 ~ jdk概览(挖坑) - 图4

  • valueOf 同样用了缓存

    1. if (sAsInt >= -128 && sAsInt <= 127) { // must cache
    2. return ShortCache.cache[sAsInt + offset];
    3. }
    4. return new Short(s);
  • decode 转0x 0X 这样开头的字符串

  • 实现 Number定义的方法,实现都是强转,
  • 实现了Comparable 接口
  • reverseBytes 静态方法
  • toUnsignedInt, toUnsignedLong 实现都是位运算

    Integer,

  • 构造方法支持 int String

  • toXXXString 转各种进制的String
  • parseInt parseUnsignedInt 静态方法,String转int
  • vlaueOf 支持String ,int 有缓存实现,缓存大小可以配置 ```java if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);

//……… static final int low = -128; static final int high; static final Integer cache[];

static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty(“java.lang.Integer.IntegerCache.high”); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h;

  1. cache = new Integer[(high - low) + 1];
  2. int j = low;
  3. for(int k = 0; k < cache.length; k++)
  4. cache[k] = new Integer(j++);
  5. // range [-128, 127] must be interned (JLS7 5.1.7)
  6. assert IntegerCache.high >= 127;

}

  1. - 实现 Number接口,都是强转
  2. - getInteger,获取系统变量值 System.getProperty(nm);
  3. - decode
  4. - 实现Compareble接口
  5. - divideUnsigned 应该是除
  6. - remainderUnsigned 求余
  7. - highestOneBit lowestOneBit [参考](https://blog.csdn.net/cnds123321/article/details/117399430)
  8. - numberOfLeadingZerosnumberOfTrailingZeros 二进制串中从最左/右边算起连续的“0”的总数量
  9. - bitCount 在二进制下“1”的数量。//位运算 TODO
  10. - rotateLeft rotateRight // 补码相关
  11. - reverse
  12. - signum 判断正负数
  13. - reverseBytes
  14. - 比较 求和 max min sum Math函数实现
  15. <a name="ODPop"></a>
  16. #### Long,
  17. - 类型转换 toXXXString parseXXXLong
  18. - valueOf 也可转StringLong,有缓存 -128~127
  19. - 实现 Number接口,都是强转
  20. - getLong 和系统变量有关
  21. - Compareble接口实现
  22. - 后面和Integer类似
  23. <a name="SZGzK"></a>
  24. #### Float
  25. - Integer 有区别的
  26. - isNaN 实现有点奇怪 return (v != v);
  27. - NaN是一个Float对象;
  28. - NaN对象的内存地址尽不相同
  29. - isInfinite
  30. - hashCode equals
  31. - floatToIntBits floatToRawIntBits //非java代码
  32. <a name="bAKBv"></a>
  33. #### Double
  34. - Float基本类似
  35. <a name="Z8fHh"></a>
  36. ### 字符处理
  37. <a name="SkYcb"></a>
  38. #### String
  39. - final class
  40. - 构造函数 byte[] int[] char[] StringBuffer , 一般有偏移量和 个数
  41. - codePoint相关
  42. - getChars getBytes
  43. - CharSequence 的方法实现
  44. - valueOf 相关 copyValueOf 实现看上去都是一样的
  45. - format相关
  46. - 各种equals
  47. - contentEquals 支持CharSequence StringBuffer
  48. - nonSyncContentEquals
  49. - equalsIgnoreCase
  50. - Comparable接口实现
  51. - regionMatches , 一个区间内的子字符串是否相等
  52. - startWith endWith
  53. - hashCode h = 31 * h + val[i];
  54. - xxxIndexOfxxx 检索 match contians 匹配
  55. - subxxx 子串
  56. - replacexxx
  57. - concat split join trimsplit是在Pattern类中实现,joinsplit是相反的过程
  58. - 大小写转
  59. <a name="V2qQ8"></a>
  60. #### String Builder
  61. - 有个初始容量 容量可设置
  62. ```java
  63. public StringBuffer() {
  64. super(16);
  65. }
  66. public StringBuffer(int capacity) {
  67. super(capacity);
  68. }
  69. public StringBuffer(String str) {
  70. super(str.length() + 16);
  71. append(str);
  72. }
  • 最多常用的是append 有15个左右重载,主要逻辑如下, 在父类中实现

    1. public AbstractStringBuilder append(String str) {
    2. if (str == null)
    3. return appendNull();
    4. int len = str.length();
    5. ensureCapacityInternal(count + len);
    6. str.getChars(0, len, value, count);
    7. count += len;
    8. return this;
    9. }
    • insert方法 类似方法都用System.arraycopy 和String getChars,都是数组操作
      1. public AbstractStringBuilder insert(int offset, String str) {
      2. if ((offset < 0) || (offset > length()))
      3. throw new StringIndexOutOfBoundsException(offset);
      4. if (str == null)
      5. str = "null";
      6. int len = str.length();
      7. ensureCapacityInternal(count + len);
      8. System.arraycopy(value, offset, value, offset + len, count - offset);
      9. str.getChars(value, offset);
      10. count += len;
      11. return this;
      12. }

      运行相关

      Thead //TODO 在多线程专题

      image.png

      Process

      //略

      System

  • 输入输出相关

    1. public final static InputStream in = null;
    2. public final static PrintStream out = null;
    3. public final static PrintStream err = null;
    • setIn setOut setErr
    • console
    • Channel inheritedChannel
  • getSecurityManager / setSecurityManager
  • 时间相关
    • nanoTime
    • currentTimeMillis
  • 内存操作
    • arraycopy //非java实现
    • gc
    • runFinalization
  • 环境相关
    • xxxProperties
    • xxxenv
  • 库加载 实现是RumTime类里实现
    • load
    • loadLibray
    • mapLibraryName

RunTime

  • exec // ProcessBuilder 调用 UNIXProcess 的方法实现

  • xxxShutDownHook
  • halt
  • 运行资源信息
    • availableProcessors
    • freeMemory
    • totalMemory
    • maxMemory
  • 加载lib方法
  • 内存回收
    • gc
    • runFinalization
  • 追踪开关

    • traceInstructions
    • traceMethodCalls

      ProcessBuilder

      工具

      Math

      java.lang.annotation

      //注解相关类, TODO

      java.lang.instrument

      //TODO,初步看和字节码编程有类似的作用,可以查看加载的类和改造, 找些文章实例看看

      java.lang.invoke

      参考

  • https://blog.csdn.net/u014285884/article/details/78740281

java.lang.management

参考

  • https://blog.csdn.net/weixin_33716154/article/details/92275908

    java.lang.ref

    参考

  • https://www.iteye.com/blog/seanzhou-2021773 | 引用类型 | 取得目标对象的方式 | 垃圾回收条件 | 是否可能内在泄漏 | | —- | —- | —- | —- | | 强引用 | 直接引用 | 不回收 | 可能 | | 软引用 | 通过get()方法 | 无强引用时,视内存情况及get()调用情况回收 | 不可能 | | 弱引用 | 通过get()方法 | 无强引用时,永远回收 | 不可能 | | 虚引用 (跟踪回收用) | 无法取得 | 无强引用时,永远回收 | 不可能 |

java.lang.reflect

参考

  • https://blog.csdn.net/muddledape/article/details/81091174

    java.util

    参考

  • https://blog.csdn.net/z55887/article/details/57587632

  • https://blog.csdn.net/weixin_46482482/article/details/115731362

    容器接口

    Collection

  • 接口 ,子接口有 Set,List,Queue

  • 通用的方法
    • add addAll
    • remove removeAll removeIf clear
    • contains containsAll retainAll
    • size isEmpty
    • toArray
  • Steam //TODO
    • stream parallelStream
  • iterator

    List

  • 新增实现的方法 接口中实现方法 用 default

    • sort
    • repalceAll
  • 新增的接口方法

    • get set
    • indexOf lastIndexOf
    • listIterator
    • subList
    • Spliterator

      Set

  • 相较Collection没有新增方法,不能按索引获取值

  • 特性是没有重复元素,无序

    Queue

  • 侧重操作

    • offer 与 add ,add方法在队列满的情况下将选择抛异常的方法来表示队列已经满了,而offer方法通过返回false表示队列已经满了;在有限队列的情况,使用offer方法优于add方法;
    • remove方法和poll方法都是删除队列的头元素,remove方法在队列为空的情况下将抛异常,而poll方法将返回null;
    • element和peek方法都是返回队列的头元素,但是不删除头元素,区别在与element方法在队列为空的情况下,将抛异常,而peek方法将返回null

      Map

  • size , isEmpty containsKey containsValue

  • keySet entrySet //??
  • put putAll putIfAbsent
  • remove clear
  • replaceAll replace merge
  • get values getOrDefaut
  • computeIfAbsent computeIfPresent compute //??
  • forEach //TODO

    模板类

    AbstractXXX

  • 很多公共方法在抽象类里实现

    常用实现类

    ArrayList

  • 构造函数

    • 数组实现,初始容量为10,可以指定容量
    • 实现Collection接口的可以转
  • 实现技巧

    • 数组实现
    • 新增插入,或删除时都会设计到 数组批量操作,主要用arraycopy,
    • 新增涉及扩容,删除注意设置为null进行垃圾回收,
    • 扩容成功一次 1.5倍容量

      LinkedList

  • 实现 了 ist, Deque, 等接口

  • 是个双向链表
  • 构造函数
    • 可以直接把实现了Collection接口的类转过来
  • getFirst getLast addFirst addlast removeFirst removeLast
  • add addAll
  • clear remove
  • get set
  • indexOf lastIndexOf
  • Deque的方法实现
    • offer offerFirst offerLast
    • peek peekFirst peekLast element
    • poll pollFist polllast remove
    • push pop
    • removeFirstOccurrence removeLastOccurrence
    • descendingIterator
  • toArray

    Vector

  • 与ArrayList最大的区别应该就是线程安全的

  • 扩容有点不一样,默认arrayList是1.5倍 vector是2倍

    Stack

  • 继承Vector

  • push pop peek
  • empty search

    HashSet

  • 构造函数

    • 底层是HashMap,初始化时可以设置一些hashmap初始化的参数,来提升性能
    • 看一个默认的初始化 集合实例, 应该是用0.75的负载因子比较合适 ```java public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }
  1. - set List 少一些查找的方法
  2. <a name="WCpRm"></a>
  3. #### TreeSet
  4. - 实现了 NavigableSet SortedSet 接口,主要是有序的特性
  5. - 构造函数
  6. - 可以用 NavigableMap接口实现的类来初始化
  7. - 默认用TreeMap 来存,
  8. - 也可以转其他Collection的实例
  9. - descendingIterator
  10. - descendingSet
  11. - subSet headSet 返回比参数小的 集合 tailSet 返回比参数大的集合
  12. - comparator
  13. - first last lower floor ceiling higher
  14. - pollFirt pollLast
  15. <a name="J8IxS"></a>
  16. #### HashMap
  17. - 重要实现
  18. - TREEIFY_THRESHOLD 8 ,每个“筒” 下面超过这个,就变成了TreeNode
  19. ```java
  20. final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
  21. boolean evict) {
  22. Node<K,V>[] tab; Node<K,V> p; int n, i;
  23. if ((tab = table) == null || (n = tab.length) == 0)
  24. n = (tab = resize()).length;
  25. if ((p = tab[i = (n - 1) & hash]) == null)
  26. tab[i] = newNode(hash, key, value, null);
  27. else {
  28. Node<K,V> e; K k;
  29. if (p.hash == hash &&
  30. ((k = p.key) == key || (key != null && key.equals(k))))
  31. e = p;
  32. else if (p instanceof TreeNode)
  33. e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
  34. else {
  35. for (int binCount = 0; ; ++binCount) {
  36. if ((e = p.next) == null) {
  37. p.next = newNode(hash, key, value, null);
  38. if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
  39. treeifyBin(tab, hash);
  40. break;
  41. }
  42. if (e.hash == hash &&
  43. ((k = e.key) == key || (key != null && key.equals(k))))
  44. break;
  45. p = e;
  46. }
  47. }
  48. if (e != null) { // existing mapping for key
  49. V oldValue = e.value;
  50. if (!onlyIfAbsent || oldValue == null)
  51. e.value = value;
  52. afterNodeAccess(e);
  53. return oldValue;
  54. }
  55. }
  56. ++modCount;
  57. if (++size > threshold)
  58. resize();
  59. afterNodeInsertion(evict);
  60. return null;
  61. }
  • get containsKey getOrDefault values keySet entrySet
  • size isEmpty
  • put putAll putIfAbsent remove clear
  • computeIfAbsent computIfPresent compute

    HashTable

  • 参考

  • 红黑树 //TODO

  • 有序
  • 核心代码 ```java public V put(K key, V value) {

    1. Entry<K,V> t = root;
    2. if (t == null) {
    3. compare(key, key); // type (and possibly null) check
    4. root = new Entry<>(key, value, null);
    5. size = 1;
    6. modCount++;
    7. return null;
    8. }
    9. int cmp;
    10. Entry<K,V> parent;
    11. // split comparator and comparable paths
    12. Comparator<? super K> cpr = comparator;
    13. if (cpr != null) {
    14. do {
    15. parent = t;
    16. cmp = cpr.compare(key, t.key);
    17. if (cmp < 0)
    18. t = t.left;
    19. else if (cmp > 0)
    20. t = t.right;
    21. else
    22. return t.setValue(value);
    23. } while (t != null);
    24. }
    25. else {
    26. if (key == null)
    27. throw new NullPointerException();
    28. @SuppressWarnings("unchecked")
    29. Comparable<? super K> k = (Comparable<? super K>) key;
    30. do {
    31. parent = t;
    32. cmp = k.compareTo(t.key);
    33. if (cmp < 0)
    34. t = t.left;
    35. else if (cmp > 0)
    36. t = t.right;
    37. else
    38. return t.setValue(value);
    39. } while (t != null);
    40. }
    41. Entry<K,V> e = new Entry<>(key, value, parent);
    42. if (cmp < 0)
    43. parent.left = e;
    44. else
    45. parent.right = e;
    46. fixAfterInsertion(e);
    47. size++;
    48. modCount++;
    49. return null;

    }

private void fixAfterInsertion(Entry x) { x.color = RED;

  1. while (x != null && x != root && x.parent.color == RED) {
  2. if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
  3. Entry<K,V> y = rightOf(parentOf(parentOf(x)));
  4. if (colorOf(y) == RED) {
  5. setColor(parentOf(x), BLACK);
  6. setColor(y, BLACK);
  7. setColor(parentOf(parentOf(x)), RED);
  8. x = parentOf(parentOf(x));
  9. } else {
  10. if (x == rightOf(parentOf(x))) {
  11. x = parentOf(x);
  12. rotateLeft(x);
  13. }
  14. setColor(parentOf(x), BLACK);
  15. setColor(parentOf(parentOf(x)), RED);
  16. rotateRight(parentOf(parentOf(x)));
  17. }
  18. } else {
  19. Entry<K,V> y = leftOf(parentOf(parentOf(x)));
  20. if (colorOf(y) == RED) {
  21. setColor(parentOf(x), BLACK);
  22. setColor(y, BLACK);
  23. setColor(parentOf(parentOf(x)), RED);
  24. x = parentOf(parentOf(x));
  25. } else {
  26. if (x == leftOf(parentOf(x))) {
  27. x = parentOf(x);
  28. rotateRight(x);
  29. }
  30. setColor(parentOf(x), BLACK);
  31. setColor(parentOf(parentOf(x)), RED);
  32. rotateLeft(parentOf(parentOf(x)));
  33. }
  34. }
  35. }
  36. root.color = BLACK;
  37. }
  1. <a name="ywPUR"></a>
  2. ### 常用工具类
  3. <a name="IgqF4"></a>
  4. #### Arrays
  5. - sort
  6. - 底层DualPivotQuicksort ,ComparableTimSort这里实现 //TODO
  7. - [https://zhuanlan.zhihu.com/p/374041792](https://zhuanlan.zhihu.com/p/374041792)
  8. - parallelSort
  9. - parallelPrefix
  10. - binarySearch
  11. - equals
  12. - fill
  13. - copyOf copyOfRange
  14. - asList
  15. - hascode
  16. - deepHashCode
  17. - deepEquals
  18. - toString
  19. - deepToString
  20. - parallelSetAll setAll //TODO lambada
  21. - [https://www.cnblogs.com/sweetorangezzz/p/12918962.html](https://www.cnblogs.com/sweetorangezzz/p/12918962.html)
  22. - spliterator
  23. - [https://blog.csdn.net/sl1992/article/details/100149187](https://blog.csdn.net/sl1992/article/details/100149187)
  24. - stream //TODO
  25. - 参考 [https://blog.csdn.net/a13662080711/article/details/84928181](https://blog.csdn.net/a13662080711/article/details/84928181)
  26. <a name="YFV0S"></a>
  27. ## java.util.concurrent
  28. <a name="dZ5FY"></a>
  29. ### 参考
  30. - [https://www.cnblogs.com/sarafill/archive/2011/05/18/2049461.html](https://www.cnblogs.com/sarafill/archive/2011/05/18/2049461.html)
  31. - [https://blog.csdn.net/qq_27378875/article/details/81610696](https://blog.csdn.net/qq_27378875/article/details/81610696)
  32. <a name="ZMYdd"></a>
  33. ### 线程安全容器接口及其实现
  34. - BlockingDeque, BlockingQueue
  35. - ConcurrentMap,ConcurrentNavigableMap
  36. <a name="M9aNk"></a>
  37. ## java.util.concurrent.atomic
  38. <a name="NKPIQ"></a>
  39. #### Atomicxxxx
  40. - 有 AtomicBoolean,AtomicInteger,AtomicIntegerArray,AtomicReference等
  41. - [volatile关键字了解下](https://www.cnblogs.com/dolphin0520/p/3920373.html)
  42. - 使用了 [Unsafe](https://www.jianshu.com/p/db8dce09232d) 主要使用了CAS 能力
  43. - [atomicStampReference](https://blog.csdn.net/zxl1148377834/article/details/90079882)
  44. - [其它类](https://blog.csdn.net/panweiwei1994/article/details/78739264)
  45. <a name="Ej4Fs"></a>
  46. ## java.util.concurrent.locks
  47. <a name="ODJDP"></a>
  48. ### 参考
  49. - [https://www.cnblogs.com/Jason-Xiang/p/8446554.html](https://www.cnblogs.com/Jason-Xiang/p/8446554.html)
  50. - <br />
  51. <a name="KdUM4"></a>
  52. #### AbstractQueuedSynchronizer
  53. - 参考
  54. - [https://blog.csdn.net/qq_39241239/article/details/86934059](https://blog.csdn.net/qq_39241239/article/details/86934059)
  55. <a name="us0Lk"></a>
  56. #### Lock
  57. <a name="mAe4g"></a>
  58. #### Condition
  59. - 参考
  60. - [https://blog.csdn.net/a1439775520/article/details/98471610](https://blog.csdn.net/a1439775520/article/details/98471610)
  61. <a name="piSwY"></a>
  62. #### ReentrantLock
  63. - 内部类 主要实现了锁的逻辑
  64. - Sync
  65. - NonfairSync
  66. - FairSync
  67. ```java
  68. final boolean nonfairTryAcquire(int acquires) {
  69. final Thread current = Thread.currentThread();
  70. int c = getState();
  71. if (c == 0) {
  72. if (compareAndSetState(0, acquires)) {
  73. setExclusiveOwnerThread(current);
  74. return true;
  75. }
  76. }
  77. else if (current == getExclusiveOwnerThread()) {
  78. int nextc = c + acquires;
  79. if (nextc < 0) // overflow
  80. throw new Error("Maximum lock count exceeded");
  81. setState(nextc);
  82. return true;
  83. }
  84. return false;
  85. }
  86. protected final boolean tryAcquire(int acquires) {
  87. final Thread current = Thread.currentThread();
  88. int c = getState();
  89. if (c == 0) {
  90. if (!hasQueuedPredecessors() &&
  91. compareAndSetState(0, acquires)) {
  92. setExclusiveOwnerThread(current);
  93. return true;
  94. }
  95. }
  96. else if (current == getExclusiveOwnerThread()) {
  97. int nextc = c + acquires;
  98. if (nextc < 0)
  99. throw new Error("Maximum lock count exceeded");
  100. setState(nextc);
  101. return true;
  102. }
  103. return false;
  104. }
  • 构造函数

    1. public ReentrantLock() {
    2. sync = new NonfairSync();
    3. }
    4. public ReentrantLock(boolean fair) {
    5. sync = fair ? new FairSync() : new NonfairSync();
    6. }
    • 默认不公平锁
  • Lock 接口实现
    • lock
      • 主要通过 Sync及子类NonfairSync FairSync实现 lock,代码在AbstractQueuedSynchronizer里实现
    • lockInterruptibly
    • tryLock
    • unLock
    • newCondition

java.io