好吧之前的collection都写的太随意了,基本只是把代码拷贝到博客上
这次就认认真真的解读一下代码吧
先来说说nio的buffer,是bytebuffer等类的虚基类,类里面很多就是用来抛异常的方法就不谈了
然后大部分方法都是返回this,这样就可以链式调用
几个成员变量
capacity 表示buffer的容量
limit表示读/写的上限,读的上限就是之前写的最后一个字符,写的上限就是容量
position当前的位置,读就表示读到哪一个,写就表示写到哪一个
mark,记下的posotion,可以通过一些方法回到之前保存的position
Buffer limit(int newLimit)方法,传入int newLimit
先对参数判断合法性,如果新的limit为负数或比容量大就抛出异常。
然后给limit成员变量赋值
如果新的limit比position小,那么把position设为limit
如果新的limit比mark小,那么mark设为-1
然后就返回了
Buffer position(int newPosition)方法,传入newPostion
如果新的position比limit大 按位或 新的position小于零则抛出异常,这里的按位或没怎么看懂
设置position
如果mark比position还大,那么mark变成-1
返回
构造函数Buffer(int mark, int pos, int lim, int cap)
判断cap小于0的时候抛出异常
先设置cap
然后调用limit方法设置limit
调用position方法设置pos
判断mark >= 0 时,如果mark比pos还大,抛出异常,否则设置mark
int capacity()方法
返回capacity
Int position()方法
返回position
Int limit()方法
返回limit
Buffer mark()方法
将mark设为position
记下当前的位置
Buffer reset()方法
当前mark为负数抛异常
将position设为mark
就是回到之前保存的位置嘛
Buffer clear()方法
将position设为0
Limit设为capacity
Mark设为-1
只是掩耳盗铃的从头开始了,内部的数据根本没有动过……不过这样效率的确高
Buffer flip()方法
Limit赋值为position
Position赋值为0
Mark赋值为-1
感觉这个方法只是用来从写到读的翻转,没有从读到写的翻转啊
Buffer rewind()方法
Position为0
Mark为-1
这个方法没有修改limit
final int remaining()方法
返回limit - position也就是还剩下多少位置,读的话就是剩下多少没读,写就是剩下多少可以写
final boolean hasRemaining()方法
返回position < limit
因为position <= limit嘛,等于的时候就是满了
abstract boolean isReadOnly()
表示该buffer是否只读
abstract boolean hasArray()
判断此缓冲区是否由可访问的数组支持
如果返回true,那么array()方法可以被安全的调用
abstract Object array()
返回支持这个buffer的数组
abstract int arrayOffset()
返回此缓冲区的缓冲区第一个元素的后备数组中的偏移量
如果此缓冲区由数组支持,则缓冲区位置对应于数组索引
abstract boolean isDirect()
表示这个buffer是否直接的
abstract Buffer slice()
创建一个新buffer,其内容是此buffer内容的共享子序列
新buffer的内容将从此buffer的当前position开始。 对此buffer内容的更改将在新buffer中显示,反之亦然; 两个buffer的position,limit和mark将是独立的
新buffer的position将为零,其capacity和limit将是此buffer中剩余的元素数,其mark将是未定义的。 当且仅当此buffer是直接buffer时,新buffer将是直接的,并且当且仅当此buffer是只读时,它才是只读的
abstract Buffer duplicate()方法
创造一个共享当前buffer内容的buffer(大概就是返回一个引用?)
新buffer的内容将是此buffer的内容。 对此buffer内容的更改将在新buffer中显示,反之亦然; 两个buffer的position,limit和mark将是独立的。
新buffer的capacity,limit,position和mark将与此buffer的capacity,limit,position和mark相同。 当且仅当此buffer是直接缓冲区时,新buffer将是直接的,并且当且仅当此buffer是只读时,它才是只读的。
abstract Object base()方法
基本引用,与地址字段配对,它可以用于组合buffer或直接字节buffer(以及视图)的不安全访问
final int nextGetIndex()方法
如果position >= limit,那么直接抛异常(都已经到上限了还怎么下一个嘛)
返回position++
final int nextGetIndex(int nb)方法,就是返回当前position,然后把position向前位移nb个位置
如果limit - position < nb抛出异常()
然后记录position
Position向前位移nb个位置
返回记录好的position
final int nextPutIndex()方法
同上
final int nextPutIndex(int nb)
同上
final int checkIndex(int i)方法 看看目标下标是否合法
如果i小于0或者大于等于limit,抛出异常
如果是合法就返回i
final int checkIndex(int i, int nb)方法 看看从i开始
如果i 小于0或者nb大于limit - i抛出异常
合法返回i
final int markValue()方法
返回mark
final void truncate()方法
Mark为-1
Position为0
Limit为0
Capacity为0
final void discardMark()方法
Mark为-1
static void checkBounds(int off, int len, int size)方法
当off、len、off + len、 size - off - len为负数时抛出异常