JDK-ByteBufferソースコード粗読み

3020 ワード

ByteBufferのベースクラスはBufferであり、Bufferは抽象クラスであり、4つの基本的な属性を定義している.
// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
ByteBufferに基づいて、2つのメンバーが定義されます.
final byte[] hb;                  // Non-null only for heap buffers
final int offset;

注釈から分かるように、hbはheap bufferだけが使用します.ここで言うheap bufferはByteBufferのサブクラスHeapByteBufferです.これも私たちの後の読書の重点です.ほとんどの場合、ByteBufferを使用するのは実はHeapByteBufferを使用しています.ByteBufferの初期化方式は主に多く、その核心属性はfinal byte[] hbであるため、初期化は主に2種類に分けられる:1種類はByteBufferallocate方法によって初期化される:
public static ByteBuffer allocate(int capacity) {
    if (capacity < 0)
        throw new IllegalArgumentException();
    return new HeapByteBuffer(capacity, capacity);
}

ここではHeapByteBufferのオブジェクトが直接newに出てきたことがわかります.もう1つのクラスは、パラメータ伝達構造関数として初期化されたbyte[]です.
ByteBuffer(int mark, int pos, int lim, int cap,   // package-private
             byte[] hb, int offset){
    super(mark, pos, lim, cap);
    this.hb = hb;
    this.offset = offset;
}

または、wrapの方法によって、HeapByteBufferが生成される.
public static ByteBuffer wrap(byte[] array,
                                int offset, int length){
    try {
        return new HeapByteBuffer(array, offset, length);
    } catch (IllegalArgumentException x) {
        throw new IndexOutOfBoundsException();
    }
}
ByteBufferBufferクラスを継承するほか、Comparableインターフェースも実現している.2つのByteBufferを比較すると、ByteBufferの残りのbyte配列が比較され、現在のpositionから最後のbyteまで比較される.
public int compareTo(ByteBuffer that) {
    int n = this.position() + Math.min(this.remaining(), that.remaining());
    for (int i = this.position(), j = that.position(); i < n; i++, j++) {
        int cmp = compare(this.get(i), that.get(j));
        if (cmp != 0)
            return cmp;
    }
    return this.remaining() - that.remaining();
}

private static int compare(byte x, byte y) {
    return Byte.compare(x, y);
}
ByteBufferはまた、equalsの方法を実現し、2つのBufferを比較する機能を提供する.
public boolean equals(Object ob) {
    // , 
    if (this == ob)
        return true;
    // ByteBuffer , 
    if (!(ob instanceof ByteBuffer))
        return false;
    ByteBuffer that = (ByteBuffer)ob;
    // Buffer byte ,  
    if (this.remaining() != that.remaining())
        return false;
    // Buffer 
    int p = this.position();
    for (int i = this.limit() - 1, j = that.limit() - 1; i >= p; i--, j--)
        if (!equals(this.get(i), that.get(j)))
            return false;
    return true;
}

private static boolean equals(byte x, byte y) {
    return x == y;
}