Java NIO (二)NIO Buffer类的重要方法(备份)

1 allocate()方法

        在使用Buffer实例前,我们需要先获取Buffer子类的实例对象,并且分配内存空间。需要获取一个Buffer实例对象时,并不是使用子类的构造器来创建,而是调用子类的allocate()方法。

public class AllocateTest {static IntBuffer intBuffer = null;//一个整型的Buffer静态变量public static void main(String[] args) {//创建一个intbuffer 实例对象intBuffer = IntBuffer.allocate(20);System.out.println("afer allocate ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());}
}

abb55b6d2a6b40129c5a704d62e6c1a6.png

        本例中,IntBuffer是具体的Buffer子类,通过调用IntBuffer.allocate(20)创建了一个intBuffer实例对象,并且分配了20*4字节的内存空间。运行程序后,通过输出结果,可以查看一个新建缓冲区实例对象的主要属性值。

        从上面的运行结果可以看出:一个缓冲区在新建后处于写模式,position属性(代表写入位置)的值是0,缓冲区的capacity值是初始化时allocate方法的参数值,而limit最大可写上限值也为allocate方法的初始化参数值。

2 put()方法

        在调用allocate方法分配内存、返回了实例对象后,缓冲区实例对象处于写模式,可以写入对象,如果要把对象写入缓冲区,就需要调用put()方法。put方法很简单,只有一个参数,即需要写入的独享,只不过要求写入的数据类型与缓冲区的类型保持一致。接着上面的例子向刚刚创建的intBuffer缓存实例对象写入5个整数。

public class AllocateTest {static IntBuffer intBuffer = null;//一个整型的Buffer静态变量public static void main(String[] args) {//创建一个intbuffer 实例对象intBuffer = IntBuffer.allocate(20);System.out.println("before put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {intBuffer.put(i);}System.out.println("after put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());}
}

 0b3efdefc9dc44c6bef3293dda479834.png

        从结果可以看到,写入了5个元素后,缓冲区的position属性值变成了5,所以指向了第6个(从0开始)可以进行写入的元素位置。limit、capacity两个属性的值没有发生变化。

3 flip()方法 

        向缓冲区写入数据之后,是否可以直接从缓冲区读取数据呢?答案是否定的。这时缓冲区还处于写模式,如果需要读取数据,要将缓冲区转换成读模式。flip()翻转方法是Buffer类提供的一个模式转变的重要方法,作用是将写模式转换成读模式。接着前面的例子演示flip()方法。

public class AllocateTest {static IntBuffer intBuffer = null;//一个整型的Buffer静态变量public static void main(String[] args) {//创建一个intbuffer 实例对象intBuffer = IntBuffer.allocate(20);System.out.println("before put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {intBuffer.put(i);}System.out.println("after put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.flip();System.out.println("after flip ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());}
}

063045aa1b1f4fb5adc918b8cb4d615b.png

        调用flip方法后,新模式可读上限limit的值变成了之前写模式下的position的值,也就是5;而新模式下的position的值变成了0,表示从头开始读取。

        对flip()方法从写入到读取转换的规则,再一次详细介绍:

        首先,设置可读上限limit的属性值。将写模式下的缓冲区中内容的最后写入位置position的值作为读模式下的limit上限值。

        其次,把读的起始位置position的值设为0,表示从头开始读。

        最后,清除之前的mark标记,因为mark保存的是写模式下的临时位置,发生模式转换后,如果继续使用旧的mark标记,就会造成位置混乱。

        上面三步可以查看Buffer.flip()方法的源码,具体如下:

 public Buffer flip() {//设置可读上限limit,设置为写模式下的position值limit = position;//把读的起始位置position的值设为0,表示从头开始读position = 0;//清除之前的mark标记mark = -1;return this;}

         新的问题来了:在读取完后,如果再一次将缓冲区切换成写模式呢?答案是:可以调用Buffer.clear()清空或者Buffer.compact()压缩方法,它们可以将缓冲区切换为写模式。

4 get()方法

        调用flip()方法将缓冲区切换成读模式后,就可以开始从缓冲区读取数据了。读取数据的方法很简单,可以调用get()方法从position的位置读取一个数据,并且进行相应的缓冲区属性的调整。接着前面调用flip()方法的实例,演示缓冲区的读取操作。

public class AllocateTest {static IntBuffer intBuffer = null;//一个整型的Buffer静态变量public static void main(String[] args) {//创建一个intbuffer 实例对象intBuffer = IntBuffer.allocate(20);System.out.println("before put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {intBuffer.put(i);}System.out.println("after put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.flip();System.out.println("after flip ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//先读取两个数据for (int i = 0; i < 2; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第一次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//再读取三个数据for (int i = 0; i < 3; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第二次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());}
}

c57f39d84aa14eea94d220c9c75b6cfd.png

        从输出看到,读取操作会改变可读位置position的值,而可读上限limit的值不会改变。在position值和limit值相等时,表示所有数据读取完成,position指向了一个没有数据的元素位置,已经不能在读了。这里强调一下,在读完之后是否可以立即对缓冲区进行数据写入呢?答案是不能。现在还处于读模式,必须调用clear()或compact()方法,即清空或压缩缓冲区,将缓冲区切换成写模式。

5 rewind()方法

        已经读完的数据,如果需要再读一遍,可以调用rewind()方法。rewind()方法也叫倒带,就像播放磁带一样,再重新播放。接着前面的代码,继续rewind()方法使用的演示。

public class AllocateTest {static IntBuffer intBuffer = null;//一个整型的Buffer静态变量public static void main(String[] args) {//创建一个intbuffer 实例对象intBuffer = IntBuffer.allocate(20);System.out.println("before put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {intBuffer.put(i);}System.out.println("after put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.flip();System.out.println("after flip ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//先读取两个数据for (int i = 0; i < 2; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第一次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//再读取三个数据for (int i = 0; i < 3; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第二次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.rewind();System.out.println("after rewind -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());}
}

 97370672218841e49c21601bc1293b3c.png

        rewind()方法主要是调整了缓冲区的position属性与mark属性,调整规则如下:

        1、position重置为0,所以可以重读缓冲区的所有数据。

        2、limit保持不变,数据量还是一样的,仍然可以从缓冲区读取的元素数量。

        3、mark被清理,表示之前的临时位置不能再用了。

        rewind()源码如下:

public Buffer rewind() {//重置为0,所以可以重读缓冲区中的所有数据position = 0;//mark被清理,表示之前的临时位置不能再用了mark = -1;return this;}

         通过源码可以看到rewind()和flip()方法很像,区别在于:rewind()方法不会影响limit属性值;而flip()方法会重设limit属性值。

6 mark()和reset()方法

        mark()和reset()方法是配套使用的:mark()方法将当前position的值保存起来放在mark属性中,让mark属性记住这个临时位置;然后可以调用reset()方法将mark的值恢复到position中。

        例如,在前面重复读取的示例代码中,在读到第三个元素(i=2时)时,可以调用mark方法,把当前位置position的值保存到mark属性中,这时mark属性值是2。

        接下来可以调用reset()方法,将mark属性的值恢复到position中,这样就可以从位置2(第三个元素)开始重复读取了。

public class AllocateTest {static IntBuffer intBuffer = null;//一个整型的Buffer静态变量public static void main(String[] args) {//创建一个intbuffer 实例对象intBuffer = IntBuffer.allocate(20);System.out.println("before put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {intBuffer.put(i);}System.out.println("after put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.flip();System.out.println("after flip ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//先读取两个数据for (int i = 0; i < 2; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第一次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//再读取三个数据for (int i = 0; i < 3; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第二次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.rewind();System.out.println("after rewind -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {if(i == 2){intBuffer.mark();}int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after mark -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.reset();for (int i = 2; i < 5; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after reset -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());}
}

6552eeffaf6e40aa8448321af65aa0c3.png

        在上面的代码中,首先调用reset方法把mark中的值恢复到position中,因此读取的位置position就是2,表示可以再次开始从第三个元素开始读取数据。调用reset方法后,position的值是2,此时去读取缓冲区,输出后面的三个元素2 、3 、4。

7 clear()方法

        在读模式下,调用clear方法将缓冲区切换成写模式。此方法的作用是:

        (1)将position清零。

        (2)limit设置为capacity最大容量值,可以一直写入,直到缓冲区写满。

        接着上面的示例,调用clear方法。

        

public class AllocateTest {static IntBuffer intBuffer = null;//一个整型的Buffer静态变量public static void main(String[] args) {//创建一个intbuffer 实例对象intBuffer = IntBuffer.allocate(20);System.out.println("before put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {intBuffer.put(i);}System.out.println("after put ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.flip();System.out.println("after flip ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//先读取两个数据for (int i = 0; i < 2; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第一次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());//再读取三个数据for (int i = 0; i < 3; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after get 第二次 ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.rewind();System.out.println("after rewind -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());for (int i = 0; i < 5; i++) {if(i == 2){intBuffer.mark();}int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after mark -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.reset();for (int i = 2; i < 5; i++) {int j = intBuffer.get();System.out.println("j = " + j);}System.out.println("after reset -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());intBuffer.clear();System.out.println("after clear -- ----------------");System.out.println("position = " + intBuffer.position());System.out.println("limit = " + intBuffer.limit());System.out.println("capacity = " + intBuffer.capacity());}
}

 d8545bda124b42bb8d9e78b8600fdd44.png

        在缓冲区处于读模式时,调用clear方法,缓冲区被切换成写模式,可以看到清空了position的值,值被设置为0, 并且limit值为最大容量。

8 使用Buffer类的基本步骤

        总体来说,使用Java NIO Buffer类的基本步骤如下:

        (1)使用创建子类实例对象的allocate()方法创建一个Buffer类的实例对象。

        (2)调用put()方法将数据写入缓冲区。

        (3)写入完成后,再开始读取数据之前调用flip()方法,将缓冲区切换成读模式。

        (4)调用get()方法,可以从缓冲区读取数据。

        (5)读取完成后,调用clear()或compact()方法,将缓冲区从读模式切换成写模式,可以继续写入数据。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速看懂一篇英文AI论文?

已经2024年了&#xff0c;该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff0c…

某银行主机安全运营体系建设实践

随着商业银行业务的发展&#xff0c;主机规模持续增长&#xff0c;给安全团队运营工作带来极大挑战&#xff0c;传统的运营手段已经无法适应业务规模的快速发展&#xff0c;主要体现在主机资产数量多、类型复杂&#xff0c;安全团队难以对全量资产进行及时有效的梳理、管理&…

HCIA—— 16每日一讲:HTTP和HTTPS、无状态和cookie、持久连接和管线化、(初稿丢了,这是新稿,请宽恕我)

学习目标&#xff1a; HTTP和HTTPS、无状态和cookie、持久连接和管线化、HTTP的报文、URI和URL&#xff08;初稿丢了&#xff0c;这是新稿&#xff0c;请宽恕我&#x1f636;‍&#x1f32b;️&#xff09; 学习内容&#xff1a; HTTP无状态和cookieHTTPS持久连接和管线化 目…

vue2 pdfjs-2.8.335-dist pdf文件在线预览功能

1、首先先将 pdfjs-2.8.335-dist 文件夹从网上搜索下载&#xff0c;复制到public文件夹下. 2、在components下新建组件PdfViewer.vue文件 3、在el-upload 中调用 pdf-viewer 组件 4、在el-upload 中的 on-preview方法中加上对应的src路径 internalPreview(file) { //判断需要…

编译原理1.3习题 程序设计语言的发展历程

图源&#xff1a;文心一言 编译原理习题整理~&#x1f95d;&#x1f95d; 作为初学者的我&#xff0c;这些习题主要用于自我巩固。由于是自学&#xff0c;答案难免有误&#xff0c;非常欢迎各位小伙伴指正与讨论&#xff01;&#x1f44f;&#x1f4a1; 第1版&#xff1a;自…

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

个人网站制作 Part 7 添加用户认证和数据库集成 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 用户认证与数据库集成&#x1f528;添加用户认证&#x1f527;步骤 1: 使用Passport.js &#x1f528;集成数据库&#x1f527;步骤 2: 使用MongoDB和Mongoose &#x1f…

Grafana(二)Grafana 两种数据源图表展示(json-api与数据库)

一. 背景介绍 在先前的博客文章中&#xff0c;我们搭建了Grafana &#xff0c;它是一个开源的度量分析和可视化工具&#xff0c;可以通过将采集的数据分析、查询&#xff0c;然后进行可视化的展示&#xff0c;接下来我们重点介绍如何使用它来进行数据渲染图表展示 Docker安装G…

AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)

前面分享了平台对运维效率提升的重要性和挑战以及基于大模型的平台建设解决方案&#xff0c;新来的朋友点这里&#xff0c;一键回看精彩原文。 基于大模型构建高效的运维知识及智能问答平台&#xff08;1&#xff09;https://mp.csdn.net/mp_blog/creation/editor/135223109 …

【REMB 】翻译:草案remb-03

REMB REMB消息 以及 绝对时间戳选项 在带宽估计中的使用 :an absolute-value timestamp option for use in bandwidth estimatoin. 接收方带宽估计的RTCP消息 REMB 这位大神翻译的更好。 RTCP message for Receiver Estimated Maximum Bitrate draft-alvestrand-rmcat-remb-03…

iOS开发进阶(六):Xcode14 使用信号量造成线程优先级反转问题修复

文章目录 一、前言二、关于线程优先级反转三、优先级反转会造成什么后果四、怎么避免线程优先级反转五、使用信号量可能会造成线程优先级反转&#xff0c;且无法避免六、延伸阅读&#xff1a;iOS | Xcode中快速打开终端6.1 .sh绑定6.2 执行 pod install 脚本 七、延伸阅读&…

Android Activity的启动流程(Android-10)

前言 在Android开发中&#xff0c;我们经常会用到startActivity(Intent)方法&#xff0c;但是你知道startActivity(Intent)后Activity的启动流程吗&#xff1f;今天就专门讲一下最基础的startActivity(Intent)看一下Activity的启动流程&#xff0c;同时由于Launcher的启动后续…

STM32——DMA知识点及实战总结

1.DMA概念介绍 DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。 DMA传输 将数据从一个地址空间复制到另一个地址空间。 注意&#xff1a;DMA传输无需CPU直接控制传输 2.DMA框图 3.DMA处理过程 外设的 8 个请求独立连接到每个通道&#xff0c;由 DMA_…

YOLOv5改进 | 融合改进篇 | 轻量化CCFM + SENetv2进行融合改进涨点 (全网独家首发)

一、本文介绍 本文给大家带来的改进机制是轻量化的Neck结构CCFM配合SENetv2改进的网络结构进行融合改进,其中CCFM为我本人根据RT-DETR模型一比一总结出来的,文中配其手撕结构图,其中SENetV2为网络结构重构化模块,通过其改进主干从而提取更有效的特征,这两个模块搭配在一起…

Java实现海南旅游景点推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

探索单元测试和 E2E 测试:提升软件质量的关键步骤(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

探索Redis特殊数据结构:Bitmaps(位图)在实际中的应用

一、概述 Redis官方提供了多种数据类型&#xff0c;除了常见的String、Hash、List、Set、zSet之外&#xff0c;还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic&#xff08;HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Confi…

【机组】算术逻辑运算单元实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f33a; 一、 实验目的…

为您的网站添加网站底部美化代码 支持任意网站

将下面代码放在网站底部或者侧边栏&#xff0c;主要是cssjs的代码&#xff01;html格式&#xff01; 在逛 Gitee、Github 等各大代码仓库时&#xff0c;往往能看到以下这种徽章式的网页链接&#xff0c;美观好看又方便&#xff0c;那么这个徽章是如何制作出来的呢&#xff1f;…

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BiLSTM-Adaboost-ABKDE的集成双向长短期记忆网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 …