02.计算器存储器的原理

news2024/11/15 4:52:18

02.计算器存储器的原理

目录介绍

  • 01.什么是存储器
    • 1.1 了解存储器是什么
    • 1.2 存储器类型
  • 02.存储器系统设计
    • 2.1 存储器分层设计
    • 2.2 存储器层次结构
    • 2.3 高速缓存设计思想
    • 2.4 虚拟内存访问内存
  • 03.存储器类型
    • 3.1 按照材质划分
    • 3.2 按芯片类型划分
    • 3.3 内存 vs CPU
    • 3.4 存储器访问权限
    • 3.5 用户态 vs 内核态
    • 3.6 案例mmap内存映射
  • 04.理解局部性原理
    • 4.1 时间局部性
    • 4.2 空间局部性
  • 05.存储器详细说明
    • 5.1 CPU 寄存器
    • 5.2 CPU 高速缓存
    • 5.3 内存
    • 5.4 硬盘
  • 06.计算机地址映射
    • 6.1 地址映射有哪些
    • 6.2 直接映射
    • 6.3 块映射
    • 6.4 多级映射
    • 6.5 哈希映射
    • 6.6 思考题分析

01.什么是存储器

1.1 了解存储器是什么

  • 计算机存储器是计算机系统中用于存储数据和指令的硬件设备。
    • 它是计算机的核心组成部分之一,用于存储和检索数据以供处理和操作。

1.2 存储器类型

  • 它可以分为主存储器(主内存)和辅助存储器(辅助内存)两种类型。
    • 主存储器(主内存):主存储器是计算机中用于存储当前正在执行的程序和数据的地方。它是计算机系统中最快的存储器,也是CPU直接访问的存储器。
    • 辅助存储器(辅助内存):辅助存储器用于长期存储数据和程序,以及在主存储器不足时作为扩展存储器。辅助存储器的访问速度较慢,但容量通常比主存储器大得多。

02.存储器系统设计

2.1 存储器分层设计

  • 为什么存储器系统要分层?
    • 内存和硬盘都是存储器设备。其实,在 CPU 内部中的寄存器和 CPU L1/L2/L3 缓存也同样是存储设备,而且它们的访问速度比内存和硬盘快几个数量级。
    • 那么,为什么要使用内存和硬盘,直接扩大 CPU 的存储能力不行吗?这就要提到存储器的 3 个主要的性能指标: 速度 + 容量 + 每位价格。
  • 一般来说,存储器的容量越大则速度越低,速度越高则价格越高。
    • 想要获得一个同时满足容量大、速度高且价格低的 “神奇存储器” 是很难实现的。
    • 因此,现代计算机系统会采用分层架构,以满足整个系统在容量、速度和价格上最大的性价比。

2.2 存储器层次结构

  • 在现代计算机系统中,一般采用 “CPU 寄存器 - CPU 高速缓存 - 内存 - 硬盘” 四级存储器结构。自上而下容量逐渐增大,速度逐渐减慢,单位价格也逐渐降低。
    • 1、CPU 寄存器: 存储 CPU 正在使用的数据或指令。寄存器是最靠近 CPU 控制器和运算器的存储器,它的速度最快;
    • 2、CPU 高速缓存: 存储 CPU 近期要用到的数据和指令。CPU 高速缓存是位于 CPU 和内存中间的一层缓存。缓存和内存之间的数据调动是由硬件自动完成的,对上层是完全透明的。
    • 3、内存: 存储正在运行或者将要运行的程序和数据;
    • 4、硬盘: 存储暂时不使用或者不能直接使用的程序和数据。硬盘主要解决存储器系统容量不足的问题,硬盘的速度虽然比内存慢,但硬盘的容量可以比内存大很多,而且断电不丢失数据。
  • 这些存储器设备在计算机系统中协同工作,提供了不同层次和速度的存储能力,以满足计算机的数据存储和访问需求。
  • 在此基础上,对各个层级上进行局部优化,就形成了完整的存储器系统:
    • 优化 1 - CPU 三级缓存: 在 CPU Cache 的概念刚出现时,CPU 和内存之间只有一个缓存,随着芯片集成密度的提高,现代的 CPU Cache 已经普遍采用 L1/L2/L3 多级缓存的结构来改善性能;
    • 优化 2 - 虚拟内存: 程序不能直接访问物理地址,而是访问虚拟地址,虚拟地址需要经过地址变换(Address Translation)才能映射到存放数据的物理地址;
    • 优化 3 - 页缓存: 为了提高读写效率和保护磁盘,操作系统在文件系统中使用了页缓存机制。

2.3 高速缓存设计思想

  • 为什么在 CPU 和内存之间增加高速缓存?
    • 原因 1 - 弥补 CPU 和内存的速度差(主要): 由于 CPU 和内存的速度差距太大,为了拉平两者的速度差,现代计算机会在两者之间插入一块速度比内存更快的高速缓存。只要将近期 CPU 要用的信息调入缓存,CPU 便可以直接从缓存中获取信息,从而提高访问速度;
    • 原因 2 - 减少 CPU 与 I/O 设备争抢访存: 由于 CPU 和 I/O 设备会竞争同一条内存总线,有可能出现 CPU 等待 I/O 设备访存的情况。而如果 CPU 能直接从缓存中获取数据,就可以减少竞争,提高 CPU 的效率。
  • CPU 三级缓存
    • image

2.4 虚拟内存访问内存

  • 为了满足系统的多进程需求和大内存需求,操作系统在内存这一层级使用了虚拟内存管理。
    • 当物理内存资源不足时,操作系统会按照一定的算法将最近不常用的内存换出(Swap Out)到硬盘上,再把要访问数据从硬盘换入(Swap In)到物理内存上。
    • 至于操作系统如何管理虚拟地址和内存地址之间的关系(段式、页式、段页式),对上层应用完全透明。

03.存储器类型

3.1 按照材质划分

  • 1、磁表面存储器: 在金属或塑料表面涂抹一层磁性材料作为记录介质,用磁头在磁层上进行读写操作。例如磁盘、磁带、软盘等,已经逐渐淘汰。
  • 2、光盘存储器: 在金属或塑料表面涂抹一层磁光材料作为记录介质,用激光在磁层上进行读写操作。例如 VCD、DVD 等,已经逐渐淘汰。
  • 3、半导体存储器: 由半导体器件组成的存储器,现代的半导体存储器都会用超大规模集成电路技术将存储器制成芯片,具有体积小、功耗低、存取速度快的优点,是目前主流的存储器技术。

3.2 按芯片类型划分

  • 半导体存储器按照存取方式划分可以分为 2 种:
  • 1、RAM(Random-Access Memory 随机存取存储器):
    • 指可以通过指令对任意存储单元进行读写访问的存储器,在断电后会丢失全部信息。RAM 的容量没有 ROM 大,但速度比 ROM 快很多,通常用作计算机主存。
  • 2、ROM(Read-Only Memory 只读存储器):
    • 指只能进行读取操作的存储器,断电后信息不丢失。随着半导体技术的发展,在 ROM 的基础上又发展出 EEPROM(电可擦除只读存储器)等技术,它们并不符合 ROM 只读的命名,但由于是在 ROM 上衍生的技术,才沿用了原来的叫法。
    • 现在我们更熟悉的 HDD(机械硬盘)和 SSD(固态硬盘) 都是 ROM 的衍生技术。

3.3 内存 vs CPU

3.3.1 访问速度对比
  • 为什么内存的访问速度比 CPU 差这么多?内存的访问速度比CPU慢的主要原因有以下几个方面:
  • 技术差异:内存和CPU使用不同的技术实现。
    • 内存通常使用DRAM(动态随机存取存储器)技术,而CPU使用的是更快速的SRAM(静态随机存取存储器)技术。
    • DRAM的访问速度相对较慢,因为它需要经过一系列复杂的电路和访问步骤来读取和写入数据。
  • 物理距离:内存通常位于计算机主板上,而CPU位于主板上的芯片组或处理器插槽中。
    • 这意味着内存与CPU之间存在物理距离,数据需要通过总线传输到CPU。这种物理距离导致了延迟和传输时间,从而降低了内存访问速度。
  • 容量差异:内存通常具有较大的容量,可以存储大量的数据。
    • 相比之下,CPU的寄存器和缓存存储器容量较小,但速度更快。这是因为较大容量的内存需要更多的电路和组件来实现,这些组件之间的电信号传输需要更多的时间。
  • 层次结构:计算机系统中的存储器通常按照层次结构进行组织,包括寄存器、缓存、主存储器和辅助存储器。
    • 每个层次的存储器速度和容量都不同,较高层次的存储器速度更快但容量较小,而较低层次的存储器速度较慢但容量更大。这种层次结构的设计是为了平衡存储器的速度和容量需求。
3.3.2 关联性说明
  • 内存和CPU之间的关系是紧密相连的。
    • CPU从内存中读取指令和数据,并对其进行处理。内存的访问速度对CPU的性能至关重要,较快的内存可以提供更快的数据传输,从而加快计算机的运行速度。
    • 同时,较大的内存容量可以容纳更多的程序和数据,使得CPU可以同时处理更多的任务。
    • 内存用于存储程序和数据,提供临时存储空间;而CPU执行指令和处理数据,是计算机的核心计算单元。它们之间的协同工作决定了计算机的性能和效率。

3.4 存储器访问权限

  • 在计算机系统中,存储器(Memory)的访问权限可以根据操作系统的设计和保护机制分为:
    • 用户态(User Mode)和内核态(Kernel Mode)。
  • 操作系统通过将处理器从用户态切换到内核态来实现对系统资源的保护和管理。
    • 当应用程序需要执行特权操作或访问受限资源时,它必须通过系统调用(System Call)将控制权转移到内核态。系统调用是一种特殊的指令,它允许应用程序请求操作系统提供特定的服务和功能。
    • 通过将用户态和内核态分离,操作系统可以确保应用程序无法直接访问和破坏关键的系统资源。这种分离提供了安全性和稳定性,同时允许操作系统对资源进行有效的管理和保护。

3.5 用户态 vs 内核态

  • 用户态(User Mode):
    • 在用户态下,应用程序和用户进程运行。在用户态下,程序只能访问受限的内存区域,通常是分配给应用程序的用户空间。
    • 用户态的程序不能直接访问操作系统的核心功能和敏感资源,如硬件设备和操作系统的内核数据结构。
  • 内核态(Kernel Mode):
    • 在内核态下,操作系统内核运行。内核态具有更高的权限和更广泛的访问权限。
    • 在内核态下,操作系统可以访问和控制系统的所有硬件资源、内存和其他核心功能。内核态的程序可以执行特权指令和访问受保护的内核数据结构。
  • MMKV诞生的背景
    • 针对微信聊天该业务,高频率,同步,大量数据写入磁盘的需求。不管用sp,还是store,还是数据库,只要在主线程同步写入磁盘,会很卡。
    • 解决方案就是:使用内存映射mmap的底层方法,相当于系统为指定文件开辟专用内存空间,内存数据的改动会自动同步到文件里。
    • 用浅显的话说:MMKV就是实现用「写入内存」的方式来实现「写入磁盘」的目标。内存的速度多快呀,耗时几乎可以忽略,这样就把写磁盘造成卡顿的问题解决了。

3.6 案例mmap内存映射

  • 用这个案例来了解MMKV在用户态和内核态的速度,然后理解内存映射
    • 用户态:读取硬盘上的某一段数据通常都需要经过 硬盘->内核->用户,即数据需要经历两次拷贝,效率十分低下。
    • 内核态:mmap将设备的物理地址映射到进程的虚拟地址,则用户操作虚拟内存时就相当于对物理设备进行操作了,减少了内核到用户的一次数据拷贝,从而提高数据的吞吐率。
  • 内存映射(Memory Mapping)是一种将文件或设备的内容映射到进程的虚拟内存空间的技术。
    • 在许多操作系统中,包括Unix、Linux和Windows,都提供了内存映射的机制。其中,mmap(Memory Map)是Unix和Linux系统中用于实现内存映射的系统调用。
    • 通过使用mmap,可以将文件或设备的内容直接映射到进程的虚拟内存空间,使得进程可以像访问内存一样访问文件或设备的内容,而无需进行显式的读写操作。这种映射可以是读写的,也可以是只读的。
  • 内存映射的优点包括:
    • 简化IO操作:通过内存映射,可以将文件或设备的内容直接映射到内存,从而简化了对文件或设备的读写操作。
    • 提高性能:由于内存映射允许直接访问文件或设备的内容,避免了数据的复制和缓冲区的使用,因此可以提高IO操作的性能。
    • 共享内存:多个进程可以将同一个文件或设备映射到各自的虚拟内存空间,从而实现共享内存的通信方式。

04.理解局部性原理

  • 局部性原理(Locality Principle)是计算机科学中的一个重要概念
    • 指的是在程序执行期间,访问内存或存储的数据和指令往往具有一定的局部性倾向。
  • 在计算机组成原理中,很多策略中都会体现到局部性原理,在学习中可以有意识地关联起来。
    • 例如在管理 CPU 高速缓存时,除了可以将当前正在访问的内存数据加到到缓存中,还可以把相邻内存的数据一并缓存起来(即 CPU 缓存行),也能够提高缓存命中率。
  • 哪些地方用到了局部性原理
    • 高速缓存、预取技术和指令重排等优化技术都是基于局部性原理的。

4.1 时间局部性

  • 时间局部性(Temporal Locality): 时间局部性表示一个指令或数据被访问过后,在短时间内有很大概率会再次访问。
    • 例如,在程序中的一些函数、循环语句或者变量往往会在短时间内被多次调用;
    • 程序中的循环、迭代和重复操作等结构导致了数据和指令的重复访问。通过利用时间局部性,计算机系统可以将频繁访问的数据和指令缓存在高速缓存(Cache)中,以提高访问速度。

4.2 空间局部性

  • 空间局部性(Spatial Locality): 空间局部性表示一个指令或数据被访问过之后,与它相邻地址的数据有很大概率也会被访问。
    • 例如,在程序中访问了数据的首项元素之后,往往也会访问继续后续的元素。
    • 程序中的数据结构和数组等通常在内存中是连续存储的。通过利用空间局部性,计算机系统可以预取相邻的数据或指令到高速缓存中,以提高访问效率。

05.存储器详细说明

5.1 CPU 寄存器

  • CPU寄存器(Central Processing Unit Registers)
    • 是位于CPU内部的一组高速存储器单元,用于存储和处理指令、数据和中间结果。寄存器是CPU中最快速的存储器,其访问速度比主存储器(内存)更快。
  • 案例说明
    • 一个常见的例子是计算器程序。计算器程序需要执行各种算术和逻辑操作,这些操作通常涉及到CPU寄存器的使用。
    • CPU寄存器用于存储操作数和计算结果。通过将数据加载到寄存器中,CPU可以更快地访问和处理这些数据,从而提高计算器程序的性能。
  • 假设我们有一个简单的计算器程序,可以执行加法和减法操作。以下是一个使用CPU寄存器的计算器程序的示例:
    • 初始化寄存器:程序开始时,将需要使用的寄存器初始化为适当的值。例如,我们可以使用两个通用寄存器(如R1和R2)来存储操作数和结果。
    • 输入操作数:用户输入要进行计算的两个操作数。这些操作数可以存储在内存中的特定位置,然后通过将其加载到寄存器中进行访问。
    • 加法操作:将第一个操作数加载到一个寄存器(如R1),将第二个操作数加载到另一个寄存器(如R2)。然后,使用CPU的加法指令将这两个寄存器中的值相加,并将结果存储在另一个寄存器(如R3)中。
    • 减法操作:类似地,将第一个操作数加载到一个寄存器(如R1),将第二个操作数加载到另一个寄存器(如R2)。然后,使用CPU的减法指令将这两个寄存器中的值相减,并将结果存储在另一个寄存器(如R3)中。
    • 输出结果:将计算得到的结果从寄存器(如R3)中取出,并将其显示给用户。

5.2 CPU 高速缓存

  • CPU高速缓存(CPU Cache)是计算机系统中的一种高速存储器,位于CPU内部或与CPU紧密集成。
    • 它用于提高CPU对内存数据的访问速度,减少对主存储器的访问次数。
  • 高速缓存的设计基于局部性原理,即程序倾向于访问附近的内存位置。
    • 高速缓存通过在CPU和主存储器之间建立一个更小但更快的存储层次结构,存储最近或频繁访问的数据和指令。
    • 当CPU需要访问数据时,它首先检查高速缓存,如果数据在缓存中,则可以快速获取。如果数据不在缓存中,则需要从主存储器中获取,并将其加载到缓存中以供后续访问。
  • 高速缓存通常分为多个级别,例如L1、L2和L3缓存。
    • L1缓存是最接近CPU核心的缓存,速度最快但容量最小。L2缓存位于L1缓存之后,容量较大但速度稍慢。L3缓存是一种更大容量但速度更慢的缓存,通常位于CPU核心之外,多个核心共享。
  • 案例说明
    • 一个常见的案例来说明CPU高速缓存的作用是矩阵乘法运算。假设我们有两个矩阵A和B,需要计算它们的乘积C。矩阵乘法涉及大量的数据读取和计算操作,因此可以用来说明高速缓存的重要性。
  • 以下是一个简化的示例(帮助理解CPU 高速缓存):
    • 初始化矩阵:将矩阵A和B的元素加载到主存储器中。
    • 计算乘积:在计算乘积C的过程中,CPU从主存储器中读取矩阵A和B的元素,并将它们存储在高速缓存中。由于高速缓存的容量有限,只能存储部分数据。
    • 数据访问:在计算乘积C时,CPU需要反复访问矩阵A和B的元素。如果所需的元素已经存在于高速缓存中,CPU可以快速访问它们,从而提高计算速度。这是因为高速缓存的访问速度比主存储器快得多。
    • 缓存命中和缓存未命中:当CPU需要访问一个元素时,它首先检查高速缓存中是否存在该元素。如果存在,称为缓存命中(cache hit),CPU可以直接从高速缓存中读取该元素。如果不存在,称为缓存未命中(cache miss),CPU需要从主存储器中读取该元素,并将其存储在高速缓存中以供后续访问。

5.3 内存

  • 内存(Memory)是计算机系统中用于存储数据和指令的硬件设备。它是计算机系统中的主要存储器,用于临时存储正在执行的程序和数据。
    • 内存通常是基于半导体技术的,例如动态随机存储器(DRAM)或静态随机存储器(SRAM)。它提供了快速的读写访问速度,使得CPU能够快速地读取和写入数据。
    • 需要注意的是,内存是一种易失性存储器,即当计算机系统断电时,内存中的数据将会丢失。因此,为了长期存储数据,通常需要使用辅助存储器(如硬盘驱动器或固态硬盘)。
    • 内存管理是操作系统的重要功能之一,它负责分配和管理内存资源,确保不同程序和进程之间的内存隔离和保护。
  • 计算机内存的使用案例有很多
    • 程序执行:当计算机上的程序被执行时,它们的指令和数据需要加载到内存中。内存提供了一个临时的存储空间,使得CPU能够快速访问和处理这些指令和数据。程序的执行过程中,内存会被不断读取和写入。
    • 数据存储:计算机内存也用于存储数据。例如,当您在文档编辑器中编写文章时,您的输入和编辑内容会被暂时存储在内存中。内存的快速读写速度使得您可以实时地编辑和查看文档。
    • 多任务处理:当计算机同时运行多个程序时,内存被用于存储这些程序的指令和数据。操作系统会将不同的程序加载到内存的不同区域,并为每个程序分配一定的内存空间。这样,每个程序都可以独立地运行,而不会相互干扰。
    • 图形和多媒体处理:计算机内存在图形和多媒体处理中起着重要作用。例如,当您播放视频或运行图形密集型游戏时,视频和图像数据需要加载到内存中进行处理和显示。

5.4 硬盘

  • 硬盘(Hard Disk Drive,HDD)是计算机系统中常见的存储设备之一,用于长期存储和检索数据。
    • 持久性存储:硬盘上的数据可以长期存储,即使计算机关闭或断电,数据也不会丢失。
  • 计算机硬盘使用的常见案例
    • 文件存储和管理:硬盘用于存储用户创建的各种文件,如文档、图片、音频、视频等。用户可以将文件组织在硬盘的不同目录和文件夹中,以便于管理和检索。
    • 多媒体存储和播放:硬盘提供了存储和播放各种多媒体内容的能力。用户可以将音乐、电影、电视节目等多媒体文件存储在硬盘上,并使用相应的应用程序进行播放和观看。

06.计算机地址映射

6.1 地址映射有哪些

  • 在计算机系统中,地址映射是将逻辑地址(或虚拟地址)映射到物理地址的过程。以下是几种常见的地址映射方式:
    • 1.直接映射;
    • 2.块映射
    • 3.多级映射
    • 4.哈希映射

6.2 直接映射

  • 直接映射(Direct Mapping):直接映射是最简单的地址映射方式。
    • 它将逻辑地址的某个范围直接映射到物理地址的相应位置。
    • 例如,逻辑地址0映射到物理地址0,逻辑地址1映射到物理地址1,以此类推。这种映射方式适用于具有固定大小的地址空间。
    • 在直接映射中,每个主存块只能映射到缓存中的一个特定位置,这个位置是通过主存块的地址与缓存大小进行计算得出的。
  • 计算机直接映射例子有哪些
    • CPU 缓存:计算机的 CPU 缓存通常使用直接映射来加速数据访问。主存中的数据块被映射到缓存中的特定位置,以便快速访问。每个主存块只能映射到缓存中的一个位置。
    • 数据库缓存:数据库系统中的缓存可以使用直接映射来提高查询性能。数据库中的数据块被映射到缓存中的特定位置,以便快速访问常用的数据。每个数据块只能映射到缓存中的一个位置。
  • 直接映射优缺点分析
    • 直接映射的优点是简单且易于实现,但缺点是可能会出现映射冲突,导致缓存命中率下降。

6.3 块映射

  • 块映射(Block Mapping):块映射将逻辑地址划分为固定大小的块,并将每个块映射到物理地址的相应块。
    • 这种映射方式可以提高地址空间的利用率,并减少映射表的大小。
    • 常见的块映射方式包括页表映射(Page Table Mapping)和段表映射(Segment Table Mapping)。
    • 用于将逻辑地址空间中的块映射到物理地址空间中的块。在块映射中,逻辑块被映射到物理块,以实现数据的存储和访问。
  • 计算机块映射例子有哪些
    • 文件系统:在文件系统中,文件被分成多个逻辑块,每个逻辑块被映射到存储设备(如硬盘)上的物理块。文件系统使用块映射来管理文件的存储和访问,以便快速定位和读取文件数据。
    • 磁盘映像:在虚拟化环境中,磁盘映像文件通常被分成多个逻辑块,每个逻辑块被映射到宿主机上的物理块。这种块映射方式使得虚拟机可以访问和管理磁盘映像文件中的数据。
  • 块映射的优缺点分析
    • 块映射的优点是可以实现高效的数据存储和访问,但缺点是可能会出现映射冲突和碎片化的问题。

6.4 多级映射

  • 多级映射(Multilevel Mapping):多级映射是一种将逻辑地址映射到物理地址的层次结构映射方式。
    • 它将逻辑地址划分为多个级别,并使用多个映射表来实现地址映射。这种映射方式可以减少映射表的大小,并提高地址转换的效率。
  • 计算机多级映射例子有哪些
    • 虚拟内存管理:在操作系统中,虚拟内存管理使用多级页表来实现逻辑地址到物理地址的映射。逻辑地址空间被分成多个级别的页表,每个级别的页表负责映射一部分地址空间。这种多级映射方式使得操作系统可以管理大范围的虚拟内存,并且可以根据需要进行动态分配和回收。

6.5 哈希映射

  • 哈希映射(Hash Mapping):哈希映射使用哈希函数将逻辑地址映射到物理地址。
    • 它通过计算逻辑地址的哈希值,并将其映射到物理地址的相应位置。这种映射方式可以提供较好的地址分布和查找效率。
  • 计算机哈希映射例子有哪些
    • 计算机中的哈希映射常用于实现哈希表(Hash Table)数据结构,用于高效地存储和检索数据。
    • 假设我们有一个存储学生信息的哈希映射,其中学生的姓名作为键(Key),学生的分数作为值(Value)。我们可以使用学生的姓名来计算哈希值,并将其映射到相应的物理地址。
    import java.util.HashMap;
    
    public class StudentHashMapExample {
        public static void main(String[] args) {
            // 创建一个哈希映射
            HashMap<String, Integer> studentMap = new HashMap<>();
    
            // 添加学生信息到哈希映射
            studentMap.put("Alice", 85);
            studentMap.put("Bob", 92);
            studentMap.put("Charlie", 78);
            studentMap.put("David", 90);
    
            // 获取学生信息
            int aliceScore = studentMap.get("Alice");
            System.out.println("Alice's score: " + aliceScore);
    
            // 更新学生信息
            studentMap.put("Alice", 88);
            aliceScore = studentMap.get("Alice");
            System.out.println("Updated Alice's score: " + aliceScore);
    
            // 删除学生信息
            studentMap.remove("Bob");
            System.out.println("Bob's information removed.");
    
            // 遍历学生信息
            for (String name : studentMap.keySet()) {
                int score = studentMap.get(name);
                System.out.println(name + "'s score: " + score);
            }
        }
    }
    

6.6 思考题分析

  • Java 创建对象的引用是通过直接映射找到对象吗?
    • 在 Java 中,创建对象的引用并不是通过直接映射找到对象的。Java 中的对象引用实际上是指向对象在堆内存中的地址的值。
    • 当我们使用 new 关键字创建一个对象时,Java 会在堆内存中为该对象分配内存空间,并返回该对象在堆内存中的地址。我们可以将这个地址赋值给一个对象引用变量,从而创建一个对象的引用。
    • 对象引用变量存储的是对象在堆内存中的地址,而不是直接映射到对象。当我们通过对象引用变量访问对象的成员变量或方法时,Java 会根据对象引用变量中存储的地址找到对象在堆内存中的位置,并进行相应的操作。
    • 简而言之,Java 中的对象引用是通过存储对象在堆内存中的地址来实现的,而不是通过直接映射找到对象。

更多内容推荐

  • GitHub:https://github.com/yangchong211
  • 博客:https://juejin.cn/user/1978776659695784
  • 博客汇总:https://github.com/yangchong211/YCBlogs
  • 设计模式专栏:https://github.com/yangchong211/YCDesignBlog
  • Java高级进阶专栏:https://github.com/yangchong211/YCJavaBlog
  • 网络协议专栏:https://github.com/yangchong211/YCJavaBlog
  • 计算机基础原理专栏:https://github.com/yangchong211/YCComputerBlog

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

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

相关文章

【Yolov8】实战三:手把手教你使用YOLOv8以及pyqt搭建中医耳穴辅助诊断项目原理及模型部署

摘要 今天&#xff0c;学习RTMPose关键点检测实战。教大家如何安装安装MMDetection和MMPose。 实战项目以三角板关键点检测场景为例&#xff0c;结合OpenMMLab开源目标检测算法库MMDetection、开源关键点检测算法库MMPose、开源模型部署算法库MMDeploy&#xff0c;全面讲解项目…

Spring源码解析(26)之AOP的核心对象创建过程

一、前言 在上一节中我们介绍了在Spring 解析xml配置文件的时候&#xff0c;给我们往容器中生成了很多BeanDefinition&#xff0c;其中最重要的是advice对象&#xff0c;而advice对象最外层是用一个advisor对象包裹起来&#xff0c;而我们的advice对象的创建需要三个参数&#…

|迁移学习| 迁移学习详解及基于pytorch的相关代码实现

&#x1f411; |迁移学习| 迁移学习详解及基于pytorch的相关代码实现 &#x1f411; 文章目录 &#x1f411; |迁移学习| 迁移学习详解及基于pytorch的相关代码实现 &#x1f411;&#x1f411; 前言&#x1f411;&#x1f411; 迁移学习详解&#x1f411;&#x1f411; 迁移学…

第34篇 子程序FINDSUM求和<一>

Q&#xff1a;如何设计汇编语言程序求数组[1:n]的和&#xff1f; A&#xff1a;基本原理&#xff1a;可编写一段实现子程序FINDSUM&#xff0c;子程序中使用一个loop来实现数组的求和运算。子程序FINDSUM的参数N存储在内存中&#xff0c;主程序从该内存中将其读取到一个寄存器…

MES系统如何实现生产任务的自动或辅助调度

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;通过一系列集成化的功能模块和智能算法&#xff0c;实现生产任务的自动或辅助调度。以下是MES系统实现生产任务自动或辅助调度的具体方式&#xff1a; 1. 生产计划与排程 计划制定&am…

【C++从小白到大牛】类和对象

目录 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 类的成员函数两种定义方式&#xff1a; 1. 声明和定义全部放在类体中 2. 类声明放在.h文件中&#xff0c;成员函数定义放在.cpp文件中 成员变量命名规则的建议&#xff1a; 四、类的访问限定符 【访问限…

4.2.2、存储管理-段式存储和段页式存储

段式存储 段式存储是指将进程空间分为一个个段,每段也有段号和段内地址,与页式存储不同的是,每段物理大小不同,分段是根据逻辑整体分段的. 地址表示:(段号,段内偏移):其中段内偏移不能超过该段号对应的段长,否则越界错误,而此地址对应的真正内存地址应该是:段号对应的基地址段…

lambdafunctionbind

lambda匿名函数 定义&#xff1a; 捕捉&#xff1a;传值/传引用/mutable 混合捕捉&#xff0c;&#xff1d;表全普通捕捉 即使全部捕捉&#xff0c; 编译器实现时也不一定全部传入&#xff0c; 编译器只会传入要用到的变量 lambda内可使用的变量的范围 lambda内只能用捕捉对…

Linux gcc day 9

cpu是一个只可以执行指令&#xff0c;不是cpu要打印而是我们要打印&#xff0c;然后编译成指令再给cpu&#xff0c;再通过操作系统进行操手 进程状态&#xff1a; 为什么会有这些状态&#xff1f; 进程的多状态&#xff0c;本质都是为了满足未来不同的运行场景 有那些状态&am…

linux系统的检测脚本,用于检查linux的网络配置,包括网络接口状态、IP地址、子网掩码、默认网关、DNS服务器、连通性测试等等

目录 一、要求 二、脚本介绍 1、脚本内容 2、脚本解释 &#xff08;1&#xff09; 检查是否以 root 用户身份运行 &#xff08;2&#xff09;显示脚本标题 &#xff08;3&#xff09;打印主机名 &#xff08;4&#xff09;获取网络接口信息 &#xff08;5&#xff09…

React学习之props(父传子,子传父),Context组件之间的传参。

目录 前言 一、什么时候需要使用props&#xff1f; 二、使用 1.父传子 2.子传父 二、什么时候需要使用Context&#xff1f; 第一步: 第二步使用&#xff1a; 第一种&#xff1a; 第二种&#xff1a; 演示&#xff1a; 总结 前言 React学习笔记记录&#xff0c;pr…

python | TypeError: list indices must be integers or slices, not tuple

python | TypeError: list indices must be integers or slices, not tuple 在Python编程中&#xff0c;TypeError: list indices must be integers or slices, not tuple 是一个常见的错误。此错误通常发生在尝试使用非整数&#xff08;如元组&#xff09;作为列表索引时。本…

WSL和Windows建立TCP通信协议

1.windows配置 首先是windows端&#xff0c;启动TCP服务端&#xff0c;用来监听指定的端口号&#xff0c;其中IP地址可以设置为任意&#xff0c;否则服务器可能无法正常打开。 addrSer.sin_addr.S_un.S_addr INADDR_ANY; recv函数用来接收客户端传输的数据&#xff0c;其中…

游戏加速器哪个好用

对于游戏加速器&#xff0c;确实有很多不同的选择&#xff0c;每个加速器都有其独特的特点和优势。不过&#xff0c;我可以给你推荐一个最新上线的较受欢迎且评价较高的游戏加速器&#xff0c;供你参考&#xff1a; 深度加速器&#xff1a; 广泛支持&#xff1a;支持国内外众多…

RocketMQ批量消息

RocketMQ消息发送基本示例(推送消费者)-CSDN博客 RocketMQ消费者主动拉取消息示例-CSDN博客 RocketMQ顺序消息-CSDN博客 RocketMQ广播消息-CSDN博客 RocketMQ延时消息-CSDN博客 批量消息 批量消息是指将多条消息合并成一个批量消息,一次发送出去,原先的都是一次发一条.批量…

springboot四川旅游攻略分享互动平台-计算机毕业设计源码70222

摘 要 本研究基于Spring Boot框架开发了一款高效、可靠的四川旅游攻略分享互动平台。该系统主要面向管理员、普通用户和商家用户&#xff0c;涵盖了多个功能模块&#xff0c;包括旅游景点、旅游攻略、景点订单、酒店订单、酒店信息等。通过对系统需求的分析和设计&#xff0c;…

从数据规划到产品运营,拆解数据资产产品化的6大路径

数据资源入表对于企业数据资产的估值影响并不大&#xff0c;要想提升数据资产的整体价值&#xff0c;将数据资产进行产品化是更有效的途径之一。 那么&#xff0c;数据资产产品化的具体路径是怎样的&#xff1f; 在由WakeData惟客数据联合星光数智推出的直播栏目《星光对话》…

打破自闭症束缚:儿童康复案例揭秘

在自闭症的阴霾下&#xff0c;孩子们仿佛被困在一个无形的牢笼中&#xff0c;与外界的世界隔绝。然而&#xff0c;通过不懈的努力和科学的康复方法&#xff0c;许多孩子正在逐渐打破这一束缚&#xff0c;走向充满希望的未来。让我们一同走进几个令人鼓舞的儿童康复案例&#xf…

如何通过阿里云服务器部署hexo博客(超详细)

&#x1f44f;大家好&#xff01;我是和风coding&#xff0c;希望我的文章能给你带来帮助&#xff01; &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;点击 我的主页 还可以看到和风的其他内容噢&#x…

零基础入门转录组数据分析——机器学习算法之boruta(筛选特征基因)

零基础入门转录组数据分析——机器学习算法之boruta&#xff08;筛选特征基因&#xff09; 目录 零基础入门转录组数据分析——机器学习算法之boruta&#xff08;筛选特征基因&#xff09;1. boruta基础知识2. boruta&#xff08;Rstudio&#xff09;——代码实操2. 1 数据处理…