【Java进阶篇】字符串常量、字符串常量池详解

在这里插入图片描述

字符串常量、字符串常量池详解

  • ✔️字符串常量池是如何实现的?
    • ✔️字符串常量从哪来的?
  • ✔️字符串常量是什么时候进入到字符串常量池的?


✔️字符串常量池是如何实现的?


字符串常量池 (String Constant Pool) 是Java中一块特殊的内存区域,用于存储字符串常量。


当程序中出现字符串常量时,Java编译器会将其放入字符串常量池中。字符串常量是不可变的,因此可以共享。如果字符串常量池中已存在相同内容的字符串,编译器会直接引用已存在的字符串常量而不会创建新的对象。


在HotSpot虚拟机中:


在JDK 1.6及之前的版本,字符串常量池通常被实现为方法区的一部分,即永久代(PermanentGeneration),用于存储类信息、常量池、静态变量、即时编译器编译后的代码等数据。


从JDK 1.7开始,字符串常量池的实现方式发生了重大改变。字符串常量池不再位于永久代,而是直接存放在堆 (Heap) 中,与其他对象共享堆内存。


之所以要挪到堆内存中,主要原因是因为永久代的 GC 回收效率太低,只有在FullGC的时候才会被执行回收。但是Java中往往会有很多字符串也是朝生夕死的,将字符串常量池放到堆中,能够更高效及时地回收字符串内存。


✔️字符串常量从哪来的?


字符串常量池中的常量有以下几个来源:


1、字面量常量


在代码中直接使用双引号括起来的字符串字面值(如 String s =“Java”)会被认为是常量并且会在编译后进入class文件的常量池,并且在运行阶段,进入字符串常量池。这是最常见的字符串常量来源。


2、intern() 方法


String类提供了一个intern()方法,用于将字符串对象手动添加到字符串常量池中。调用intern()方法时,如果字符串常量池中已经存在相同内容的字符串,将会返回常量池中的引用;如果不存在,则会在常量池中创建新的字符串。


✔️字符串常量是什么时候进入到字符串常量池的?


字符串常量池中的常量有两种来源,一种是字面量会在编译期先进入到Class常量池,然后再在运行期进去到字符串池,还有一种就是在运行期通过intern将字符串对象手动添加到字符串常量池中。


💡那么,Class常量池中的常量,是在什么时候被放进到字符串池的呢?


Java 的类加载过程要经历加载 (Loading) 、链接(Linking) 、初始化(Initializing)等几个步骤,在链接这个步骤,又分为验证(Verification) 、准备(Preparation) 以及解析(Resolution)等几个步骤。


在Java 虚拟机规范及 Java语言规范中都提到过:


《The Java Virtual Machine Specification》 5.4 Linking:






For example, a Java Virtual Machine implementation may choose to resolve each symbolic reference ina class or interface individually when it is used (“lazy” or “late” resolution), or to resolve them all atonce when the class is being verified (“eager” or “static” resolution)






《The Java Language Specification》 12.3 Linking of Classes and Interfaces






For example, an implementation may choose to resolve each symbolic reference in a class or interfaceindividually, only when it is used (lazy or late resolution), or to resolve them all at once while the classis being verified (static resolution). This means that the resolution process may continue. in someimplementations, after a class or interface has been initialized.


大致意思差不多,就是说,Java 虚拟机的实现可以选择只有在用到类或者接口中的符号引用时才去逐一解析他(延迟解析),或者在验证类的时候就解析每个引用(预先解析)。这意味着在一些虚拟机实现中,把常量放到常量池的步骤可能是延迟处理的。


对于 HotSpot 虚拟机来说,字符串字面量,和其他基本类型的常量不同,并不会在类加载中的解析阶段填充并驻留在字符串常量池中,而是以特殊的形式存储在运行时常量池中。只有当这个字符串字面量被调用时,才会对其进行解析,开始为他在字符串常量池中创建对应的 String 实例


通过查看 HotSpotJDK 1.8 的ldc 指的源代码,也可以验证上面的说法。


ldc 指令表示intfloatString型常量从常量池推送至栈顶


在这里插入图片描述

所以,字符串常量,是在第一次被调用(准确的说是ldc指令)的时候,进行解析并在字符串池中创建对应的String实
例的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/316953.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KBDSL1.DLL文件丢失,软件或游戏无法启动,快速修复方法

在Windows操作系统中,KBDSL1.DLL是一个动态链接库文件,由Microsoft Corporation提供。通常包含多个函数和程序,可以被多个应用程序共享,以执行一些特定的任务或功能。 如果KBDSL1.DLL文件丢失或损坏,可能会在启动计算机…

代码随想录算法训练DAY18|二叉树5

算法训练DAY18|二叉树5 513.找树左下角的值 力扣题目链接 给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: 示例 2: 思路 本题要找出树的最后一行的最左边的值。此时大家应该想起用层序遍历是非常简单的了,反而用递归的话会比较难一点。 我…

Windows—常用DOS命令

解释:DOS命令即面向磁盘的操作命令 进入DOS页面:快捷键“winR”,输入cmd help命令 help 【命令名】可查看其他命令的解释,直接输入help也可以查看部分命令 另外,如果输入help显示help不是内部或外部命令,…

微信小程序封装vant 下拉框select 多选组件

老规矩先上效果图&#xff1a; 本组件主要由小程序vant ui组件&#xff0c;vant 小程序ui网址&#xff1a;vant-weapp 主要代码如下: 先封装子组件&#xff1a; select-checkbox 放在 components 文件夹里面 select-checkbox.wxml: <view><van-field label"{…

vercel部署Gemini pro

一、注册一个vercel账号&#xff08;这个东西类似于第三方的github pages&#xff0c;能部署github中的项目&#xff09; 二、注册结束后&#xff0c;填写github的账号&#xff08;需要事先在该github账号中fork一个gemini的repository&#xff09; 三、babaohuang/GeminiPro…

MT3608L 2.5A 高效的1.2MHz电流模式 低成本升压转换IC 航天民芯

描述 MT3608L是一个恒定的频率&#xff0c;6引脚SOT23电流模式升压转换器&#xff0c;旨在用于小型、低功耗的应用。MT3608L的开关频率为1.2MHz&#xff0c;并允许使用2mm或更低高度的微小、低成本的电容器和电感器。内部软启动导致注入电流小&#xff0c;延长电池寿命。MT3608…

unity C# 中通俗易懂LINQ使用案例

文章目录 1. 从数组或列表中查询元素**&#xff1a;2. **排序与分组**&#xff1a;3. **连接多个数据源**&#xff1a;4. **聚合操作**&#xff1a;5. **分页查询**&#xff1a;6. **多条件查询**&#xff1a;7. **转换和投影&#xff08;Select&#xff09;**&#xff1a;8. *…

众和策略股市行情分析:股票分红是按持股比例来分的吗?

股票分红立足于同股同利的准则&#xff0c;按股东的持股比例来进行股利的派发分红。持股多的股东按比例所得的分红就多&#xff0c;持股少的股东按比例所得的分红就少。 另外&#xff0c;分红详细是指的股票发行公司分配股利的行为。股利包含股息和盈利&#xff0c;股息是指的…

CCF模拟题 202312-1 仓库规划

问题描述 试题编号&#xff1a; 202312-1 试题名称&#xff1a; 仓库规划 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 输入格式 输出格式 样例输入 4 2 0 0 -1 -1 1 2 0 -1样例输出 3 1 0 3样例解释

性能优化-OpenMP基础教程(二)

本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &…

云原生学习系列之基础环境准备(虚拟机搭建)

最近由于工作需要开始学习云原生相关内容&#xff0c;为方便学习操作&#xff0c;准备在外网搭建自己的环境&#xff0c;然后进行相关的练习&#xff0c;搭建环境的第一步便是虚拟机的安装。 基础软件 这里我用到的是CentOS-7-x86_64的操作系统。 链接&#xff1a;https://pa…