Buffer源码解析

[size=large][align=center]Buffer源码解析[/align][/size]

Buffer的demo请看转载自:[url]https://www.cnblogs.com/tankaixiong/p/3949421.html[/url]

/**
* 一个特定基元类型数据的容器。
* 缓冲器是一个特定的线性、有限的元素序列的原始类型。除了内容之外,。
* 缓冲区的基本属性是其容量(capacity)、限制(limit)和位置(position)。
*
* capacity:缓冲区的容量是它包含的元素的数量。缓冲区的容量从不为负,也从不改变。
* limit:缓冲区的limit是应该的第一个元素的索引。也从不为负,小于其capacity。
* position:缓冲区的位置是下一个元素的索引。从不为负,小于它的limit。
*
* 每个非布尔基元类型都有这个类的一个子类。
* 包括(ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer)
*
* 这个类的每个子类定义了两个类别的get和put操作,
*
* 缓冲区是线程不安全,可由多个并发线程使用。如果一个缓冲区将被多个线程使用,然后访问缓冲区。
* 应该通过适当的同步来控制。
*
*/
public abstract class Buffer {

//遍历和分割元素的spliterator的特性。保存在缓冲区
static final int SPLITERATOR_CHARACTERISTICS =
Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.ORDERED;

//不变量:标记(mark) <= 位置(position) <= 极限(limit) <= 容量(capacity)。
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;

//仅由直接缓冲区使用
//注意:在JNI GetDirectBufferAddress中提升速度。
long address;

//创建一个具有给定标记、位置、限制和容量的新缓冲区,检查后不变量。
Buffer(int mark, int pos, int lim, int cap) {
if (cap < 0)
throw new IllegalArgumentException("Negative capacity: " + cap);
this.capacity = cap;
limit(lim);
position(pos);
if (mark >= 0) {
if (mark > pos)
throw new IllegalArgumentException("mark > position: ("
+ mark + " > " + pos + ")");
this.mark = mark;
}
}

//返回该缓冲区的容量
public final int capacity() {
return capacity;
}

//返回该缓冲区的位置
public final int position() {
return position;
}

/**
* 设置此缓冲区的位置。如果标记被定义并且大于新的位置然后被丢弃
* 新位置:必须是非负数且不大于当前的限制
*/
public final Buffer position(int newPosition) {
if ((newPosition > limit) || (newPosition < 0))
throw new IllegalArgumentException();
position = newPosition;
if (mark > position) mark = -1;
return this;
}

//返回该缓冲区的限制
public final int limit() {
return limit;
}

public final Buffer limit(int newLimit) {
if ((newLimit > capacity) || (newLimit < 0))
throw new IllegalArgumentException();
limit = newLimit;
if (position > limit) position = limit;
if (mark > limit) mark = -1;
return this;
}

//在其位置设置此缓冲区的标记
public final Buffer mark() {
mark = position;
return this;
}

//将此缓冲区的位置重置为先前标记的位置。调用此方法既不更改也不丢弃标记的值
public final Buffer reset() {
int m = mark;
if (m < 0)
throw new InvalidMarkException();
position = m;
return this;
}

//清除缓存区,恢复默认值,将limit值定为capacity的值
public final Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
}

//重置缓存区,limit=position(上次写到的位置),position=0(重置为0)
//也可以认为,是将Buffer的写模式,换成读模式,从数组起始处开始读
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}

public final Buffer rewind() {
position = 0;
mark = -1;
return this;
}

//返回当前位置和限制之间的元素个数。
//如果缓存区中的数据已经被全部读取完毕,limit-position=0
public final int remaining() {
return limit - position;
}

//说明当前位置和极限之间是否存在任何元素。若有,返回为true
public final boolean hasRemaining() {
return position < limit;
}

public abstract boolean isReadOnly();

//说明该缓冲区是否由可访问数组支持。
public abstract boolean hasArray();

public abstract Object array();

public abstract int arrayOffset();

//缓存区是否为直接值
public abstract boolean isDirect();

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArrayList是Java集合框架中的一个类,它实现了List接口,可以用来存储一组对象,这些对象可以是任意类型。 下面是ArrayList的源码解析: 1. 成员变量 ```java /** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; /** * Shared empty array instance used for empty instances. */ private static final Object[] EMPTY_ELEMENTDATA = {}; /** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when * first element is added. */ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA * will be expanded to DEFAULT_CAPACITY when the first element is added. */ transient Object[] elementData; // non-private to simplify nested class access /** * The size of the ArrayList (the number of elements it contains). * * @serial */ private int size; ``` ArrayList有三个成员变量,分别是DEFAULT_CAPACITY、EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA。DEFAULT_CAPACITY表示默认的容量大小,EMPTY_ELEMENTDATA是一个空数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一个空数组,但它会在第一次添加元素时扩容为DEFAULT_CAPACITY大小。elementData是一个Object类型的数组,用于存储ArrayList中的元素,size表示ArrayList中元素的数量。 2. 构造方法 ```java /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } /** * Constructs a list containing the elements of the specified * collection, in the order they are returned by the collection's * iterator. * * @param c the collection whose elements are to be placed into this list * @throws NullPointerException if the specified collection is null */ public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // defend against c.toArray (incorrectly) not returning Object[] // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // replace with empty array. this.elementData = EMPTY_ELEMENTDATA; } } /** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @throws IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } ``` ArrayList提供了三个构造方法。第一个构造方法是无参的构造方法,它将elementData赋值为DEFAULTCAPACITY_EMPTY_ELEMENTDATA。第二个构造方法接收一个Collection类型的参数c,它将参数c中的元素转为数组并将其赋值给elementData。第三个构造方法接收一个int类型的参数initialCapacity,它根据参数initialCapacity的值创建一个Object类型的数组并将其赋值给elementData。 3. 常用方法 常用方法包括add()、get()、set()、remove()、size()等。 add()方法用于在ArrayList中添加一个元素,如果elementData的容量不足,就需要进行扩容。扩容的方式是将elementData数组的大小增加50%。 get()方法用于获取ArrayList中指定位置的元素。 set()方法用于将ArrayList中指定位置的元素替换为指定的元素。 remove()方法用于删除ArrayList中指定位置的元素。 size()方法用于获取ArrayList中元素的数量。 4. 总结 ArrayList是Java集合框架中的一个类,它实现了List接口,可以用来存储一组对象。ArrayList的源码解析包括成员变量、构造方法和常用方法。掌握ArrayList的源码可以帮助我们更好地理解它的实现原理,从而更加灵活地应用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值