堆,栈

一:概念

1.栈:当程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会被释放,这个栈中的变量也将随之释放。

2.推:存放不在当前方法栈中的那些数据

二、内存区域类型

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制;

1. 栈:存放基本类型 的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new出来的对象)或者常量池中(字符串常量对象存放的常量池中),局部变量【注意:(方法中的局部变量使用final修饰后,放在堆中,而不是栈中)】

2.堆:存放使用new创建的对象,全局变量

3. 静态域:存放静态成员(static定义的);

4. 常量池:字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 ;

5. 非RAM存储:硬盘等永久存储空间

三、栈中放的东西,图示:

JAVA堆里放啥,栈里放啥,一看就懂

JAVA堆里放啥,栈里放啥,一看就懂

四、堆存放示意图:

JAVA堆里放啥,栈里放啥,一看就懂

对于String类的对象特别说明一下:

JAVA堆里放啥,栈里放啥,一看就懂

转载自:https://blog.youkuaiyun.com/weixin_39382337/article/details/79427181

转载于:https://www.cnblogs.com/PengChengLi/p/10487988.html

### 和队列数据结构的区别及应用场景 #### 区别 **1. 数据结构特性** - **(Heap)** 是一种特殊的树形数据结构,通常是一个完全二叉树,并且满足属性:父节点的值总是大于或等于(最大)或小于或等于(最小)其子节点的值。的主要特点是能够快速获取最大值或最小值[^2]。 - **(Stack)** 是一种线性数据结构,只允许在一端进行插入和删除操作,这一端被称为顶。遵循后进先出(LIFO, Last In First Out)的原则[^1]。 - **队列(Queue)** 也是一种线性数据结构,但它的插入操作只能在队尾进行,而删除操作只能在队头进行。队列遵循先进先出(FIFO, First In First Out)的原则[^5]。 **2. 内存管理与实现** - 在操作系统中,**** 是一块内存区域,用于存储函数调用时的局部变量、参数等信息。的管理由编译器自动完成,大小固定,超出容量会导致溢出(stack overflow)错误[^3]。 - **** 是程序运行时动态分配的内存空间,通常由程序员手动申请和释放。如果程序员没有显式释放内存,操作系统会在程序结束时回收这部分内存[^4]。 - **队列** 一般通过数组或链表来实现,既可以是静态的顺序存储结构,也可以是动态的链式存储结构。队列的大小可以根据需求变化,适用于需要处理大量数据的情况[^2]。 **3. 生长方向** - 的生长方向是从高地址向低地址扩展,而的生长方向正好相反,是从低地址向高地址扩展。这种设计是为了避免两者在内存中相互干扰。 --- #### 应用场景 **1. 的应用** - **优先队列**:最常见的应用之一是实现优先队列,其中每个元素都有一个优先级,优先级高的元素优先被处理。例如,在任务调度系统中,紧急的任务可以优先执行[^2]。 - **排序**:排序是一种基于结构的排序算法,能够在 O(n log n) 的时间复杂度内完成排序任务。它特别适合于大规模数据集的排序[^2]。 - **图算法中的最短路径问题**:Dijkstra 算法和 Prim 最小生成树算法都使用了来优化性能,尤其是当图的边数较多时,可以帮助提高效率[^2]。 ```python # 示例:Python 中使用 heapq 实现最小 import heapq heap = [] heapq.heappush(heap, 3) heapq.heappush(heap, 1) heapq.heappush(heap, 2) print(heapq.heappop(heap)) # 输出 1 ``` **2. 的应用** - **函数调用与递归**:在程序运行时用于保存函数调用的上下文信息,包括局部变量、返回地址等。每次函数调用都会将当前状态压入中,函数返回时再从中弹出。 - **括号匹配检查**:在编程语言解析过程中,常用于检查括号是否正确匹配。例如,每当遇到左括号时将其压入,遇到右括号时检查顶是否有对应的左括号并弹出[^1]。 - **表达式求值与转换**:可以用于将中缀表达式转换为后缀表达式(逆波兰表示法),并且可以用来计算后缀表达式的值。这种方法在计算器程序中非常常见。 ```python # 示例:使用实现括号匹配检查 def is_parentheses_matched(expression): stack = [] for char in expression: if char == '(': stack.append(char) elif char == ')': if not stack: return False stack.pop() return len(stack) == 0 print(is_parentheses_matched("((a + b) * c)")) # 输出 True ``` **3. 队列的应用** - **任务调度**:操作系统中的进程调度通常使用队列来管理等待执行的进程。先进先出的特性确保了公平性,所有进程都能按顺序获得 CPU 时间[^5]。 - **缓冲区管理**:在网络通信或文件读写中,队列可以用作缓冲区,临时存储尚未处理的数据包或字节流。这样可以平滑数据传输速率,防止数据丢失[^5]。 - **广度优先搜索(BFS)**:在图遍历算法中,队列用于实现广度优先搜索。BFS 从起始节点出发,逐层访问相邻节点,直到找到目标节点为止。这在社交网络分析、网页爬虫等领域有广泛应用[^5]。 ```python # 示例:使用队列实现广度优先搜索 from collections import deque def bfs(graph, start): visited = set() queue = deque([start]) while queue: node = queue.popleft() if node not in visited: print(node) visited.add(node) for neighbor in graph[node]: if neighbor not in visited: queue.append(neighbor) graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } bfs(graph, 'A') ``` --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值