一些类图
Stream
Stream.of(...) 得到的是 ReferencePipeline.Head 类的实例,ReferencePipeline.Head 类的基类是 ReferencePipeline。以下两个类也是 ReferencePipeline 的子类
ReferencePipeline.StatefulOpReferencePipeline.StatelessOp
简要的类图如下(图中忽略了所有的泛型,且大部分字段/方法都没有画)⬇️
classDiagram
class AutoCloseable
class BaseStream
class Stream
class PipelineHelper
class `ReferencePipeline.Head`
class ReferencePipeline
class AbstractPipeline
class `ReferencePipeline.StatefulOp`
class `ReferencePipeline.StatelessOp`
<<interface>> AutoCloseable
<<interface>> BaseStream
<<interface>> Stream
<<Abstract>> PipelineHelper
<<Abstract>> ReferencePipeline
<<Abstract>> AbstractPipeline
AutoCloseable <|-- BaseStream
BaseStream <|-- Stream
Stream <|.. ReferencePipeline
PipelineHelper <|-- AbstractPipeline
AbstractPipeline <|-- ReferencePipeline
ReferencePipeline <|-- `ReferencePipeline.Head`
ReferencePipeline <|-- `ReferencePipeline.StatefulOp`
ReferencePipeline <|-- `ReferencePipeline.StatelessOp`
AbstractPipeline: - final AbstractPipeline sourceStage
AbstractPipeline: # final AbstractPipeline previousStage
AbstractPipeline: - AbstractPipeline nextStage
AbstractPipeline: - int depth
我把上图中出现的类名/接口名与 Fully Qualified Name 之间的对应关系列在下表里了 ⬇️
| 在上图中的类名/接口名 | Fully Qualified Name |
|---|---|
AutoCloseable | java.lang.AutoCloseable |
BaseStream | java.util.stream.BaseStream |
Stream | java.util.stream.Stream |
PipelineHelper | java.util.stream.PipelineHelper |
AbstractPipeline | java.util.stream.AbstractPipeline |
ReferencePipeline | java.util.stream.ReferencePipeline |
ReferencePipeline.Head | java.util.stream.ReferencePipeline.Head |
ReferencePipeline.StatefulOp | java.util.stream.ReferencePipeline.StatefulOp |
ReferencePipeline.StatelessOp | java.util.stream.ReferencePipeline.StatelessOp |
利用 AbstractPipeline 类中的 previousStage/nextStage 字段,可以把 ReferencePipeline 的实例组织成双向链表的形式。
用代码验证
请将如下代码保存为 Main.java ⬇️
import java.util.function.Function;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
System.out.println(Stream.of().getClass().getName());
System.out.println(Stream.of().map(Function.identity()).getClass().getSuperclass().getName());
System.out.println(Stream.of().sorted().getClass().getSuperclass().getName());
}
}
用以下命令可以编译 Main.java 并运行其中的 main 方法 ⬇️
javac Main.java
java Main
运行结果如下 ⬇️
java.util.stream.ReferencePipeline$Head
java.util.stream.ReferencePipeline$StatelessOp
java.util.stream.ReferencePipeline$StatefulOp
可以把相关信息整理成如下的表格 ⬇️
| 生成的对象所属的类 | |
|---|---|
Stream.of(...) | ReferencePipeline.Head |
Stream.of(...).map(...) | ReferencePipeline.StatelessOp 的匿名子类 |
Stream.of(...).sorted() | ReferencePipeline.StatefulOp 的子类 |
OutOfMemoryError/StackOverflowError/NullPointerException 等
classDiagram
Throwable <|-- Exception
RuntimeException <|-- IndexOutOfBoundsException
RuntimeException <|-- NullPointerException
Throwable <|-- Error
VirtualMachineError <|-- OutOfMemoryError
VirtualMachineError <|-- StackOverflowError
Exception <|-- RuntimeException
Error <|-- VirtualMachineError
RuntimeException <|-- IllegalStateException
RuntimeException <|-- IllegalArgumentException
RuntimeException <|-- UnsupportedOperationException
Serializable <|.. Throwable
<<Abstract>> VirtualMachineError
<<interface>> Serializable
| 在上图中的类名/接口名 | Fully Qualified Name |
|---|---|
Error | java.lang.Error |
Exception | java.lang.Exception |
IllegalArgumentException | java.lang.IllegalArgumentException |
IllegalStateException | java.lang.IllegalStateException |
IndexOutOfBoundsException | java.lang.IndexOutOfBoundsException |
NullPointerException | java.lang.NullPointerException |
OutOfMemoryError | java.lang.OutOfMemoryError |
RuntimeException | java.lang.RuntimeException |
Serializable | java.io.Serializable |
StackOverflowError | java.lang.StackOverflowError |
Throwable | java.lang.Throwable |
UnsupportedOperationException | java.lang.UnsupportedOperationException |
VirtualMachineError | java.lang.VirtualMachineError |
ArrayList
所有泛型信息均已略去
classDiagram
Iterable <|-- Collection
Collection <|.. AbstractCollection
AbstractCollection <|-- AbstractList
AbstractList <|-- ArrayList
Collection <|-- SequencedCollection
SequencedCollection <|-- List
List <|.. AbstractList
List <|.. ArrayList
RandomAccess <|.. ArrayList
Cloneable <|.. ArrayList
Serializable <|.. ArrayList
<<interface>> Serializable
<<interface>> Cloneable
<<interface>> RandomAccess
<<interface>> SequencedCollection
<<interface>> List
<<interface>> Iterable
<<interface>> Collection
<<Abstract>> AbstractCollection
<<Abstract>> AbstractList
| 上图中使用的名称 | fully qualified name |
|---|---|
Serializable | java.io.Serializable |
Cloneable | java.lang.Cloneable |
RandomAccess | java.util.RandomAccess |
SequencedCollection | java.util.SequencedCollection |
List | java.util.List |
Iterable | java.lang.Iterable |
Collection | java.util.Collection |
AbstractCollection | java.util.AbstractCollection |
AbstractList | java.util.AbstractList |
ArrayList | java.util.ArrayList |
LinkedList
所有泛型信息均已略去
classDiagram
Iterable <|-- Collection
Collection <|.. AbstractCollection
AbstractCollection <|-- AbstractList
AbstractList <|-- AbstractSequentialList
AbstractSequentialList <|-- LinkedList
Collection <|-- SequencedCollection
SequencedCollection <|-- List
List <|.. AbstractList
List <|.. LinkedList
SequencedCollection <|-- Deque
Collection <|-- Queue
Queue <|-- Deque
Deque <|.. LinkedList
Cloneable <|.. LinkedList
Serializable <|.. LinkedList
<<interface>> Serializable
<<interface>> Cloneable
<<interface>> Iterable
<<interface>> Collection
<<interface>> SequencedCollection
<<interface>> List
<<interface>> SequencedCollection
<<interface>> Queue
<<interface>> Deque
<<Abstract>> AbstractCollection
<<Abstract>> AbstractList
<<Abstract>> AbstractSequentialList
| 上图中使用的名称 | fully qualified name |
|---|---|
Iterable | java.lang.Iterable |
Collection | java.util.Collection |
AbstractCollection | java.util.AbstractCollection |
AbstractList | java.util.AbstractList |
AbstractSequentialList | java.util.AbstractSequentialList |
SequencedCollection | java.util.SequencedCollection |
List | java.util.List |
Queue | java.util.Queue |
Deque | java.util.Deque |
Cloneable | java.lang.Cloneable |
Serializable | java.io.Serializable |
LinkedList | java.util.LinkedList |
HashMap 和 LinkedHashMap
所有泛型信息均已略去
classDiagram
Map <|.. AbstractMap
AbstractMap <|-- HashMap
Map <|.. HashMap
Cloneable <|.. HashMap
Serializable <|.. HashMap
HashMap <|-- LinkedHashMap
Map <|-- SequencedMap
SequencedMap <|.. LinkedHashMap
<<interface>> Cloneable
<<interface>> Serializable
<<interface>> Map
<<Abstract>> AbstractMap
<<interface>> SequencedMap
| 上图中使用的名称 | fully qualified name |
|---|---|
LinkedHashMap | java.util.LinkedHashMap |
HashMap | java.util.HashMap |
AbstractMap | java.util.AbstractMap |
Map | java.util.Map |
Cloneable | java.lang.Cloneable |
Serializable | java.io.Serializable |
SequencedMap | java.util.SequencedMap |
HashMap 里的 Node
所有泛型信息均已略去
classDiagram
`java.util.Map$Entry` <|.. `java.util.HashMap$Node`
`java.util.HashMap$Node` <|-- `java.util.LinkedHashMap$Entry`
`java.util.LinkedHashMap$Entry` <|-- `java.util.HashMap$TreeNode`
<<interface>> `java.util.Map$Entry`
StringBuilder 和 StringBuffer
所有泛型信息均已略去
classDiagram
Appendable <|.. AbstractStringBuilder
CharSequence <|.. AbstractStringBuilder
AbstractStringBuilder <|-- StringBuilder
Appendable <|.. StringBuilder
Serializable <|.. StringBuilder
Comparable <|.. StringBuilder
CharSequence <|.. StringBuilder
AbstractStringBuilder <|-- StringBuffer
Appendable <|.. StringBuffer
Serializable <|.. StringBuffer
Comparable <|.. StringBuffer
CharSequence <|.. StringBuffer
<<Abstract>> AbstractStringBuilder
<<interface>> Appendable
<<interface>> CharSequence
<<interface>> Comparable
<<interface>> Serializable
| 在上图中的类名/接口名 | Fully Qualified Name |
|---|---|
AbstractStringBuilder | java.lang.AbstractStringBuilder |
Appendable | java.lang.Appendable |
CharSequence | java.lang.CharSequence |
Comparable | java.lang.Comparable |
Serializable | java.io.Serializable |
StringBuffer | java.lang.StringBuffer |
StringBuilder | java.lang.StringBuilder |
java.lang.AbstractStringBuilder 是一个密封类(sealed class),它只有 java.lang.StringBuilder 和 java.lang.StringBuffer 这两个子类(这两个子类都是 final class)