本文共 1484 字,大约阅读时间需要 4 分钟。
说白了,就是一种容器,而这种容器就是专门用来存储一种指定的原始数据类型(基本数据类型int, byte,char,long,short等);
类似参考的概念有集合List,数组,Set, Tree等等
buffer是线性的,有限的基本类型元素的组合;//因为底层是数组
每个缓冲区buffer都是可读的,但并不是每个buffer都是可写的;
Buffer并不是线程安全的,如果多个线程访问buffer时,最好使用同步策略synchronization;
Buffer提倡使用调用链的方式进行调用,如b.flip().position(23).limit(42)
//【闲外话:为什么会有这么多问题,其实我是想从不同的角度去理解一件事物,事物可能从不同的角度表现出来的属性是不一样的,这样可以让我更加全方位的理解,因为有的时候,当别人突然问我时,不知所措;】
buffer里的数据内容,就是你存进缓存buffer里的内容
三个指针吧capacity, limit, position;通过这三个指针,你可以对buffer的整体情况了解
capacity:就是缓存的最大值,此属性的特点就是不可能为负值,buffer一旦创建,就会不改变
limit:就是当前实际可以存储的最大容量
position: 就是进行当前读或者写的位置。
capacity表示的是创建缓存时,指定的存储大小,这个值是不能改变的,
limit是实际存储的大小,这个值是可以改变的
比方说,一个完整的5L水桶,上面有1L,2L,3L,4L的刻度,
那么,capacity就是5L,这个值是不会改变的
limit呢?如果我们规定此水桶只能装到2L,那么limit就是2L了,虽然此水桶最大可以存5L,但实际只能存储到2L。
mark <= position <= limit <=capacity
使用场景:从管道中读数据到缓存,也就是类似于put操作
操作的结果:limit = capacity,position = 0
使用场景:将缓存中的数据,写到管道中去,类似于get操作;
操作的结果:limit = position,position = 0
你可以把缓冲区当做为参考对象,如果你打算往缓冲区里 写入数据的话,就使用clear()操作(很明显的,只有清除clear了旧的数据,新的数据才可以进来啊)
相反,如果你打算从缓冲区里仅仅是读取数据的话,就可以使用flip方法。
很明显,一个针对的是读,一个针对是写
很明显,目前Buffer的子类还是很丰富的,73个。
ByteBuffer
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
StringCharBuffer
MappedByteBuffer
本文转自故新51CTO博客,原文链接: http://blog.51cto.com/xingej/1970018,如需转载请自行联系原作者