首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

常量池和堆区别_字符串常量还是方法区

博主写博客目的是记录所学到知识并方便自己复习,在记录知识同时获得部分浏览量,得到更多人认可,满足小小成就感,同时写博客途中结交更多志同道合朋友,让自己技术路上并不孤单。...Class文件结构,最头4个字节用于 存储魔数 (Magic Number),用于确定一个文件是否能被JVM接受,再接着4个字节用于 存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量常量常量池主要用于存放两大类常量...如下 2.运行时常量池 2.1运行时常量简介 运行时常量池是方法区部分。...s1.intern()运行时,首先去常量池查找,发现没有该常量,则在常量池中开辟空间存储”11″,返回常量池中值(注意这里也没有使用该返回值),第三行,s2直接指向常量池里边字符串,所以s1和s2...另外美团团队写了一篇关于intern()博客,我觉得很好可以参考一下 深入解析String#intern 4.3字符串常量池里存放是引用还是字面量 我例子3讲了JDK7字符串常量堆上

1.1K30

WinCC VBS 脚本实用技巧问答 (TIA Portal )

1、为什么一个由内部变量 “数值改变” 事件触发脚本不被执行?...项目运行时可能会产生问题。 2、如何在一个脚本访问数组元素?...解决办法 “ 属性>动画>可见性 ” 组态变量,根据变量值控制相关对象显示或隐藏。 9、如何在脚本合并字符串?...这样连接字符串转换之前可以避免运行时出现错误。 10、脚本如何在单独字符串之间插入一个通配符(空格)? 为了两个文本之间插入任意数量空格,可以使用两个引号 " "。...例如 将字符串 "Tag_Text_01", "Tag_Text_02" 和 "Tag_Text_03" 还有空格组合成一个新字符串 "Tag_01" Dim Tag_01, Tag_Text

5.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

【答疑解惑】常量字符串引发“血案”

要正确理解这个问题,需要了解C语言中变量及常量存储位置,这个其实在咱们程序员互动联盟里面以前文章应该也讲到过,一直阅读和关心朋友应该看到过。...上面两部分程序关键main函数定义 char *s1 = “china”, *s2 = “ch”; 和 char s1[] = “china”, s2[] = “ch”; 按第一种方式,s1和s2...本身是一个栈变量,但它们指向字符串都放在代码段,是一个只读内存块,所以这种情况下,要用第二个字符串去逐个替换时,操作系统会检查到目标内存是一个只读属性存储单元,会给程序返回一个异常,于是我们就看到下面这个出错对话框了...但是关键点来了,s1和s2是数组,他们内存空间也是分配在栈,由于这两个变量分配时同时需要用常量初始化,所以变量空间栈中分配好后,编译器会做额外工作,它会自动把那个只读字符串拷贝过来初始化这个栈变量...如果要对以上做更深入理解,你需要知道进程虚拟内存以及物理存储映射相关知识。对于初学者,只要知道C语言中字符常量编译只读区,不能写即可。

71570

Java运行时数据区域

它用于存储下一条所要执行 JVM 指令执行地址。 (2)、为什么需要程序计数器?...每一个方法被调用直至执行完毕过程,就对应着一个栈帧虚拟机栈从入栈到出栈过程。 (2)、为什么需要虚拟机栈?...(3)、永久代到元空间变化 到了JDK 7HotSpot,已经把原本放在永久代字符串常量池、静态变量等移出到堆,而到了JDK 8,终于完全废弃了永久代概念,改用与JRockit、J9一样本地内存实现元空间...JDK1.7时,方法区运行时常量池中字符串常量池从方法区移出到堆,而运行时常量剩余部分还留在方法区,方法区实现方式为永久代。...JDK1.8时,永久代被元空间替代,而此时字符串常量池还留在堆,运行时常量池还留在方法区

31340

深入理解String类

,”abc”被存储常量池中,str1和str2引用都是指向常量池中”abc”。...所以当 str5 最终将是一个存储String对象,而 str1 是存储常量池里面的, 所以不同。 str4 对象不是显式赋值,编译器会在堆重新分配一个区域来存储对象数据。...equalsIgnoreCase() ——忽略大小写情况下判断内容是否相同。 reagionMatches() ——对字符串部分内容是否相同进行比较(详情请参考API)。...总结: String:String类没有用来改变已有字符串某个字符方法,由于不能改变一个java字符串某个单独字符,所以JDK文档称String类对象是不可改变。...常量池 :在编译阶段,堆中分配出来一块存储区域,用于存储 显式 String,float或者integer.例如String str=”abc”; abc这个字符串是显式声明,所以存储常量池。

41720

STM32 内存分配解析及变量存储位置

因此一些嵌入式系统,比如常用 STM32 来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。...Flash 代码和数据是存放在 flash ,下面是将 flash 内部进行细分之后一张图,图中标明了代码段,数据段以及常量 flash 位置。 ?...如上图所示,Flash 又可以细分为这么几个部分,分别是文本段 (Text),其中文本段又包含可执行代码 (Executable Code)和常量 (Literal Value),文本段之后就是只读数据区域... my_function 变量 x 将会被存放到 RAM 堆栈,将 x 赋值为 200 ,200 将被存储到 flash 里 Text 常量区 (Literal Valu) 。...str 是一个 char 型指针变量,它指向字符串第一个字符存放位置,然而对于字符串 string 来讲,它是存放在Text常量,所以指针变量指向这个区域一个地址,但是因为它终归中局部变量

2.9K10

《JavaSE-第二章》之基本数据类型与类型转换

(0)是先在键盘允许录入字符串也就是使用next()方法,然后使用charAt(index)方法可以获取字符串任意一个字符,因为字符串是有长度,我们可以指定index来获取一个字符串第几个字符 比如获取字符串第一个字符...java中一共有8基本数据类型,其中4整型,2浮点型,1用于表示真假boolean,还有一种用于表示Unicode编码字符单元字符类型char....⚫ Java 程序所有字符串文字(例如“abc”)都为此类对象。 特点 ⚫ String其实常被称为不可变字符串类型,它对象创建后不能被更改。...强制类型转换如同将大瓶子水倒入到小瓶子里最终瓶子虽然也装满水了,但是会造成溢出部分水(数据缺失);隐式转换如同小瓶子水倒入到大瓶子里。...结论: 使用 (类型) 方式可以将 double 类型强制转成 int. 强制类型转换可能会导致精度丢失. 如刚才例子, 赋值之后, 10.5 就变成 10 了, 小数点后面的部分被忽略.

16441

浅析C++内存布局

.rodata(只读数据段) rodata段存储常量数据,比如程序定义为const全局变量,#define定义常量,以及诸如“Hello World”字符串常量。...(注意有些立即数与指令编译在一起,是放在text)。 const修饰全局变量常量区。const修饰局部变量只是为了防止修改,没有放入常量区。...编译器会去掉重复字符串常量,程序每个字符串常量只有一份。 有些系统rodata段是多个进程共享,目的是为了提高空间利用率。...vs2017,并不能将常量字符串定义为char *p类型,否则会编译失败; .data data存储已经初始化全局变量,属于静态内存分配。...余下空间被称为堆区(栈与堆之间有部分动态分配姑且称之为共享区,叫法可能不一样)。

1.1K40

【面试题精讲】字节码构成-常量

什么是字节码常量池? Java虚拟机(JVM),每个类都有一个与之对应字节码文件。字节码文件包含了一系列指令,用于执行Java程序。而字节码常量池则是其中一个重要组成部分。...字节码常量池是一个表格结构,用于存储编译器生成各种字面量和符号引用。它可以看作是一张大型符号表,记录了类、接口、方法、字段等相关信息。 2. 为什么需要字节码常量池?...字节码常量池具有以下几个重要作用: 存储字面量:常量池可以存储字符串、整数、浮点数、字符等字面量,这些字面量程序运行过程中会被频繁使用。...字节码常量使用注意事项 避免过多字符串字面量:尽量避免代码中频繁使用大量字符串字面量,以减少常量内存占用。...总结 字节码常量池是Java虚拟机重要组成部分,用于存储字面量和符号引用。它通过索引方式管理常量,并提供了快速访问和解析功能。

18150

探秘Java:一个对象生成(上)

具体有以下三种情况: 直接将字符串常量复制给一个String类型变量。...String text = "hello, world"; 如上代码所示,此时代码hellow,world字符串在编译期就可以被确定,所以该字符串会被存储字符串常量池中,而text变量存储是该字符串常量池中空间地址...String text = new String("hello, world"); 如上代码所示,此时hello, world字符串依然会存储字符串常量池中,但是text变量并不会直接存储字符串常量池中空间地址...,此时text变量存储是通过new关键字创建出来String类型对象内存地址,而这个对象内存储才是实际字符串常量常量池中内存地址。...这里教给大家一个实用小技巧来确定实际代码String类型对象是否存储常量

48250

windows错误恢复如何解决_0xc0000006是什么错误

0xc0000005 三种不同情况下会发生错误 常见原因 修复访问错误 解决方案1:停用程序数据执行保护(DEP) 解决方案2:Windows注册表停用AppInit_DLLs机制 解决方案...切换到“高级”选项卡,然后单击“性能”部分“设置”按钮。 转到“数据执行保护”选项卡,然后选择“对所有程序和服务(选定程序和服务除外)激活数据执行保护”。...解决方案2:Windows注册表停用AppInit_DLLs机制 解决0xc0000005错误一种可能解决方案是停用AppInit_DLLs函数,该函数使您可以在用户模式下执行任何进程中加载​​...使用DLL能够更有效地利用存储空间,这就是为什么受影响程序载入速度更快,占用更少硬盘空间。但是,有时“ AppInit_DLLs”条目可能导致有问题访问冲突。...重新安装受问题影响程序可以快速解决。可以通过这种方式恢复安装或更新过程丢失所有重要程序文件。

4.6K40

为什么要将永久代替换为元空间?

为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? 什么是运行时常量池? 字符串常量池有什么作用? JDK 1.7 为什么要将字符串常量池移动到堆? 下面是正文。...JDK1.7 及之后版本 JVM 已经将运行时常量池从方法区移了出来, Java 堆(Heap)开辟了一块区域存放运行时常量池。...JDK1.7 时候,字符串常量池被从方法区拿到了堆。 这里字符串其实就是我们前面提到字符串字面量。声明一个字符串字面量时,如果字符串常量池中能够找到该字符串字面量,则直接返回该引用。...如果找不到的话,则在常量池中创建该字符串字面量对象并返回其引用。 相关问题:JVM 常量池中存储是对象还是引用呢?...- RednaxelaFX - 知乎 JDK 1.7 为什么要将字符串常量池移动到堆

74820

你说你是高工,String有多长也不知道?

2.1 字面量形式 对于第一种是字面量,Java将其存在常量池中,Java1.6版本常量池中,1.7、1.8版本中将其放到了堆常量池中。...那就是说第一种这种方式是受到常量池大小约束了,不错,是会受到常量约束,但是在运行在JVM之前,被编译成字节码时就已经有了限制。 ?...如上图所示,编译后length类型为u2(无符号16位),也就是讲length最大值为2^16-1 = 65535,那就是讲我们上面的字符串s长度按MUTF-8(字节码编码)编码可以存储65535...可是事实上呢,我们实验后发现只能存储65534个字节,这是为什么呢?网上有很多猜想,大部分不正确。我们扒一下Java编译器源码,会发现: ?...这下大家明白了吧,Java编译器检查字符串常量时,判断是长度只有<65535才会正常,否则报错。看起来像是编译器Bug。

32040

Postgresql 隐式转换 -- 数据库也来一次 “中保研”

作为一个未来更自由和先进数据库,部分(传统)企业会选择一种理想数据库及原型,别的数据库遇到问题,POSTGRESQL 存在吗,那如何注意,实际上隐式转换会给我们使用POSTGRESQL 带来什么影响这是需要了解和清楚...这里要清楚一个概念,就能大概了解到 CHAR VARCHAR 为什么互不给对方面子,CHAR 类型定义大小后,不足位置是要进行空格补齐,而varchar 不会,或许就是双方不给面子一个原因。...到这里先小结一下,POSTGRESQL 数据库和别的数据库字符存储方面还是可圈可点,例如在别的数据库中提出text类型相对于其他类型虽然存储内容要多,但是性能要低情况,POSTGRESQL...但存储数据结构不同)这也就造成很多表设计字符大部分都是text 上面的结果也看到了,这可能就是原因之一。...大多数非数值类型常量首先被归类为字符串。SQL语言定义允许使用字符串指定类型名称,并且PostgreSQL可以使用这种机制来按照正确路径启动解析器。

97220

String性能提升10倍几个方法!(源码+原理分析)

,这样它就更加高效,并且更适合做 HashMap key- value 缓存; 节约内存:String 不可变性是它实现字符串常量基础,字符串常量池指的是字符串创建时,先去“常量池”查找是否有此...当代码中使用第一种方式创建字符串对象时,JVM 首先会检查该对象是否字符串常量池中,如果在,就返回该对象引用,否则新字符串将在常量池中被创建。...String str = new String("Java") 这种方式,首先在编译类文件时,“Java”常量字符串将会放入到常量结构类加载时,“Java”将会在常量池中创建;其次,调用 new...时,JVM 命令将会调用 String 构造函数,同时引用常量池中“Java”字符串堆内存创建一个 String 对象,最后 str 将引用 String 对象。...,它定义是,当调用 intern 方法时,如果字符串常量池中已经包含此字符串,则直接返回此字符串引用,如果不包含此字符串,先将字符串添加到常量池中,再返回此对象引用。

1.1K20

你知道伴随着JDK版本更新:String都有哪些变化么?

JDK 6 及之前版本 JDK 6 ,String 类常量池位于永久代(方法区)。此时,常量存储是对象本身。...JDK 7 JDK 7 引入了一项重要变化,将常量池从永久代移到了堆内存。此时,常量存储是对象引用。...这意味着,字符串字面量和通过 new 创建 String 对象都会在堆内存,而常量池中存储是它们引用。这一变化使得字符串存储和管理更加灵活。...例如, JDK 8 ,通过 new String("text").intern() 创建字符串和直接使用字面量 "text" 创建字符串,可能会指向同一个对象,这在 JDK 7 是不可能。...JDK 9 及之后版本 JDK 9 对 String 类进行了重大底层优化。 JDK 9 ,String 类不再使用 char 数组来存储字符串数据,而是改用 byte 数组。

8700

C++学习总结2——C++内存模型

对于一个C++程序,内存区域分六个部分:依次是rodata区,text区,data区,bss区,heap区和stack区。...其中rodata区和text加载时会合并到一个段,该段称为常量区,该区域内容只允许读,不允许修改; data区和bss区加载时合并到一个段,该段被称为全局区,其中内容,对程序来说,是可读可写...每个区详细说明如下。 rodata rodata是read only data缩写,只读区域,像上面程序pi和常量字符串”count % 10=”和”i=”都保存在该区域。...因为rodata区和text程序运行过程中都是不能修改,所以程序启动时,这两个区域又被放到一个叫做常量箱子,并且箱子外面贴上”不许修改”标签,以防该区域内容被修改。...上面程序全局语句“int j;”和func1语句“static int count;”定义j和count都在bss区。 为什么要区分初始化和未初始呢?是为了节省空间。

51510

多线程,是狐友们意难平,谁能搞定它价值百万。

Christof DLL是迄今为止我发现自己应用程序添加多线程功能最简单方法。”...他答复:这个问题有一个明确答案。这取决于(你认为什么是多线程应用程序)。 从VFP6 ServicePack 3开始,我们就有能力Visual FoxPro创建多线程DLLs。...但这并不意味着我们创建多线程应用程序,我们只是创建多线程DLLs。当你实例化一个位于DLLCOM服务时,Visual FoxPro只能将其加载到与主程序相同线程。...图1: Windows 提供"有用" 停止响应消息 本文介绍了Christof编写一个C++ DLL "辅助工具",他在上面提到解答部分做了进一步详细解释。 01 — 到底什么是多线程?...20秒内,DLL将创建一个SYS(2015)字符串(每秒一次),并告诉_VFP将该字符串写出到VFP主窗口。

72810

这次让我们从字节码文件来重新认识String,文末有两个小小面试题,一起来试一试

(“hello”); 采取new 对象方式,会存储 String 声明是final类型,不可继承。...译为: String类的当前实现将字符存储字符数组,每个字符使用两个字节(16位)。从许多不同应用程序收集数据表明,字符串是堆使用主要组成部分,而且,大多数字符串对象只包含拉丁字符1。...它主要使用方法有两种 直接使用双引号声明出来String对象会直接存储常量池中。...(String[] args) { //常量常量拼接结果在常量池,原理是编译期优化 String str1="hello"; // 此处肯定是存储字符串常量池中。...”ab“,我们使用它时候,会先去字符串常量池中寻找,发现没有,即在字符串常量池中创建。即第二个对象。 第三步就是 将堆String地址存储到局部变量ab。 结论:所以答案是两个对象。

29830
领券