NIO学习(六):Java NIO的Buffer属性(capacity,position,limit,mark)理解

背景
  1. Java NIO中提供了7种基础数据类型的Buffer,分别是:ByteBuffer, CharBuffer,ShortBuffer, LongBuffer, FloatBuffer, DoubleBuffer,它们都继承抽象类Buffer。
  2. 抽象类Buffer的底层就是装字节的容器(字节数组容器)。
  3. Buffer有3个很重要的属性,capactiy, position,limit。
  4. 当buffer调用flip()方法的时候,其实是重新调整limit的值为position的值,而postion的值赋为0。

过程
  1. 获取Buffer的具体实例

    IntBuffer buffer = IntBuffer.allocate(10);
    

    默认是使用HeapIntBuffer类实例化的:

    new HeapIntBuffer(capacity, capacity);
    
  2. 完整测试代码

public static void main(String[] args) {
        IntBuffer buffer = IntBuffer.allocate(10);
        System.out.println("------------读数据前---------");
        System.out.println("position:" + buffer.position());
        System.out.println("limit: " + buffer.limit());
        System.out.println("capacity: " + buffer.capacity());
        for (int i = 0; i < buffer.capacity(); i++) {
            int randomNumber = new SecureRandom().nextInt(20);
            buffer.put(randomNumber);
        }

        System.out.println("------------读数据后---------");
        System.out.println("position:" + buffer.position());
        System.out.println("limit: " + buffer.limit());
        System.out.println("capacity: " + buffer.capacity());

        buffer.flip();

        System.out.println("------------调用flip方法后---------");
        System.out.println("position:" + buffer.position());
        System.out.println("limit: " + buffer.limit());
        System.out.println("capacity: " + buffer.capacity());


        while (buffer.hasRemaining()) {
            System.out.print(buffer.get() + " ");
        }
    }
  1. 结果
    在这里插入图片描述

  2. 图解position和limit值变化过程

    初始化实例后的position和limit值(IntBuffer buffer = IntBuffer.allocate(10))
    在这里插入图片描述
    读入10个数字后

 for (int i = 0; i < buffer.capacity(); i++) {
            int randomNumber = new SecureRandom().nextInt(20);
            buffer.put(randomNumber);
        }

在这里插入图片描述

调用buffer.flip()方法后
在这里插入图片描述

它执行了两个操作,limit = position; position = 0;

测试它最好的就是不要一开始就把容器填充满了
注意:index:10是一个虚框,它本身是不存在的。


小结
  1. 数学关系:0 <= mark <= positon <= limit <= capacity
  2. mark: 标记着当前position可读或可写的索引值
  3. position:指向下一次可读或者可写的索引值
  4. limit:可读可写的索引一定是小于它的,不能等于它
  5. capacity:数组容量,一旦初始化好了,便永远无法修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值