Java中的数据存储(堆、栈、常量池)

软考「系统规划与管理师(第2版)」抱佛脚|案例分析预测 规划类(系统/数据/云)+ 服务过程找错改进 + 风险应急终止三大块各备一套成熟模板,术语统一按第2版新教材口径,案例分析 45 分线的希望就大很多。 阅读详情

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。
2.栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
3.堆:存放所有new出来的对象。
4.静态域:存放静态成员(static定义的)。
5.常量池:存放字符串常量和基本类型常量(public static final)。
6.非RAM存储:硬盘等永久存储空间。

这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
如以下代码:

String s1 = "china";   
String s2 = "china";   
String s3 = "china";   
String ss1 = new String("china");   
String ss2 = new String("china");   
String ss3 = new String("china"); 

Java中的数据存储(堆、栈、常量池) - ZmeSky -    ZmeSky    的博客
 

 这里解释一下黄色这3个箭头,对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。这也就是有道面试题:String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。

对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
如以下代码:
int i1 = 9;   
int i2 = 9;   
int i3 = 9;    
public static final int INT1 = 9;   
public static final int INT2 = 9;   
public static final int INT3 = 9; 

Java中的数据存储(堆、栈、常量池) - ZmeSky -    ZmeSky    的博客
 
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
注意:栈里只有一个9 ,i1,i2,i3 都指向9 。如果 令 i2=7;会在栈里生成7 再令i2 指向7。
如以下代码:
class BirthDate{
        private int day;
        private int month;
        private int year;
        public BirthDate(int d,int m,int y){
            day=d;
    month=m;
  year=y;
        }
}
 
public class Test{
        public void change(int i) {
                i=1234;
        }
        public static void main(String[] args){
                int date=9;
                Test=new Test();
                test.change(date);
                BirthDate d1=new BirthDate(7,7,1970);
        }
}
Java中的数据存储(堆、栈、常量池) - ZmeSky -    ZmeSky    的博客
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:
1. main方法开始执行:int date = 9;
date局部变量,基础类型,引用和值都存在栈中。
2. Test test = new Test();
test为对象引用,存在栈中,对象(new Test())存在堆中。
3. test.change(date);
i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
4. BirthDate d1= new BirthDate(7,7,1970); 
d1为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。
2025年华为杯中国研究生数学建模竞赛E题 高速列车轴承智能故障诊断问题 思路+代码 all_data, file_info = preprocessor.load_mat_files(file_list[:50]) # 加载前50个文件作为示例。[y_source, y_source, domain_labels], # 注意:这里使用伪标签。X_target = np.random.randn(100, X_source.shape[1], 1) # 示例数据。"""构建CNN-Transformer混合模型""""""构建Transformer模型""" 阅读详情

相关推荐

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程

本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。

dog123的博客 261

常量池保存数据的特点

package com.bwf.str; // 常量池保存数据的特点 public class Demo4 { public static void main(String[] args) { // String s1 = "ab"; // String s2 = "ab"; // String s3 = "a" + "b"; // // System.out.print...

儒雅随和丶mata坤的博客 688

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1790

Java中的数据存储(堆、栈、常量池

原文转自http://bbs.itheima.com/thread-9597-1-1.html 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。 2.栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。 3.堆:存放所有new出来的对象。 4.静态域:存放静态成员(sta

qq_33502735的博客 382

Edge浏览器IE模式失效?最新142版本隐藏按钮的3种解决方案

本文针对Edge浏览器142版本中IE模式按钮消失的问题,提供了3种实用解决方案,包括注册表修改、手动添加网站到IE模式列表和企业策略部署方案,帮助用户解决兼容性问题,确保老旧系统正常访问。

weixin_28308325的博客 506

antv x6 沿边图标循环动画实现

2.使用transition给边设置动画,利用complte方法实现循环动画。实现效果,如下图,边上存在两个图标,要求图标延边一直循环动画。1.注册一个自定义边,边上定义两个图标,并设置其初始位置。

lingliu0824的博客 3366

java栈存储_【转载】Java中的数据存储(堆、栈、常量池)

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。2.栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。3.堆:存放所有new出来的对象。4.静态域:存放静态成员(static定义的)。5.常量池:存放字符串常量和基本类型常量(public static final)。6.非RA...

weixin_39638603的博客 149

UniApp 覆盖安装后首次进入 APP pages.json 不生效的解决方案

通过以上步骤,解决了缓存问题导致的首次加载异常。此方案的关键在于强制更新文件名,从根本上避免旧缓存的干扰。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 689

Java中的数据存储(堆、栈、常量池)

原文转自http://bbs.itheima.com/thread-9597-1-1.html 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。 2.栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。 3.堆:存放所有new出来的对象。 4.静态域:存放静态成员(static定...

sunshinezx8023的博客 399

优化YOLOv8检测精度:Damo-YOLO的RepGFPN特征融合技术解析【YOLOv8】

YOLOv8在结构上依旧延续了自YOLOv4以来的CSPNet(Cross Stage Partial Network)和FPN(Feature Pyramid Network)的设计,结合了PANet(Path Aggregation Network)来增强特征的多尺度表达。然而,随着目标检测任务的复杂性增加,如何更有效地融合不同层级的特征成为提升检测性能的关键。Damo-YOLO中的RepGFPN引入了重参数化的思想,通过在训练和推理阶段对特征融合模块进行结构优化,显著提升了检测效果。

博客 1583

【Android逆向工程】第18章:Ollvm 混淆与对抗

本章介绍了Ollvm混淆技术及其对抗方法。Ollvm是基于LLVM的开源代码混淆工具,主要实现控制流平坦化、虚假控制流和指令替换三种混淆技术。控制流平坦化通过状态变量和switch-case结构隐藏真实控制流,将原本清晰的逻辑拆分为多个状态块。混淆后的代码在静态分析中难以理解,但可通过动态追踪执行路径、符号执行等方法来还原原始逻辑。本章还提供了混淆代码示例和对抗策略,帮助理解Ollvm的工作原理及其防御方法。

w987333120的博客 215

[Java]数据存储(栈,堆,常量池)

速度: 寄存器 >堆栈 > 堆 > 其它 寄存器(register) 栈(stack) 堆(heap)

zealfory 539

AI编程工具深度对比:Cursor、Copilot、Trae与Claude Code,2025年开发者该如何选择?

2025年AI编程工具市场已形成四大主力阵营:Cursor(AI原生IDE)、GitHub Copilot(行业标准)、Trae(中国免费方案)和Claude Code(终端交互)。核心差异体现在技术能力(代码生成准确率85%-95%)、智能体协作程度和上下文处理能力(8K-200K tokens)。用户体验方面,Trae对中文支持最佳且免费,Copilot企业集成强,Cursor平衡易用与功能,Claude Code适合高阶开发者。实际测试显示,不同工具在原型开发、算法实现等场景各有优势

fudaihb的博客 6500

Java中的数据存储(堆、栈、常量池),不敢独享

Java中的数据存储(堆、栈、常量池),不敢独享 http://bbs.itheima.com/thread-9597-1-1.html (出处: 黑马程序员IT技术论坛) http://bbs.itheima.com/thread-9597-1-1.html

wyb041011的专栏 623

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【转载】Java中的数据存储(堆、栈、常量池)

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。 2.栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。 3.堆:存放所有new出来的对象。 4.静态域:存放静态成员(static定义的)。 5.常量池:存放字符串常量和基本类型常量(public static final

风吹无迹雨落无痕 523

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java堆、栈、堆栈,常量池的区别总结

java堆、栈、堆栈,常量池的区别1. 前言2. 系统中的堆、栈 和 数据结构堆、栈2.1 数据结构堆、栈2.2 系统方面的堆和栈3. Java里的堆和栈(系统方面的堆和栈)3.1 常见概念3.2 总结4. 申请响应、申请限制4.1 申请响应4.2 申请限制5. 数据存储 转自知乎,原文链接。我对原回答进行了排版整理。 1. 前言 先说一下栈和堆栈,我们听老一辈的程序员一般都会说堆栈,其实栈就是堆...

TingtingYang 1852

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java中堆、栈、常量池等概念解析

2011-11-25 21:25818人阅读评论(2)收藏举报 程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据: (1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪

lstcWinsure的专栏 627

Java中栈、堆和常量池

Java内存分配主要包括以下几个区域: 寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.。 栈 存放基本类型的变量数据和对象的引用(就是一个名字),对象本身不存放在栈中,而是存放在堆或者常量池中。栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。栈区内存由编译器自动分配释放,具体方法...

幽静净土的技术分享 636

java堆、栈、堆栈,常量池总结

Java里的堆、栈和常量池 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。 堆的优势是可以动态地分配内存大小,所有使用new x...

wubingju93123的博客 606

Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)

博客分类: Java综合   一:在JAVA中,有六个不同的地方可以存储数据:   1. 寄存器(register)。 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。     ------最快的存储区, 由编译器根据需求进行分配,我们在程序中

kite30的博客 639

常量池,堆,栈的比较

常量池、栈、堆的比较 JAVA中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区,位于不同于其他存储区的地方——处理器内部。寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。 2. 栈:存放基本类型的变量数据和对象的引用。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移...

amfrlfum565669的博客 138

Java 堆、栈、常量池详解

Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)   博客分类: Java综合   一:在JAVA中,有六个不同的地方可以存储数据:   1. 寄存器(register)。 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。

Skyline 596

Java 内存整理——堆、栈、常量池

文章来源: http://uule.iteye.com/blog/1417299 http://www.docin.com/p-197301718.html http://www.360doc.com/content/10/1214/10/4372345_77945858.shtml http://www.iteye.com/problems/45377 http://zhid...

weixin_30307921的博客 263

Java堆、栈和常量池以及相关String的详细讲解

转自:http://www.cnblogs.com/xiohao/p/4296088.html 博客分类: Java综合   一:在JAVA中,有六个不同的地方可以存储数据:   1. 寄存器(register)。 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存

rim32的博客 515

Java 堆、栈、内存分析

在 JAVA 中,有六个不同的地方可以存储数据:  1. 寄存器( register )。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。  2. 栈( stack )。位于通用 RAM 中,但通过它的“栈指针”可以从处理器获得支持。堆栈指针若向下移动,则分

Skyline 414
上一篇: 使用 Meteor 轻松开发实时网站
下一篇: Java 中的equals 和 ==的区别
努力突破
博客等级 码龄17年 36粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值