从底层重学 Java 之 String 字符串
从底层,从原理,我们来重学一次 Java。String 是字符串类,包含比特流与字符串的互转,字符串的常用切割、定位、相等判断,他的源码及实现是怎样的呢?
本系列秉承所有结论尽量从源码中来,没有源码的尽量标明出处。相关源码会附着在文章中,读本文即可,不用再自行查找源码及资料学习,方便大家充分利用路上的碎片时间。
本篇 Chat 对 String 的属性、构造函数、常用字符串处理进行逐一源码分析,帮助大家深入理解和学习 JDK 源码的牛掰优化。
本文包含以下内容:
- 类信息
- 类的定义
- 类的继承结构
- 局部变量
- value
- hash
- 构造函数
- String()
- String(String original)
- String(StringBuffer buffer)
- String(StringBuilder builder)
- String(char value[])
- String(char[] value, boolean share)
- String(char value[], int offset, int count)
- String(int[] codePoints, int offset, int count)
- Character.isBmpCodePoint(int codePoint)
- Character.isValidCodePoint(int codePoint)
- Character.toSurrogates(int codePoint, char[] dst, int index)
- Character.highSurrogate(int codePoint)
- Character.lowSurrogate(int codePoint)
- String(byte bytes[], int offset, int length, String charsetName)
- checkBounds(byte[] bytes, int offset, int length)
- StringCoding.decode(String charsetName, byte[] ba, int off, int len)
- StringCoding.deref(ThreadLocal<SoftReference<T>> tl)
- StringCoding.lookupCharset(String csn)
- StringCoding.StringDecoder
- StringCoding.set(ThreadLocal<SoftReference<T>> tl, T ob)
- CharSequence
- 接口定义
- length()
- charAt(int index)
- subSequence(int start, int end)
- toString()
- chars()
- codePoints()
- length()
- isEmpty()
- charAt(int index)
- getBytes(String charsetName)
- getBytes(Charset charset)
- getBytes()
- StringCoding.encode(char[] ca, int off, int len)
- System.exit(int status)
- StringCoding.encode(String charsetName, char[] ca, int off, int len)
- StringCoding.deref
- StringCoding.set
- StringCoding.lookupCharset(String csn)
- StringCoding.set(ThreadLocal tl, T ob)
- StringCoding.StringEncoder
- StringCoding.safeTrim(byte[] ba, int len, Charset cs, boolean isTrusted)
- Arrays.copyOf(byte[] original, int newLength)
- CharsetEncoder.encode(CharBuffer in, ByteBuffer out, boolean endOfInput)
- CharsetEncoder.flush(ByteBuffer out)
- equals(Object anObject)
- 为什么“==”不行呢?
- contentEquals(StringBuffer sb)
- contentEquals(CharSequence cs)
- equalsIgnoreCase(String anotherString)
- regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
- regionMatches(int toffset, String other, int ooffset, int len)
- compareTo(String anotherString)
- CASE_INSENSITIVE_ORDER
- compareToIgnoreCase(String str)
- startsWith(String prefix, int toffset)
- startsWith(String prefix)
- endsWith(String suffix)
- hashCode()
- indexOf(int ch)
- indexOf(int ch, int fromIndex)
- lastIndexOf(int ch)
- lastIndexOf(int ch, int fromIndex)
- indexOf(String str)
- indexOf(String str, int fromIndex)
- indexOf(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex)
- indexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex)
- lastIndexOf(String str)
- lastIndexOf(String str, int fromIndex)
- lastIndexOf(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex)
- lastIndexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex)
- substring(int beginIndex)
- substring(int beginIndex, int endIndex)
- subSequence(int beginIndex, int endIndex)
- concat(String str)
- getChars(char dst[], int dstBegin)
- replace(char oldChar, char newChar)
- matches(String regex)
- contains(CharSequence s)
- replaceFirst(String regex, String replacement)
- replaceAll(String regex, String replacement)
- replace(CharSequence target, CharSequence replacement)
- split(String regex, int limit)
- split(String regex)
- join(CharSequence delimiter, CharSequence... elements)
- join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
- StringJoiner
- StringJoiner(CharSequence delimiter)
- StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
- setEmptyValue(CharSequence emptyValue)
- toString()
- add(CharSequence newElement)
- merge(StringJoiner other)
- prepareBuilder()
- length()
- toLowerCase(Locale locale)
- toLowerCase()
- ConditionalSpecialCasing
- toLowerCaseEx(String src, int index, Locale locale)
- toUpperCaseEx(String src, int index, Locale locale)
- toLowerCaseCharArray(String src, int index, Locale locale)
- toUpperCaseCharArray(String src, int index, Locale locale)
- lookUpTable(String src, int index, Locale locale, boolean bLowerCasing)
- Entry
- entry
- entryTable
- toUpperCase(Locale locale)
- toUpperCase()
- trim()
- toString()
- toCharArray()
- format(String format, Object... args)
- format(Locale l, String format, Object... args)
- valueOf
- valueOf(char data[])
- valueOf(char data[], int offset, int count)
- copyValueOf(char data[], int offset, int count)
- copyValueOf(char data[])
- valueOf(boolean b)
- valueOf(char c)
- valueOf(int i)
- valueOf(long l)
- valueOf(float f)
- valueOf(double d)
- intern()
**适用人群**:有一些 Java 基础的人群。
从底层重学 Java 之 Stream 初探
从底层,从原理,我们来重学一次 Java。Stream 是 JDK8 中新引入的,方便了数据列表的过滤、投影、遍历等各种处理,他的源码及实现是怎样的呢?
本系列秉承所有结论尽量从源码中来,没有源码的尽量标明出处。相关源码会附着在文章中,读本文即可,不用再自行查找源码及资料学习,方便大家充分利用路上的碎片时间。
本篇 Chat 从 Stream 示例开始,讲解构建 Stream 源码,分析了非并行 forEach 各种情况的源码逻辑,讲解了 Stream 的各个接口及应用示例,帮助大家深入理解和学习 JDK 源码。
本文包含以下内容:
- 列表获取流
- Collection.stream()
- 数组获取流
- Arrays.stream(T[] array)
- Arrays.stream(T[] array, int startInclusive, int endExclusive)
- 直接构建流
- Stream.of
- StreamSupport
- 构造函数
- stream(Spliterator<T> spliterator, boolean parallel)
- Collection.spliterator()
- fail-fast 快速失败机制
- 非并行 forEach
- Stream 直接进行 forEach
- Arrays.stream的forEach
- Arrays.spliterator(T\[\] array, int startInclusive, int endExclusive)
- Spliterators.spliterator(Object\[\] array, int fromIndex, int toIndex, int additionalCharacteristics)
- ArraySpliterator.forEachRemaining(Consumer\<? super T> action)
- 总结
- ArrayList Stream 的 forEach
- Collection.stream()
- ArrayList.spliterator()
- ArrayList.ArrayListSpliterator
- ArrayList.ArrayListSpliterator.forEachRemaining
- 总结
- Stream 进行一次中间操作再 forEach
- ReferencePipeline.filter
- ReferencePipeline.StatelessOp
- ReferencePipeline.forEach
- ForEachOps
- ForEachOps.makeRef(Consumer<? super T> action, boolean ordered)
- ForEachOp
- ForEachOp.OfRef
- AbstractPipeline.evaluate
- ForEachOps.ForEachOp.evaluateSequential
- AbstractPipeline.wrapAndCopyInto
- AbstractPipeline.wrapSink
- AbstractPipeline.copyInto
- Sink.ChainedReference
- 总结
- Stream
- 接口定义
- 接口继承结构
- filter(Predicate<? super T> predicate)
- map(Function<? super T, ? extends R> mapper)
- mapToInt(ToIntFunction<? super T> mapper)
- mapToLong(ToLongFunction<? super T> mapper)
- mapToDouble(ToDoubleFunction<? super T> mapper)
- flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
- flatMapToInt(Function<? super T, ? extends IntStream> mapper)
- flatMapToLong(Function<? super T, ? extends LongStream> mapper)
- flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper)
- distinct()
- sorted()
- sorted(Comparator<? super T> comparator)
- peek(Consumer<? super T> action)
- limit(long maxSize)
- skip(long n)
- forEach(Consumer<? super T> action)
- forEachOrdered(Consumer<? super T> action)
- toArray(IntFunction<A[]> generator)
- reduce(T identity, BinaryOperator<T> accumulator)
- reduce(BinaryOperator<T> accumulator)
- reduce(U identity,BiFunction\<U, ? super T, U> accumulator,BinaryOperator\<U> combiner)
- 调用示例1
- 调用示例2
- 调用示例3
- collect(Supplier\<R> supplier, BiConsumer\<R, ? super T> accumulator, BiConsumer\<R, R> combiner)
- 调用示例1
- 调用示例2
- 调用示例3
- collect(Collector\<? super T, A, R> collector)
- 流转 List 示例
- GroupBy 分组示例
- min(Comparator\<? super T> comparator)
- max(Comparator<? super T> comparator)
- count()
- anyMatch(Predicate\<? super T> predicate)
- 调用示例1
- 调用示例2
- allMatch(Predicate\<? super T> predicate)
- 调用示例1
- 调用示例2
- noneMatch(Predicate\<? super T> predicate)
- 调用示例1
- 调用示例2
- findFirst()
- findAny()
- builder()
- empty()
- of(T t)
- Stream\<T> of(T... values)
- iterate(final T seed, final UnaryOperator\<T> f)
- Streams.NONE
- Spliterators.spliteratorUnknownSize(Iterator\<? extends T> iterator, int characteristics)
- 调用示例
- generate(Supplier<T> s)
- StreamSpliterators
- StreamSpliterators.InfiniteSupplyingSpliterator
- StreamSpliterators.InfiniteSupplyingSpliterator.OfRef\<T>
- 调用示例
- concat(Stream\<? extends T> a, Stream\<? extends T> b)
- Streams.composedClose(BaseStream\<?, ?> a, BaseStream\<?, ?> b)
- Throwable.addSuppressed(Throwable exception)
- Throwable.SUPPRESSED_SENTINEL
- Throwable.suppressedExceptions
- Stream.Builder
- accept(T t)
- add(T t)
- build()
- BaseStream
- 接口定义
- 接口继承结构
- AutoCloseable
- 接口定义
- 接口继承结构
- close()
- try-with-resources
**适用人群**:有一些 Java 基础的人群。
从底层重学 Java 之 BigInteger 大整数
从底层,从原理,我们来重学一次 Java。BigInteger 是大整数计算类,是 BigDecimal 用于存储大数属性的类型,BigDecimal 中很多计算就是基于 BigInteger 的函数进行计算的,采用了多种优化的算法实现,他的源码及实现是怎样的呢?
本系列秉承所有结论尽量从源码中来,没有源码的尽量标明出处。相关源码会附着在文章中,读本文即可,不用再自行查找源码及资料学习,方便大家充分利用路上的碎片时间。
本篇 Chat 对 BigInteger 的属性、构造函数、四则运算、位移等进行逐一源码分析,帮助大家深入理解和学习 JDK 源码的牛掰优化。
本文包含以下内容:
- 类信息
- 类的定义
- 类的继承结构
- 静态代码块
- 静态代码块 1 及相关的常量
- MAX_CONSTANT
- posConst
- negConst
- 静态代码块 2 及相关的常量
- zeros
- 常量
- 属性
- signum
- mag
- 构造函数
- BigInteger(int[] magnitude, int signum)
- BigInteger.ZERO
- 三个静态数组
- bitsPerDigit
- digitsPerInt
- intRadix
- BigInteger(String val)
- private BigInteger(long val)
- 四则运算
- 加
- add(BigInteger val)
- int compareMagnitude(BigInteger val)
- int[] add(int[] x, int[] y)
- int[] subtract(int[] big, int[] little)
- 减
- 乘
- BigInteger multiply(BigInteger val)
- BigInteger multiply(BigInteger val, boolean isRecursion)
- BigInteger multiplyByInt(int[] x, int y, int sign)
- int[] multiplyToLen(int[] x, int xlen, int[] y, int ylen, int[] z)
- Karatsuba 算法
- 实现原理
- BigInteger multiplyKaratsuba(BigInteger x, BigInteger y)
- BigInteger getLower(int n)
- BigInteger getUpper(int n)
- BigInteger abs()
- Integer.numberOfLeadingZeros()
- Toom-Cook 3 路算法
- BigInteger multiplyToomCook3(BigInteger a, BigInteger b)
- BigInteger getToomSlice(int lowerSize, int upperSize, int slice,int fullsize)
- exactDivideBy3
- 平方计算
- implSquareToLen
- squareKaratsuba
- squareToomCook3
- 除
- BigInteger divide(BigInteger val)
- Knuth 算法
- MutableBigInteger
- MutableBigInteger.divideKnuth
- divideOneWord
- divideMagnitude
- Integer.numberOfTrailingZeros
- copyAndShift
- Burnikel-Ziegler 算法
- 算法文章
- 第一步计算
- divide2n1n
- divide3n2n
- divideAndRemainderBurnikelZiegler主算法
- Arrays.fill
- 位运算
- 左移
- 右移
- valueOf
- 其他计算及比较
- BigInteger abs()
**适用人群**:有一些 Java 基础的人群。