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

news2024/12/23 9:55:21

在这里插入图片描述

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

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


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


字符串常量池 (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.coloradmin.cn/o/1350973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【052】基于Springboot、Vuey电影购票管理系统(附完整源码、数据库)

**基于Springboot、Vue、Mysql的电影购票管理系统(附源码、数据库),超级完整的项目,值得下载!! 链接在博客最底下**电影购票管理系统源码及数据库百度云链接: https://pan.baidu.com/s/1loetDV…

Mnist手写体数字数据集介绍与在Pytorch中使用

1.介绍 MNIST(Modified National Institute of Standards and Technology)数据集是一个广泛用于机器学习和计算机视觉研究的常用数据集之一。它由手写数字图像组成,包括0到9的数字,每张图像都是28x28像素的灰度图像,图…

IO模型及高性能网络架构分析

IO调用 操作系统一次IO过程: 应用程序发起的一次IO操作包含两个阶段: IO调用:应用程序进程向操作系统内核发起调用。 IO执行:操作系统内核完成IO操作。 操作系统内核完成IO操作还包括两个过程: 准备数据阶段&#…

2023年终总结---做一个有生活的人

2023总结 【工作】2023一整年都在阿里淘天集团工作。作为工作的第二年,学习到很多知识和设计方法,从而某个中心的左膀右臂。敢在需求评审中说不,说话变的有底气。中间经历了组织架构的一次一次调整,当时面试自己的一个师兄因家庭原…

CSS-4

平面转换 整体认识 div {margin: 100px 0;width: 100px;height: 100px;background-color: pink;/* 过渡效果 */transition: all 1s;}/* 当鼠标悬停到div时,进行平面转换 */div:hover {transform: translate(800px) rotate(360deg) scale(2) skew(180deg);}作用&…

Python爬虫——使用代理IP池维护虚拟用户

目录 前言 一、什么是代理IP池? 二、爬取代理IP 三、验证代理IP的可用性 四、维护代理IP池 五、使用代理IP池进行爬取 六、总结 前言 在进行Web爬取时,使用代理IP是一种常见的策略,它可以帮助我们隐藏真实IP地址,绕过网站…

PyQT 多进程

在PyQt中,图形化界面(GUI)是运行在主线程中的,而多进程是在独立的进程中执行的。默认情况下,多进程之间是无法直接共享图形化界面的。 然而,有几种方法可以在多进程中与PyQt的图形化界面进行通信&#xff…

Wnmp本地部署结合内网穿透实现任意浏览器远程访问本地服务

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1…

Linux驱动开发学习笔记7《并发与竞争》

目录 一、并发与竞争 1、并发与竞争简介 2、保护内容是什么 二、原子操作 1、 原子操作简介 2、原子整形操作API 函数 3、原子位操作API 函数 4、实验 (1) 修改设备树文件 (2) LED 驱动修改 (3)…

2023年度总结———豫见及遇见

目录 一.AI 人工智能方向 二.华为数通网络方向 三.腾讯云AI绘画方向 四.年度心得总结板块 博主C站主页:知孤云出岫_网络,计算机,计算机网络教案-CSDN博客 博主腾讯云主页: 知孤云出岫 - 个人中心 - 腾讯云开发者社区-腾讯云 2023年年度词&#xff1a…

集合高级知识点

集合高级 1. HashSet 底层原理 HashSet 的特点: HashSet 实现了 Set 接口HashSet 底层实质上是 HashMap可以存放 null 值,但是只能有一个 nullHashSet 不保证元素是有序的,取决于 hash 后,再确定索引的结果,即不保证…

Python 从入门到精通之通俗易懂学闭包

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合(List列表、Tuple元组、Dict字典、Set)-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

单片机原理及应用:计数按键控制数码管显示

承接上文&#xff0c;我们来介绍一下按键和数码管的配合工作&#xff0c;由于数码管显示的字符和位数多种多样&#xff0c;无法做到一个字符对应一个按键&#xff0c;所以程序主要记录按键的使用次数来切换数码管的显示。 #include <reg52.h> //包含reg52.h头…

如何使用SeaFile搭建本地私有云盘并结合cpolar实现远程访问

文章目录 1. 前言2. SeaFile云盘设置2.1 SeaFile的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c;…

2024洗地机哪家强?口碑洗地机推荐

现如今&#xff0c;智能家电在人们生活中变得越来越受欢迎&#xff0c;例如智能洗地机的出现&#xff0c;不仅省时省力&#xff0c;还实现了家务清洁的自由。在家庭中&#xff0c;地面清洁一直是一个令人头疼的问题&#xff0c;各种智能家居品牌通过开发各种智能家电产品来解决…

【工具】vscode搜索结果及工程目录的文件夹、文件的排除

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

【模拟电路】NE555-电子琴应用原理

一、声音和频率 二、振荡周期和占空比 三、NE555电子琴案例 四、NE555内部和方波发生器 一、声音和频率 声音和频率的关系确实是密切相关的。 在声学中&#xff0c;声音的频率被定义为声波的震动次数&#xff0c;通常以赫兹&#xff08;Hz&#xff09;为单位。频率越高&#x…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备&#xff0c;发现设备有时加密出来的数据&#xff0c;再解密时与明文对不上&#xff0c;怀疑是通信问题。因此&#xff0c;急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉&#xff0c;所以随便选了个log4cplus软件集成到现有工具…

leetcode2975. 移除栅栏得到的正方形田地的最大面积

题目 有一个大型的 (m - 1) x (n - 1) 矩形田地&#xff0c;其两个对角分别是 (1, 1) 和 (m, n) &#xff0c;田地内部有一些水平栅栏和垂直栅栏&#xff0c;分别由数组 hFences 和 vFences 给出。 水平栅栏为坐标 (hFences[i], 1) 到 (hFences[i], n)&#xff0c;垂直栅栏为…

STM32L4

STM32L4系列超低功耗微控制器 意法半导体通过构建新型芯片架构实现了同类产品中最佳的超低功耗及性能&#xff0c;这得益于应用设计上的高度灵活性。 STM32L4系列可以根据微处理器运行时不同的应用需求来适时调整电压从而实现功耗的动态平衡。 该系列包含不同的产品线&#…