【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实
例的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言——操作符

一、算数操作符 1、(加操作符) 用于将两个数相加,例:3 3结果为6 2、-(减操作符) 用于将两个数相减,例:3 - 3结果为0 3、*(乘操作符) 用于将两个数相乘,例:3 * 3结果为9 4、/(除操作符) 用于将两个…

HashMap使用-LeetCode做题总结 454. 四数相加 II

454. 四数相加 II 最初思路优化思路Java语法增强for的使用场景 最初思路 枚举,因为是要计算有多少个元组,所以每个元素肯定都要遍历到,所以干脆算出所有元组的和。 我想用四个for循环加,但是失败。 优化思路 参考力扣 四数相加为…

创建VLAN及VLAN间通信

任务1、任务2、任务3实验背景: 在一家微型企业中,企业的办公区域分为两个房间,一个小房间为老板办公室,一个大房间为开放办公室,财务部和销售部的员工共同使用这个办公空间。我们需要通过VLAN的划分,使老板…

聊聊我使用亚马逊鲲鹏系统注册买家号的心得

想和大家聊一下我最近用了个挺好用的工具,就是亚马逊鲲鹏系统。以前我总是烦恼要一个一个手动注册亚马逊账号,真是麻烦。但有了这个系统,简直是方便到不行! 首先,它有个全自动批量注册账号的功能,你只需要提…

Python爬取今日头条热门文章

前言 今日头条文章收益是没有任何门槛,只要是你发布文章,每篇文章的阅读量超过1000就能有收益,阅读量越多收益越高。于是乎我就有了个大胆的想法。何不利用Python爬虫,爬取热门文章,然后完成自动化发布文章呢&#xf…

77 Python开发-批量FofaSRC提取POC验证

目录 本课知识点:学习目的:演示案例:Python开发-某漏洞POC验证批量脚本Python开发-Fofa搜索结果提取采集脚本Python开发-教育SRC报告平台信息提取脚本 涉及资源: 本课知识点: Request爬虫技术,lxml数据提取(把一些可以用的或者有价值的数据进行提取和保…

十二星座、社交做人守信用程度指数。

双子座(95% );天蝎座(92% );处女座(90% ) 金牛座(85% );狮子座(85% &#…

07. HTTP接口请求重试怎么处理?

目录 1、前言 2、实现方式 2.1、循环重试 2.2、递归重试 2.3、Spring Retry 2.4、Resilience4j 2.5、http请求网络工具内置重试方式 2.6、自定义重试工具 2.7、并发框架异步重试 2.8、消息队列 3、小结 1、前言 HTTP接口请求重试是指在请求失败时,再次发…

[python]matplotlib

整体图示 .ipynb 转换md时候图片不能通知携带&#xff0c;所有图片失效&#xff0c;不过直接运行代码可以执行 figure figure,axes与axis import matplotlib.pyplot as plt figplt.figure() fig2plt.subplots() fig3,axsplt.subplots(2,2) plt.show()<Figure size 640x480 …

C++模板进阶操作 ---非类型模板参数、模板的特化以及模板的分离编译

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

计算机网络复习1

概论 文章目录 概论计算机网络的组成功能分类性能指标&#xff08;搞清楚每个时延的具体定义&#xff09;分层结构协议、接口和服务服务的分类ISO/OSITCP/IP两者的不同 计算机网络的组成 组成部分&#xff1a;硬件&#xff0c;软件和协议&#xff08;协议&#xff1a;传输数据…

C++ stack使用、模拟实现、OJ题

目录 一、介绍 二、常用函数 三、模拟实现 四、OJ练习题 1、最小栈 2、栈的压入、弹出序列 3、逆波兰表达式(后缀转中缀) 4、中缀转后缀思路 5、用栈实现队列 一、介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除…

二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】

目录 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 方法二&#xff1a;传址调用记录节点个数 二、二叉树的最大深度 三、平衡二叉树 四、二叉树遍历 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 计算树的节点数: 函数TreeSize用于…

[情商-5]:用IT直男擅长的流程图阐述高情商聊天过程与直男聊天过程

目录 一、目标与主要思想的差别 二、高情商聊天与直男聊天的流程图 1. 发起谈话主题Topic 2. 分析谈话的主题和内容 3. 确定谈话目的&#xff1a;解决问题还是情绪交流 4. 倾听&#xff1a;站在自己的角度倾听、捕获、理解对方的情绪状态与情绪诉求 5. 同理心&#xff1…

探索 CodeWave低代码技术的魅力与应用

目录 前言1 低代码平台2 CodeWave简介3 CodeWave 的独特之处3.1 高保真还原交互视觉需求3.2 擅长复杂应用开发3.3 支持应用导出&独立部署3.4 金融级安全要求3.5 可集成性高3.6 可拓展性强 4 平台架构和核心功能4.1 数据模型设计4.2 页面设计4.3 逻辑设计4.4 流程设计4.5 接…

milvus学习(一)cosin距离和欧式距离

参考&#xff1a;https://blog.csdn.net/qq_36560894/article/details/115408613 归一化以后的cosin距离和欧式距离可以相互转化&#xff0c;未归一化的不可以相互转化&#xff08;因为距离带单位&#xff09;。

IO DAY2

#include<my_head.h> //定义注册函数*************************************************** int do_register() { //以追加的形式打开文件 FILE *wfp 0; char name[20]; char pwd[20]; printf("请输入注册账号&#xff1a;"); fgets(…

VMware15安装Linux,CentOS-7x86_64

最近面试遇到很多Linux&#xff0c;咱就是实在糊弄不过去了&#xff0c;学一下吧 下载网站&#xff0c;官网&#xff1a;https://www.centos.org/download/ 第一步&#xff1a;点击x86_64 第二步&#xff1a;随便选个国内源&#xff0c;我选的清华 第三步&#xff1a;等待下…

【LeetCode每日一题】466. 统计重复个数

2024-1-2 文章目录 [466. 统计重复个数](https://leetcode.cn/problems/count-the-repetitions/)思路&#xff1a; 466. 统计重复个数 思路&#xff1a; ​ s1表示要重复的序列。n1表示要重复s1的次数。 ​ s2表示要判断的子序列。n2表示子序列s2在整个序列中重复的次数。返回…

基于微信小程序的停车预约系统设计与实现

基于微信小程序的停车预约系统设计与实现 项目概述 本项目旨在结合微信小程序、后台Spring Boot和MySQL数据库&#xff0c;打造一套高效便捷的停车预约系统。用户通过微信小程序进行注册、登录、预约停车位等操作&#xff0c;而管理员和超级管理员则可通过后台管理系统对停车…