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種類はByteBuffer
のallocate
方法によって初期化される: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();
}
}
ByteBuffer
はBuffer
クラスを継承するほか、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;
}