当前位置: 首页 > news >正文

java.nio.ByteBuffer的 capacity, limit, position, mark

java.nio.ByteBuffer的 capacity, limit, position, mark

  1. Capacity(容量)
    定义:缓冲区的总容量,即缓冲区中可以容纳的元素的数量。这个容量在缓冲区创建时被设定,并且之后不能被改变。
    用途:它定义了缓冲区可以容纳多少数据。一旦缓冲区被分配,其容量就固定了。
  2. Limit(限制)
    定义:第一个不应该被读或写的元素的索引,换句话说,是缓冲区的当前终点。
    用途:在写模式下,limit 等于 capacity(表示你不能再往缓冲区中写数据了)。在读模式下,limit 会被设置为某个小于 capacity 的值,表示有多少数据是可读的。limit 可以被改变以反映缓冲区中实际数据的数量。
  3. Position(位置)
    定义:下一个要被读或写的元素的索引。
    用途:它指定了下一个操作(读或写)发生的位置。当从缓冲区读取数据时,position 会自动增加,指向下一个可读的数据。当向缓冲区写入数据时,position 同样会自动增加,指向下一个要写入的位置。
  4. Mark(标记)
    定义:一个备忘位置,通过调用 mark() 方法可以设置。
    用途:在某些操作之后,你可能想回到某个特定的位置,这时就可以使用 mark() 方法来标记当前的位置。之后,无论 position 走到哪里,你都可以通过调用 reset() 方法来回到 mark 标记的位置。注意,mark 是可选的,并且只有在 position 被改变之前,它才是有效的。

初始值: limitcapacity初始值相同, position初始是0, mark是-1

从测试代码可看出: limitcapacity初始值相同, position初始是0, mark是-1

测试代码

import java.nio.ByteBuffer;public class TestByteBuffer2409172015 {public static boolean pln=true;public static void pln(Object...oAr) {if(pln)for(Object o:oAr)System.out.println(o);}public static void main(String...arguments) {ByteBuffer bbf = ByteBuffer.allocate(102400);pln(bbf);pln("bbf.capacity()"+bbf.capacity());pln("bbf.limit()"+bbf.limit());pln("bbf.position()"+bbf.position());pln("bbf.mark()"+bbf.mark());}
}

结果:

java.nio.HeapByteBuffer[pos=0 lim=102400 cap=102400]
bbf.capacity()102400
bbf.limit()102400
bbf.position()0
bbf.mark()java.nio.HeapByteBuffer[pos=0 lim=102400 cap=102400]

可看出:
实现类是: java.nio.HeapByteBuffer
limitcapacity初始值相同
position初始是0
mark()方法不是返回mark属性的值, 而是设置mark=position , 与reset()方法配合使用, mark初始值是-1,在不调用mark()方法就调用reset()方法时,会报错


从源码看出: limitcapacity初始值相同, position初始是0, mark是-1

这四个属性定义在ByteBuffer的父类 java.nio.Buffer中

    private int mark = -1;private int position = 0;private int limit;private final int capacity;

mark初始值是-1 , position初始值是0

ByteBuffer的两个静态工厂方法

    public static ByteBuffer allocateDirect(int capacity) {return new DirectByteBuffer(capacity);}public static ByteBuffer allocate(int capacity) {if (capacity < 0)throw createCapacityException(capacity);return new HeapByteBuffer(capacity, capacity, null);}
  • allocate(int capacity) 方法 new一个继承自ByteBufferHeapByteBuffer类, capacity属性与limit属性值都来自capacity参数值
  • allocateDirect(int capacity) new一个DirectByteBuffer类 extends MappedByteBuffer extends ByteBuffer
        DirectByteBuffer(int cap) {                   // package-privatesuper(-1, 0, cap, cap, null);boolean pa = VM.isDirectMemoryPageAligned();int ps = Bits.pageSize();long size = Math.max(1L, (long)cap + (pa ? ps : 0));Bits.reserveMemory(size, cap);long base = 0;try {base = UNSAFE.allocateMemory(size);} catch (OutOfMemoryError x) {Bits.unreserveMemory(size, cap);throw x;}UNSAFE.setMemory(base, size, (byte) 0);if (pa && (base % ps != 0)) {// Round up to page boundaryaddress = base + ps - (base & (ps - 1));} else {address = base;}try {cleaner = Cleaner.create(this, new Deallocator(base, size, cap));} catch (Throwable t) {// Prevent leak if the Deallocator or Cleaner fail for any reasonUNSAFE.freeMemory(base);Bits.unreserveMemory(size, cap);throw t;}att = null;
    
    super(-1, 0, cap, cap, null); 这句看出 capacitylimit初始值相同

clear()方法也可看出: limitcapacity初始值相同, position初始是0, mark是-1

    public Buffer clear() {position = 0;limit = capacity;mark = -1;return this;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【计算机网络强化】计网强化笔记
  • 【计算机网络 - 基础问题】每日 3 题(二十二)
  • GP2D12红外距离传感器
  • MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境
  • 分库分表-分页排序查询
  • Android开发高频面试题之——Android篇
  • 0-Mapbox简介及产品类型
  • Springboot Mybatis条件查询
  • 计算机网络 --- Socket 编程
  • 24.9.23学习笔记
  • 打造以太坊数据监控利器:InfluxDB与Grafana构建Geth可视化分析平台
  • 设计模式之中介者
  • pyqt QGraphicsView 以鼠标为中心进行缩放
  • LTE协议栈学习
  • [创业之路-151] :职能部门/非经营部门 VS 业务部门/经营部门划分与职责
  • 分享的文章《人生如棋》
  • Android 架构优化~MVP 架构改造
  • css布局,左右固定中间自适应实现
  • IDEA 插件开发入门教程
  • javascript数组去重/查找/插入/删除
  • Java超时控制的实现
  • JS专题之继承
  • laravel with 查询列表限制条数
  • leetcode98. Validate Binary Search Tree
  • Less 日常用法
  • nodejs实现webservice问题总结
  • Python_OOP
  • Redis 懒删除(lazy free)简史
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Twitter赢在开放,三年创造奇迹
  • Xmanager 远程桌面 CentOS 7
  • 大型网站性能监测、分析与优化常见问题QA
  • 面试总结JavaScript篇
  • 如何选择开源的机器学习框架?
  • 三栏布局总结
  • 思考 CSS 架构
  • 用jquery写贪吃蛇
  • 06-01 点餐小程序前台界面搭建
  • FaaS 的简单实践
  • scrapy中间件源码分析及常用中间件大全
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • %check_box% in rails :coditions={:has_many , :through}
  • (11)MSP430F5529 定时器B
  • (7) cmake 编译C++程序(二)
  • (二)学习JVM —— 垃圾回收机制
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)插入排序
  • (转)jQuery 基础
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ***测试-HTTP方法
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET8 动态添加定时任务(CRON Expression, Whatever)