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

LeetCode第二题知识点2 ---- 栈、堆、地址

内存地址(Memory Address)

内存就像一个巨大的“公寓楼”,每间房都有一个编号(比如 0x1000、0x1004),这个编号就是内存地址

  • 💡 作用:
    计算机通过地址找到数据存放在哪里。变量、对象、函数代码都住在内存的不同“房间”里。

一.什么是“内存”?

💡 想象:内存就像一栋大楼

  • 这栋大楼有很多房间(每个房间是一个“内存地址”)。
  • 每个房间可以存放数据(比如数字、字母)。
  • 程序运行时,所有的变量、对象都住在这栋“内存大楼”里。

内存(Memory) = 程序运行时用来存储数据的物理空间(通常是 RAM)。

二、内存的两个主要区域:栈 和 堆

这栋“内存大楼”被划分为两个区域:

区域英文特点存什么
Stack自动管理、速度快、空间小局部变量、方法调用
Heap手动/自动管理、速度慢、空间大对象、数组

我们来一个个讲。

三、栈(Stack)——“自动售货机式的存储”

🎯 特点:

  • 后进先出(LIFO):就像一摞盘子,只能从上面拿或放。
  • 自动管理:函数调用结束,变量自动销毁。
  • 速度快:因为结构简单,编译器能高效管理。
  • 空间小:不能存太大或太多东西。

🧩 栈里存什么?

  1. 基本类型变量intbooleandouble 等
  2. 引用变量(注意:引用本身在栈里,它指向的对象在堆里)
  3. 方法调用信息:比如参数、返回地址
    public void methodA() {int a = 10;            // a 在栈上boolean flag = true;   // flag 在栈上ListNode cur = new ListNode(0);  // cur(引用)在栈上,但 new ListNode(0) 在堆上!
    }

执行时,栈的样子:

     栈(Stack)+----------------+| cur  -> 0x123  |  ← methodA 调用时| flag = true    || a = 10         |+----------------+

methodA 执行完,整个这一块自动“弹出”,a, flag, cur 全部消失。

 四、堆(Heap)——“自由市场式的存储”

🎯 特点:

  • 手动/自动管理:Java 用垃圾回收(GC)自动清理。
  • 空间大:可以存大型对象、数组。
  • 速度慢:因为要动态分配,管理复杂。
  • 全局访问:堆上的对象可以被多个引用访问。

🧩 堆里存什么?

  • 对象new 出来的任何东西
  • 数组
  • 所有通过 new 创建的数据
ListNode node = new ListNode(0);

内存布局:

      栈(Stack)        堆(Heap)+-----------+     +-------------+
node:|  0x123    | --> | val: 0      |+-----------+     | next: null  |+-------------+
  • node 是一个引用,它在上,存的是地址 0x123
  • new ListNode(0) 是一个对象,它在上,地址是 0x123

五、关键区别:引用 vs. 对象

项目栈(Stack)堆(Heap)
存什么引用变量(如 node对象本身(如 new ListNode(0)
生命周期方法结束就销毁直到没人引用它(GC 回收)
访问方式直接访问通过引用访问

🔑 引用是“钥匙”,堆是“房子”,栈是“钥匙串”

六、一个完整例子:看栈和堆如何协作

public class Example {public static void main(String[] args) {ListNode pre = new ListNode(0);ListNode cur = pre;cur.val = 999;}
}

🧱 执行过程:

1. ListNode pre = new ListNode(0);
       栈(Stack)        堆(Heap)+-----------+     +-------------+
pre: |  0x123    | --> | val: 0      |+-----------+     | next: null  |+-------------+
2. ListNode cur = pre;
       栈(Stack)        堆(Heap)+-----------+     +-------------+
pre: |  0x123    | --> | val: 0      |+-----------+     | next: null  |
cur: |  0x123    | --> |             |+-----------+     +-------------+

👉 precur 都在栈上,指向堆中同一个对象。

3. cur.val = 999;
       栈(Stack)        堆(Heap)+-----------+     +-------------+
pre: |  0x123    | --> | val: 999    |  ← 被修改了!+-----------+     | next: null  |
cur: |  0x123    | --> |             |+-----------+     +-------------+

👉 虽然 cur 在栈上,但它通过引用修改了堆上的对象。

所以 pre.val 也会是 999!

http://www.dtcms.com/a/356348.html

相关文章:

  • 不止 ChatGPT:多模态 AI(文本 + 图像 + 音频)正重构内容创作全流程
  • 数据质检之springboot通过yarn调用spark作业实现数据质量检测
  • 第三章 Vue3 + Three.js 实战:用 OrbitControls 实现相机交互与 3D 立方体展示
  • Unity学习----【数据持久化】二进制存储(一)
  • ExcelJS实现导入转换HTML展示(附源码可直接使用)
  • Excel数组学习笔记
  • 在Excel和WPS表格中隔一行插入多个空白行
  • 网络编程 04:TCP连接,客户端与服务器的区别,实现 TCP 聊天及文件上传,Tomcat 的简单使用
  • 从零开始部署 Kubernetes Dashboard:可视化管理你的集群
  • [Linux]学习笔记系列 -- mm/shrinker.c 内核缓存收缩器(Kernel Cache Shrinker) 响应内存压力的回调机制
  • 创意程序之MP3分割工具
  • sqlachemy
  • AI操作系统语言模型设计 之1 基于意识的Face-Gate-Window的共轭路径的思维-认知-情感嵌套模型
  • 【C语言】深入理解指针(2)
  • 龙迅#LT7621GX适用于两路HDMI2.1/DP1.4A转HDMI2.1混切应用,分辨率高达8K60HZ!
  • 第二阶段WinForm-11:自定义控件
  • 嵌入式Linux驱动开发:i.MX6ULL中断处理
  • 深入解析Qt节点编辑器框架:交互逻辑与样式系统(二)
  • C++基础(⑤删除链表中的重复节点(链表 + 遍历))
  • 储能变流器之LLC
  • MySQL数据库精研之旅第十四期:索引的 “潜规则”(上)
  • Unity、Unreal Engine与Godot中纹理元数据管理的比较分析
  • 嵌入式Linux LED驱动开发
  • Ubuntu22.04系统安装Opencv,无法定位包libjasper-dev libdc1394-22-dev的解决办法
  • 【C++】C++入门——(上)
  • GTSAM中gtsam::LinearContainerFactor因子详解
  • 【C++八股文】计算机网络篇
  • 【YOLO学习笔记】数据增强mosaic、Mixup、透视放射变换
  • flutter-使用url_launcher打开链接/应用/短信/邮件和评分跳转等
  • leetcode 338 比特位计数