| 容量(Capacity) | 缓冲区能够容纳的数据元素的最大数量,缓冲区创建时被设定,永远不能被改变 |
| 上界(Limit) | 缓冲区第一个不能被读或写的元素,或者说缓冲区中现存元素的计数 |
| 位置(Position) | 下一个要被读或写的元素的索引,位置会自动由相应的get()和put()方法更新 |
| 标记(Mark) | 一个备忘位置,调用mark()方法来设定,mark=position,调用reset方法设定position=mark。标记在设定前是未定义的(undefined) |
四个属性之前总是遵循以下关系:
mark <= position <= limit <= capacity
举例:
// 创建一个ByteBuffer,容量为10
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
位置被设为0,而且容量和上界被设为10,刚好经过缓冲区能够容纳的最后一个字节。标记最初未定义。容量是固定的,但另外的三个属性可以在使用缓冲区时改变
[](
)2.3 缓冲区API介绍
接下来我们先看下Buffer中提供的方法
package java.nio;
public abstract class Buffer {
public final int capacity( )
public final int position( )
public final Buffer position (int newPosition)
public final int limit( )
public final Buffer limit (int newLimit)
public final Buffer mark( )
public final Buffer reset( )
public final Buffer clear( )
public final Buffer flip( )
public final Buffer rewind( )
public final int remaining( )
public final boolean hasRemaining( )
public abstract boolean isReadOnly( );
}
put方法
'存取’也就将数据保存到缓冲区中及从缓冲区中取出数据,在Buffer类中并没有提供get和put方法,这两个方法在具体的Buffer子类中有提供,比如ByteBuffer.如下
public abstract class ByteBuffer
extends Buffer implements Comparable
{
// This is a partial API listing
public abstract byte get( );
public abstract byte get (int index);
public abstract ByteBuffer put (byte b);
public abstract ByteBuffer put (int index, byte b);
}
保存数据到缓冲区
public static void main(String[] args) {
// 创建一个ByteBuffer,容量为10
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
// 看一下初始时4个核心变量的值
System.out.println(“初始时–>limit—>” + byteBuffer.limit());
System.out.println(“初始时–>position—>” + byteBuffer.position());
System.out.println(“初始时–>capacity—>” + byteBuffer.capacity());
System.out.println(“初始时–>mark—>” + byteBuffer.mark());
System.out.println(“--------------------------------------”);
// 添加一些数据到缓冲区中
String s = “bobo”;
byteBuffer.put(s.getBytes());
// 看一下初始时4个核心变量的值
System.out.println(“put完之后–>limit—>” + byteBuffer.limit());
System.out.println(“put完之后–>position—>” + byteBuffer.position());
System.out.println(“put完之后–>capacity—>” + byteBuffer.capacity());
System.out.println(“put完之后–>mark—>” + byteBuffer.mark());
}
输出:
初始时–>limit—>10
初始时–>position—>0
初始时–>capacity—>10
初始时–>mark—>java.nio.HeapByteBuffer[pos=0 lim=10 cap=10]
put完之后–>limit—>10
put完之后–>position—>4
put完之后–>capacity—>10
put完之后–>mark—>java.nio.HeapByteBuffer[pos=4 lim=10 cap=10]
flip方法
现在我想要从缓存区拿数据,怎么拿呢?NIO给了我们一个flip()方法。这个方法可以改动position和limit的位置!
byteBuffer.flip();
System.out.println(“flip完之后–>limit—>” + byteBuffer.limit());
System.out.println(“flip完之后–>position—>” + byteBuffer.position());
System.out.println(“flip完之后–>capacity—>” + byteBuffer.capacity());
System.out.println(“flip完之后–>mark—>” + byteBuffer.mark());
flip完之后–>limit—>4
flip完之后–>position—>0
flip完之后–>capacity—>10
flip完之后–>mark—>java.nio.HeapByteBuffer[pos=0 lim=4 cap=10]
一般我们称filp()为“切换成读模式”
总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是S 需要zi料+ 绿色徽【vip1024b】
pring全家桶资料
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
Lt91lTH-1710363774605)]
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
[外链图片转存中…(img-AqGrxtLT-1710363774606)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是S 需要zi料+ 绿色徽【vip1024b】
pring全家桶资料
[外链图片转存中…(img-lE9EvSD1-1710363774606)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理