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

news2024/11/15 13:52:07

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.coloradmin.cn/o/1391171.html

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

相关文章

3.goLand基础语法

目录 概述语法for常量与变量数组切片 slice切片问题问题1问题2 Make 和 New结构体和指针结构体标签 结束 概述 从 java 转来学 go &#xff0c;在此记录&#xff0c;方便以后翻阅。 语法 for package mainimport "fmt"func main() {for i : 0; i < 3; i {fmt.…

关于java的封装

关于java的封装 我们在前面的文章中&#xff0c;了解到了类和对象的知识&#xff0c;以及做了创建对象的时候对内存的分析&#xff0c;我们本篇文章来了解一下面向对象的三大基本特征之一&#xff0c;封装&#x1f600;。 一、初识封装 封装就好比&#xff0c;我们把一些物品…

如何在 Python3 中使用变量

介绍 变量是一个重要的编程概念&#xff0c;值得掌握。它们本质上是在程序中用于表示值的符号。 本教程将涵盖一些变量基础知识&#xff0c;以及如何在您创建的 Python 3 程序中最好地使用它们。 理解变量 从技术角度来说&#xff0c;变量是将存储位置分配给与符号名称或标…

YOLOv8改进 | 主干篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络PE-YOLO中的PENet,PENet通过拉普拉斯金字塔将图像分解成多个分辨率的组件,增强图像细节和低频信息。它包括一个细节处理模块(DPM),用于通过上下文分支和边缘分支增强图像细节,以及一个低频增强滤波器(LEF),…

<软考高项备考>《论文专题 - 71 风险管理(3)》

3 过程2-识别风险 3.1 问题 4W1H过程做什么是识别单个项目风险以及整体项目风险的来源&#xff0c;并记录风险特征的过程。作用:1、记录现有的单个项目风险&#xff0c;以及整体项目风险的来源:2、汇总相关信息&#xff0c;以便项目团队能够恰当地应对已识别的风险。为什么做…

重温经典struts1之DispatchAction完成一个Action中编写多个方法接收页面的增删改查请求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 之前我们学习的Action类中&#xff0c;编写一个方法&#xff0c;重写父类的execute方法&#xff0c;接收页面发来的请求&#xff0c;而且&#xff0c;一个action中只能…

Jetson AGX Orin安装archiconda、Pytorch

想在Jetson AGX Orin创建一个虚拟环境&#xff0c;然后安装pytorch&#xff0c;过程中遇到了很多的坑&#xff0c;这篇文章主要用于记录过程~因为Orin本身是Arm架构&#xff0c;X86架构可以装Anaconda&#xff0c;对于ARM要装archiconda。 1.安装archiconda 1.1确定操作系统架…

FlinkSQL【分组聚合-多维分析-性能调优】应用实例分析

FlinkSQL处理如下实时数据需求&#xff1a; 实时聚合不同 类型/账号/发布时间 的各个指标数据&#xff0c;比如&#xff1a;初始化/初始化后删除/初始化后取消/推送/成功/失败 的指标数据。要求实时产出指标数据&#xff0c;数据源是mysql cdc binlog数据。 代码实例 --SET t…

【GCC】6 接收端实现:周期构造RTCP反馈包

基于m98代码。GCC涉及的代码,可能位于:webrtc/modules/remote_bitrate_estimator webrtc/modules/congestion_controller webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc webrtc 之 RemoteEstimatorProxy 对 remote_bitrate_estimator 的 RemoteEstimato…

java注释详解

1、Java 中的注释详解 概括&#xff1a;注释是增加一些说明&#xff0c;在编译后&#xff0c;注释会被抹掉&#xff0c;不起任何租用&#xff0c;只在书写代码的时候&#xff0c;对代码进行的一个说明 不管是那种编程语言&#xff0c; 代码的注释都是必备的语法功能&#xff…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(5)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

GitLab Runner 实现项目 CI/CD 发布

Gitlab Runner简介 Gitlab实现CICD的方式有很多&#xff0c;比如通过Jenkins&#xff0c;通过Gitlab Runner等&#xff0c;今天主要介绍后者。Gitlab在安装的时候&#xff0c;就默认包含了Gitlab CI的能力&#xff0c;但是该能力只是用于协调作业&#xff0c;并不能真的去执行…

Vulnhub-tr0ll-1

一、信息收集 端口收集 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_-rwxrwxrwx 1 1000 0 8068 Aug 09 2014 lol.pcap [NSE: writeable] | ftp-syst: | STAT: | FTP …

STM32F103标准外设库——GPIO 输入、输出 (五)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Qt第二周周二作业

代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void paintEvent(…

苹果MAC怎么清理内存?苹果MAC清理内存的方法

很多使用苹果电脑的用户都喜欢在同时运行多个软件&#xff0c;不过这样会导致在运行一些大型软件的时候出现不必要的卡顿现象&#xff0c;这时候我们就可以去清理下内存&#xff0c;不过很多人可能并不知道正确的清内存方式&#xff0c;下面就和小编一起来看看吧。 苹果MAC清理…

微信小程序防止截屏录屏

一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露&#xff0c;给小程序添加一个水印浮层。这样即使被截图或者拍照&#xff0c;也能轻松地确定泄露的源头。效果图如下&#xff1a; 代码…

从云计算到物联网:虚拟化技术的演变与嵌入式系统的融合

文章目录 一、硬件性能提升&#xff1a;摩尔定律与嵌入式虚拟化二、CPU多核技术&#xff1a;为嵌入式虚拟化提供支持三、业务负载整合&#xff1a;嵌入式虚拟化的核心需求四、降低硬件成本&#xff1a;虚拟化技术的经济效益五、软件重用与移植&#xff1a;虚拟化技术的优势六、…

计算机网络-甘晴void学习笔记

计算机网络 计科210X 甘晴void 202108010XXX 文章目录 计算机网络期中复习1计算机网络和因特网1.1 因特网1.2 网络边缘1.3 网络核心1.4 分组交换的时延/丢包和吞吐量1.5 协议层次与服务模型 2 应用层原理2.1 应用层协议原理2.2 Web和Http2.3 因特网中的电子邮件2.4 DNS&#x…

每日一练:LeeCode-107、199、637、429、515、116、117题-层序遍历模版通解 【二叉树】

本文是力扣LeeCode-107、199、637、429、515、116、117题的层序遍历模版通解 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 以下题目都是套用层序遍历的模版解决的: 大家可以去参考我的 每日一练&#xff1a;LeeCode-10…