这里解释下,HeapByteBuffer是ByteBuffer的一个实现类。她直接使用父类的构造函数来初始化。super第一个参数是mark,-1表示undefined,然后是position,然后是limit,然后是capacity,接下来就是一个真正存放的数组,最后是数组的偏移。
这下可以理解了,缓冲区实际上是由缓冲区的几个属性、操作和一个存放数据的数组(内存)组成的。我们如果改变数组,或者是通过缓冲区改变数组,都会影响双方的。
例如 CharBuffer charBuffer = CharBuffer.wrap(myArray,12,42)
这样的操作,设置了初始的position和limit。我们可以使用clear函数,然后再开始填充缓冲区,这里的缓冲区,并不是从12到42,而是从0到myArray.length
这里,我们还应该看到一个函数,hasArray(),这说明并非所有的缓冲区都包含一个数组,那么什么样的缓冲区不包含数组呢?答案是直接缓冲区。通过allocate和wrap创建的缓冲区都是间接的。直接缓冲区我们待会儿说。但是无论是直接还是间接,事实上缓冲区都必须又一个存放数据的地方。
如果是直接缓冲区,我们是不能获取到数组的,所以array方法不能再直接缓冲区中调用,否则抛出UnsupportedOperationException异常。当然,如果是只读的缓冲区,我们也不能调用array方法或者是arrayOffset方法。
arrayOffset方法是返回作为备份数组的起始下标。这就说明,并非一个数组必须是所有元素都在缓冲区内,而是可以拆分的。但是这里还没讲到,所以,以上提到的缓冲区,如果使用arrayOffset方法,返回都是0.
为了方便,我们的CharBuffer提供了几个方法
public abstract class CharBuffer
extends Buffer implements CharSequence, Comparable {
// This is a partial API listing
public static CharBuffer wrap (CharSequence csq)
public static CharBuffer wrap (CharSequence csq, int start, int end)
}
我们可以这样用。
CharBuffer charBuffer = CharBuffer.wrap ("Hello World");
这对于字符集码和正则表达式处理都是很方便的。
2、复制缓冲区
这里的复制,仅仅是复制缓冲区,而不是数据。
public abstract class CharBuffer
extends Buffer implements CharSequence, Comparable {
// This is a partial API listing
public abstract CharBuffer duplicate( );
public abstract CharBuffer asReadOnlyBuffer( );
public abstract CharBuffer slice( );
}
这三个函数可以完成复制功能。前两个顾名思义,容易理解,最后一个slice,其实也很容易理解,分割缓冲区,这时,起决于position和limit,新的缓冲区将针对原来的数据中的position到limit之间的数据作为新的缓冲区数据。这时,arrayOffset方法返回的就是position的位置了。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32465-2.html
美国人的行动就是来挑战这种所谓的十二海里领海权
重则军警压制罪犯