堆栈常量池

2023-11-18

堆栈常量池详解+例子

转自:http://www.iteye.com/topic/634530

一:概述

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

  2. 栈(stack):存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。

  3. 堆(heap):存放所有new出来的对象。

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

  5. 常量池:存放字符串常量(String)和基本类型常量(public static final)

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

存放基本数据类型变量数据和对象的 “引用”,对象本身不存在这个里面。

常量池:

像int i=1中的1就不放在常量池中,因为这个1不是常量属于变量。

像public static final int i=1中的1就放在这个常量池中。

二:初步理解(可以先看最下面的几个性质)

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

自己先别看图,想一下,图像是什么。

栈中有几个对象

堆中有几个对象

常量池中有几个对象

特别的还要注意有几个箭头!

img

栈:所有数据和对象的引用都放在栈中,所以六个String产生六个名字在栈中。

堆:只要是new出来的都在栈中存储,前三个没有new只有后面三个在堆中存在

常量池:所有的字符串类型和基本数据类型都在这个里面存着,并且相同的不会重复存储。

String ss1 = new String(“china”); 整体介绍

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

int 类型
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;  

img

对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。

##### 隆重介绍–引用类型######
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;  
    }  
    省略get,set方法………  
}  
  
public class Test{  
    public static void main(String args[]){  
        int date = 9;  
        Test test = new Test();        
           test.change(date);   
        BirthDate d1= new BirthDate(7,7,1970);         
    }    
  
    public void change1(int i){  
        i = 1234;  
    }  

}

对于以上这段代码,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()将等待垃圾回收.

img

三:性质介绍

堆和栈的性质
  • 栈:

    • 由编译器自动分配释放 ,存放函数的参数值,局部变量的值
    • 优点是存取速度很快,仅次于CPU中的寄存器
    • 缺点是存在栈中的数据大小与生存期必须是确定的、
    • 栈中的数据可以共享(见下面详细介绍)
  • 堆:

    • Java的垃圾回收器自动收走这些不再使用的数据
    • 优点是动态的分配内存大小(因为是存储new 出来的数据的)
    • 缺点是运行时需要动态分配内存,所以存取速度慢
栈的共享性

存在栈中的数据可以共享

int a = 3;
int b = 3;
  • 编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

  • 接下来的话,再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

上面这个例子很容易与引用类型的混淆:

假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另 一个对象引用变量也即刻反映出这个变化。

成员变量和局部变量

img

记住一点:栈里面是用完就删!而堆是全局的!

  • 上面的局部变量放在栈中
  • 成员变量中的实例变量放在堆中

类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另 一个对象引用变量也即刻反映出这个变化。

成员变量和局部变量

[外链图片转存中…(img-JtiCFBij-1640593655375)]

记住一点:栈里面是用完就删!而堆是全局的!

  • 上面的局部变量放在栈中
  • 成员变量中的实例变量放在堆中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆栈常量池 的相关文章

  • 基于VS调试分析 + 堆栈观察问题代码段

    文章目录 问题代码段1 阶乘之和 问题代码段2 越界的危害 发现问题 分析问题 思考问题 堆栈原理 解决问题 DeBug与Release 程序员与测试人员 总结与提炼 问题代码段1 阶乘之和 先来看一道C语言中比较基础的题目 求解阶乘的和
  • 静态代理

    一 静态代理概念 代理模式 目标对象类型的变量指向代理对象 然后调用方法的时候会执行代理对象的方法 代理对象的方法里面重写或者调用了目标对象的方法 并且在方法执行前后添加了一些功能 静态代理 写好对应的代理类源文件 在编译期就已经确定了目标
  • 栈破坏的分析

    在程序运行中 栈主要用来保存局部变量 函数参数 函数调用的返回地址以及栈底 以x86为例 与栈关系比较大的几个寄存器主要是 ebp 基址指针寄存器 extended base pointer 其内存放着一个指针 该指针永远指向系统栈最上面一
  • 32位下printf的坑(输出错误的值)

    记一次使用printf的坑 printf输出错误 32位编译 include
  • java中常见的异常及处理方法

    1 java lang nullpointerexception 这个异常大家肯定都经常遇到 异常的解释是 程序遇上了空指针 简单地说就是调用了未经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中 比如图片未经
  • C++中的栈和堆

    由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 又编译器自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构的栈 2 堆区 heap 一般是由程序员分配释放 若程序员不释放的话 程序结束时可能由OS
  • 二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。

    二货小易有一个W H的网格盒子 网格的行编号为 0到H 1 网格的列编号为 0到W 1 每个格子至多可以放一块蛋糕 任意两块蛋糕的欧几里得距离不能等于2 对于两个格子坐标 x1 y1 x2 y2 的欧几里得距离为 x1 x2 x1 x2 y
  • 嵌入式开发之堆栈调试打印

    简介 打印堆栈的常用方法包括 glibc中的backtrace函数 gcc内置函数 builtin return address 第三方库libunwind 1 glibc中的backtrace 1 1函数原型 include
  • python实现堆栈和队列

    1 python实现堆栈 可先将Stack类写入文件stack py 在其它程序文件中使用from stack import Stack 然后就可以使用堆栈了 stack py的程序如下 class Stack def init self
  • 数组的push()、pop()、shift()和unshift()方法

    JavaScript的数组是一个拥有堆栈和队列自身优点的global对象 也就是说JavaScript数组可以表现的像栈 LIFO 和队列 FIFO 一样操作 这也是JavaScript数组强大的可操作性的体现 堆栈和队列 栈和队列都是动态
  • VS2010调试-显示堆栈窗口

    以中断模式或运行模式显示 调用堆栈 窗口 在 调试 菜单中选择 窗口 然后单击 调用堆栈 或者 ALT 7 更改显示的可选信息 右击 调用堆栈 窗口 然后设置或清除 显示 lt 所需信息 gt 在 调用堆栈 窗口中显示非用户代码帧 右击 调
  • 3分钟弄清楚javascript的堆栈原理

    首先了解一下Javascript的堆栈概念 堆 栈 两者都是存放临时数据的地方 栈 stack 栈的特点是 LIFO 即后进先出 Last in first out 数据存储时只能从顶部逐个存入 取出时也需从顶部逐个取出 比如一个乒乓球的盒
  • CocosCreator JS追踪堆栈信息

    在开发过程中 可能有这样的需求 即使在没有报错的情况 也需要查看该函数的堆栈调用信息 对于这样的需求 我们可以使用JS原生的console trace来实现 具体代码 export let TraceArr console trace fu
  • 静态储存,堆,栈的理解

    数据结构中的堆与栈 栈 可以理解为为一个瓶子 他遵循着先进后出的原则 堆 是一种经过排序的树状结构 每一个节点都有一个值 我们通常说的堆是二叉堆 堆的特点是跟节点最大或者最小 且子节点也是一个堆 所以我们在使用的堆的时候 都是随便取一个节点
  • C++栈区、堆区、全局静态区、代码区的介绍

    示例代码 include
  • 【C++编程基础】AOJ (C++ Programming II)—2-A-stack

    2 A stack 题目 stack Stack is a container of elements that are inserted and deleted according to LIFO Last In First Out Fo
  • JVM内存模型图解(包含堆栈方法区例子和图解)

    下图是完整的虚拟机模型 我们主要是了解三个 1 堆区 heap 存储的全部是对象 每个对象都包含一个与之对应的class的信息 jvm只有一个堆区 heap 被所有线程共享 堆中不存放基本类型和对象引用 只存放对象本身 2 栈区 stack
  • 堆栈常量池

    堆栈常量池详解 例子 转自 http www iteye com topic 634530 一 概述 寄存器 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 栈 stack 存放基本类型的变量数据和对象的引用 但对象本身不存放
  • 设计一个算法判断表达式中的括号是否匹配

    一 问题描述 设计一个算法判断表达式中的括号是否匹配 二 问题解答 解析 这里需要用到STL在算法设计中的应用 STL在算法设计中的应用有如下几种 存放主数据 存放临时数据 检测数据元素的唯一性 数据的排序 优先队列作为堆 因此这里需要用上
  • 【数据结构】详解栈的应用之表达式求值

    首先明白 前缀表达式 符号在前 如 3456 中缀表达式 符号在中间 如 3 4 5 6 后缀表达式 符号在最后 如34 5 6 后缀表达式不出现括号 中缀表达式转后缀表达式的方法 1 遇到数字 直接输出 添加到后缀表达式中 2 栈为空时

随机推荐

  • 6.1 PyTorch简单二分类模型

    欢迎订阅本专栏 PyTorch深度学习实践 订阅地址 https blog csdn net sinat 33761963 category 9720080 html 第二章 认识Tensor的类型 创建 存储 api等 打好Tensor的
  • 从源码的角度回答“mybatis的#{} 和${}有什么区别”?

    java程序员面试的时候 碰上面试官问 mybatis 的 和 有什么区别 大概率你会这样回答 1 是预编译处理 是字符串替换 2 MyBatis在处理 时 会将sql中的 替换为 号 调用PreparedStatement的set方法来赋
  • 2min搞定 mac pycharm新建&导入python项目

    mac pycharm新建和导入python项目 虚拟环境配置 下载类库 一 通用设置 step1 通过自定义配置 指定默认虚拟环境变量 step2 设置虚拟环境和指定默认工作空间 step3 导入或者新建python项目 二 pychar
  • 杰里之蓝牙耳机距离及 天线匹配 调试方法篇

    一 t PCB layout 注意事项 1 1 保证 信号完整性 芯片 VMCU VDDIO BTAVDD RTCVDD 退偶电容地线回路要尽量短 SW BTAVDD 回路尽量短 地线完整 电 源线要尽量粗 一般 0 3MM 以上 请参考例
  • R语言与机器学习中的回归方法学习笔记

    来源 http blog sina com cn s blog 62b37bfe0101hom5 html key word lars rpart randomForest cp svm data diabetes prune boosti
  • BES系列蓝牙开发总结

    博文索引 框架 BES2300X BES2500X 框架解析 一 UI及外围功能模块 BES2300X BES2500X UI 按键 提示音 指示灯 BES2300X BES2500X UI 电池管理模块 蓝牙操作及协议连接 数据流及数据编
  • 使用jq实现手机上的touchmove效果

    Touch事件简介 pc上的web页面鼠 标会产生onmousedown onmouseup onmouseout onmouseover onmousemove的事件 但是在移动终端如 iphone ipod Touch ipad上的we
  • python pycharts模块词云

    from pyecharts import WordCloud import pandas as pd 读取文件 data pd read csv word csv names word count sep data data groupb
  • Java连接Mysql数据库详细代码

    数据库连接类 package util import java sql TODO author date 2020 12 10 9 07 public class DBUtil private final static String DRI
  • n个学生围成圈,报到3的学生被淘汰,最后剩下的学生编号是几号?

    include
  • Python的数据类型——字典(dict)

    目录 1 Python的数据类型 2 什么是字典 3 字典存储的数据 4 字典的语法 5 新建字典 1 用 新建一个空字典 2 新建一个存储城
  • list转json字符串

    使用Gson把list转成json字符串 com google gson Gson GetMapping valueTest public String valueTest List
  • 2021-08-03PHP面试笔试题记录

    1 一张表中有id pid name三个字段 用来表示无限级联动 pid表示父级id 如无父级 则pid为0 现已将表中数据全部查出 请封装函数 实现将该数据转换成树状结构 原始数据 menu datas id gt 1 pid gt 0
  • RGB三原色的简单理解

    RGB是什么 RGB是一种颜色表示系统 它由国际照明委员会 EIC 定义 选择红色 波长 700 00nm 绿色 波长 546 1nm 蓝色 波长 438 8nm 三种单色光作为表色系统的三基色 其中R red G Green B Blue
  • SpringSecurity学习笔记(七)密码加密

    参考视频 编程不良人 为什么要进行密码加密 如果密码直接存储到数据库不进行加密 一旦被黑客攻破就会导致用户的密码泄露 而且一般用户的密码是多个网站或者app用的同一个 这就导致了很大的安全隐患 所以一般数据库都不会直接存储用户的明文密码 都
  • java类型转换小细节之BigDecimal转String

    public static void main String args 浮点数的打印 System out println new BigDecimal 10000000000 toString 普通的数字字符串 System out pr
  • linux配置虚拟IP地址方法

    linux配置虚拟IP地址方法 在日常linux管理工作中 需要为应用配置单独的IP地址 以达到主机与应用的分离 在应用切换与迁移过程中可以做到动态切换 特别是在使用HA的时候 这种方案可以保证主机与应用的隔离 对日常的运维有很大的益处 但
  • DDL与DML的区别

    DML Data Manipulation Language 数据操纵语言 适用范围 对数据库中的数据进行一些简单操作 如insert delete update select等 DDL Data Definition Language 数
  • 如何排查 Electron V8 引发的内存 OOM 问题

    经过长达大半年时间的崩溃治理后 基于 Electron 框架开发的新版 PC 淘宝直播推流客户端的稳定性终于赶超基于QT 框架开发的旧版本了 剩下的崩溃问题中有 40 是跟内存 OOM 有关 其中 V8FatalErrorCallback
  • 堆栈常量池

    堆栈常量池详解 例子 转自 http www iteye com topic 634530 一 概述 寄存器 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 栈 stack 存放基本类型的变量数据和对象的引用 但对象本身不存放