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

优秀电商设计网站有哪些站长做2个网站

优秀电商设计网站有哪些,站长做2个网站,百度关键词推广公司,互联网行业网站建设目录1、坑点介绍2、正确使用姿势#xff08;入坑了怎么办#xff09;3、坑坑详解3.1HeapByteBuffer可以用buffer.array()3.2DirectByteBuffer的坑在哪里1、坑点介绍 如下代码#xff1a; ByteBuffer buffer ByteBuffer.allocateDirect(int capacity) byte[] array buf… 目录1、坑点介绍2、正确使用姿势入坑了怎么办3、坑坑详解3.1HeapByteBuffer可以用buffer.array()3.2DirectByteBuffer的坑在哪里1、坑点介绍 如下代码 ByteBuffer buffer ByteBuffer.allocateDirect(int capacity) byte[] array buffer.array()在android平台前面会有几个字节是没有实际数据的在jre环境下发生异常。 怎么理解呢 来个栗子 private void bufferTest() {ByteBuffer buffer ByteBuffer.allocateDirect(10);buffer.put((byte) 1);buffer.put((byte) 2);byte[] arr buffer.array();//这里使用array返回字节数组for (int i 0; i 10; i) {Log.d(BufferTester, bufferTest arr[ i ] arr[i]);}}结果如下 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[0]0 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[1]0 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[2]0 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[3]0 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[4]1 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[5]2 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[6]0 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[7]0 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[8]0 2021-10-27 15:29:43.169 D/BufferTester: bufferTest arr[9]0 通过上面的结果可以看到 arr[4]1 arr[5]2。我们是put了1和2正常情况是从数组第一个元素开始写入我们取出的数组却跳跃了前面4个字节。 2、正确使用姿势入坑了怎么办 实际上buffer.array() 是不能用的我们需要使用get(byte[] dst) 或get(byte[] dst, int offset, int length),具体代码如下 private void bufferTest() {ByteBuffer buffer ByteBuffer.allocateDirect(10);buffer.put((byte) 1);buffer.put((byte) 2); // byte[] arr buffer.array();buffer.position(0);byte []arr new byte[10];//put 2次实际是2个字节buffer.get(arr);for (int i 0; i 10; i) {Log.d(BufferTester, bufferTest arr[ i ] arr[i]);}}结果 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[0]1 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[1]2 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[2]0 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[3]0 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[4]0 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[5]0 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[6]0 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[7]0 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[8]0 2021-10-27 15:53:49.954 D/BufferTester: bufferTest arr[9]0 arr[0]1,arr[1]2 是我们期望的结果也是正确结果。 注put一字节postion1所以上述代码在取的时候将pos恢复到起始位置。 所以请使用get方法来获取内容。 如果还是要用array(),那么一定要完全掌握好DirectByteBuffer的机制。 3、坑坑详解 ByteBuffer是一个抽象类通过类函数 allocateDirect(int capacity)创建的是DirectByteBuffer对象通过类函数allocate(int capacity)创建的是HeapByteBuffer对象。关系和代码如下 HeapByteBuffer extends ByteBuffer public static ByteBuffer allocate(int capacity) {if (capacity 0)throw new IllegalArgumentException();return new HeapByteBuffer(capacity, capacity);}DirectByteBuffer extends MappedByteBuffer extends ByteBuffer public static ByteBuffer allocateDirect(int capacity) {if (capacity 0) {throw new IllegalArgumentException(capacity 0: capacity);}DirectByteBuffer.MemoryRef memoryRef new DirectByteBuffer.MemoryRef(capacity);return new DirectByteBuffer(capacity, memoryRef);}简单过一下HeapByteBuffer 是堆上分配的空间DirectByteBuffer是系统分配的空间。 3.1HeapByteBuffer可以用buffer.array() private HeapByteBuffer(int cap, int lim, boolean isReadOnly) {super(-1, 0, lim, cap, new byte[cap], 0);this.isReadOnly isReadOnly;}因为调用super的时候就 按照给定的大小(new byte[cap]) 分配了数组传递给父类最终调用array()的时候就返回的这个数组。 3.2DirectByteBuffer的坑在哪里 注意了我们重点看两个构造函数 DirectByteBuffer.MemoryRef memoryRef new DirectByteBuffer.MemoryRef(capacity); return new DirectByteBuffer(capacity, memoryRef); MemoryRef内存分配 注意看注释要点1、2、3 MemoryRef(int capacity) {VMRuntime runtime VMRuntime.getRuntime();//要点1分配了一个字节数组大小是我们给的大小 7例如我们给10分配了17字节buffer (byte[]) runtime.newNonMovableArray(byte.class, capacity 7);//要点2得到buffer的地址(指针)allocatedAddress runtime.addressOf(buffer);// Offset is set to handle the alignment: http://b/16449607//要点3、计算一个偏移量计算结果是在0-7之间。offset (int) (((allocatedAddress 7) ~(long) 7) - allocatedAddress);isAccessible true;isFreed false;originalBufferObject null;}DirectByteBuffer(int capacity, MemoryRef memoryRef)内存管理与使用 DirectByteBuffer(int capacity, MemoryRef memoryRef) {//要点4、将要点1的数组和要点3的偏移传递给父类super(-1, 0, capacity, capacity, memoryRef.buffer, memoryRef.offset);this.memoryRef memoryRef;//要点5、给address赋值为要点2的地址要点3的偏移地址this.address memoryRef.allocatedAddress memoryRef.offset;cleaner null;this.isReadOnly false; }也许老铁已经看出了端倪此处传递给父类的数组是capacity 7长度的其中address是数组的一个子集举个例子如果capacity 10offset 5那么buffer的长度是17allocatedAddress 是buffer[0]的地址address 就是buffer[5] 地址。 put是自行实现的 public final ByteBuffer put(byte x) {if (!memoryRef.isAccessible) {throw new IllegalStateException(buffer is inaccessible);}if (isReadOnly) {throw new ReadOnlyBufferException();}put(ix(nextPutIndex()), x);return this;}private ByteBuffer put(long a, byte x) { //填充数据Memory.pokeByte(a, x);return this;}private long ix(int i) { //这里是重点新加入的字节用address已经存在的长度所在的位置进行填充数据。return address i;}get(byte[] dst, int dstOffset, int length) 也是通过addr来操作的 public ByteBuffer get(byte[] dst, int dstOffset, int length) {if (!memoryRef.isAccessible) {throw new IllegalStateException(buffer is inaccessible);}checkBounds(dstOffset, length, dst.length);int pos position();int lim limit();assert (pos lim);int rem (pos lim ? lim - pos : 0);if (length rem)throw new BufferUnderflowException();//通过address来取数据Memory.peekByteArray(ix(pos),dst, dstOffset, length);position pos length;return this;}总体来说DirectByteBuffer分配了一个字节数组buffer 长度capacity7并计算出了一个小于7的偏移值x再得到一个buffer的偏移地址address bufferx。put、get都是通过address来存取的因偏移存取起始位置不一定是buffer[0]array() 返回的是buffer因此可能存在前面x个字节没有值。 buffer长度验证 private void bufferTest() {ByteBuffer buffer ByteBuffer.allocateDirect(10);byte[] arr buffer.array();Log.d(BufferTester, bufferTest len arr.length);参数给的10buffer实际长度17 2021-10-27 17:18:14.740 D/BufferTester: bufferTest len 17 同时在jre的环境下DirectByteBuffer的实现稍有区别没有偏移且array被调用会抛出异常。没有计算offset也没有持有数组对象只通过一个地址进行存取。
http://www.sadfv.cn/news/164194/

相关文章:

  • ps下一页哪里搜索引擎优化好
  • 安卓手机网站开发国外木屋建设网站
  • 公司网站是用什么软件做flash里面如何做网站链接
  • 门禁考勤网站建设建设网站教程视频视频视频
  • 企业网站源码怎么获取卓智网络科技有限公司
  • 莱州做网站的公司erp软件是干嘛的
  • 当地信息网站建设资质淮安市住房和城乡建设局网站首页
  • 什么是做网站金属行业网站模板下载
  • 手机端网站需要多少钱wordpress菜单默认对游客不显示
  • 江苏建设服务信息网站做网站租服务器
  • 潮州网络推广公司东营网站搜索引擎优化
  • 设计说明书模板seo报价单
  • 制作外贸网站模板网站制作过程流程
  • 涪陵网站设计统计站老站长推荐app视频
  • 营销型网站的缺点廊坊网站建设模板
  • 做网站有名的公司百度云搜索引擎入口官方
  • 高端品牌网站建设服务网站服务器平台
  • 做网站栏目是什么意思做的网站如何发布会
  • 遂宁模板建站公司工程承包商赚钱吗
  • 用asp.net 做网站电子商务实验网站建设实训过程
  • 网站title keywords现在花钱做那个网站好呀
  • 珠海科技网站建设电子商务和网络营销哪个好
  • 网站域名在哪备案网站开发包括哪些
  • 做ppt时网站怎么设计直播带货平台
  • 网站域名空间5个G的多少钱h5做的公司网站
  • 建设银行网站201308网站设计的设计方案
  • 哪个网站做视频赚钱南通制作公司网站
  • 网站支付怎么做的灰色词排名接单
  • 给一个网站风格做定义dw做网站怎么发布
  • 网站文字公告代码阳江彭志雄