当前位置: 首页 > news >正文

【jvm】字符串常量池问题

目录

        • 一、基本概念
          • 1.1 说明
          • 1.2 特点
        • 二、存放位置
          • 2.1 JDK1.6及以前
          • 2.2 JDK1.7
          • 2.3 JDK1.8及以后
        • 三、工作原理
          • 3.1 创建字符串常量
          • 3.2 使用new关键字创建字符串
        • 四、intern()方法
          • 4.1 作用
        • 五、优点
        • 六、字节码分析
          • 6.1 示例1
            • 6.1.1 代码示例
            • 6.1.2 字节码
            • 6.1.3 解析
          • 6.2 示例2
            • 6.2.1 代码示例
            • 6.2.2 分析(jdk8)
          • 6.3 示例3
            • 6.3.1 代码示例
            • 6.2.2 分析(jdk8)

一、基本概念
1.1 说明
  • 1.JVM字符串常量池是Java虚拟机(JVM)中一个特殊的内存区域。
  • 2.JVM字符串常量池用于存储字符串常量。
  • 3.提高性能和减少内存开销。
  • 4.字符串常量池是JVM用于存储字符串常量的一个内存区域,避免了相同字符串的重复创建,节省内存空间。
1.2 特点
  • 1.字符串常量池中的字符串对象是不可变的。
  • 2.相同的字符串常量在池中只存储一份,通过引用共享。
二、存放位置
2.1 JDK1.6及以前
  • 1.字符串常量池存放在永久代中,永久代是非堆内存的一部分,用于存储类的元数据、常量、静态变量等。
2.2 JDK1.7
  • 1.字符串常量池从永久代移动到了Java堆中,而运行时常量池保留在永久代中。
  • 2.这一变化为了适应永久代内存限制问题,并提升性能。
2.3 JDK1.8及以后
  • 1.永久代被移除,取而代之的是元空间,字符串常量池仍然位于Java堆中。
  • 2.运行时常量池被移动到元空间。
三、工作原理
3.1 创建字符串常量
  • 1.使用双引号创建字符串时(String a = “123”; ),JVM会首先在字符串常量池中查找是否已存在该字符串。
  • 2.如果存在,则直接返回池中该字符串的引用。
  • 3.如果不存在,则在常量池中创建该字符串的实例,并返回其引用。
3.2 使用new关键字创建字符串
  • 1.使用new关键字创建字符串对象(如String str = new String(“abc”);)时,JVM会在堆内存中创建一个新的字符串对象,而不管字符串常量池中是否已存在相同的字符串。
  • 2.如果需要,可以通过调用intern()方法将新创建的字符串对象放入常量池中。
四、intern()方法
4.1 作用
  • 1.intern()方法是String类的一个本地方法。
  • 2.用于将字符串对象添加到字符串常量池中。
  • 3.如果常量池中已经包含了一个等于此String对象的字符串(使用equals(Object)方法确定),则返回代表池中这个字符串的String对象的引用。
  • 4.否则,将此String对象包含的字符串添加到常量池中,并返回此String对象的引用。
五、优点
  • 1.节省内存:通过共享相同的字符串常量,避免了不必要的重复创建。
  • 2.提高性能:减少了对象创建和垃圾回收的开销。
  • 3.简化字符串比较:由于字符串常量池中的字符串是唯一的,可以使用==操作符来比较字符串的引用,从而简化比较操作。
六、字节码分析
6.1 示例1
6.1.1 代码示例
@Test
public void test(){String str1 = new String("hello") + new String("world");String str2 = "helloworld";System.out.println(str1 == str2);
}
6.1.2 字节码
 0 new #2 <java/lang/StringBuilder>3 dup4 invokespecial #3 <java/lang/StringBuilder.<init> : ()V>7 new #4 <java/lang/String>
10 dup
11 ldc #5 <hello>
13 invokespecial #6 <java/lang/String.<init> : (Ljava/lang/String;)V>
16 invokevirtual #7 <java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder;>
19 new #4 <java/lang/String>
22 dup
23 ldc #8 <world>
25 invokespecial #6 <java/lang/String.<init> : (Ljava/lang/String;)V>
28 invokevirtual #7 <java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder;>
31 invokevirtual #9 <java/lang/StringBuilder.toString : ()Ljava/lang/String;>
34 astore_1
35 ldc #10 <helloworld>
37 astore_2
38 getstatic #11 <java/lang/System.out : Ljava/io/PrintStream;>
41 aload_1
42 aload_2
43 if_acmpne 50 (+7)
46 iconst_1
47 goto 51 (+4)
50 iconst_0
51 invokevirtual #12 <java/io/PrintStream.println : (Z)V>
54 return
6.1.3 解析
  • 1. 0 new #2 <java/lang/StringBuilder>: 调用StringBuilder的new方法
  • 2. 3 dup:复制操作数栈栈顶的一个字(通常是对象引用或数据类型值),并将这个字重新压入栈顶。
  • 3. 4 invokespecial #3 <java/lang/StringBuilder. : ()V>:执行StringBuilder的初始化方法,会消耗操作数栈顶一个字。
  • 4. 7 new #4 <java/lang/String>:new一个String对象,对象的引用压入操作数栈。
  • 5. 10 dup:复制操作数栈栈顶的一个字(通常是对象引用或数据类型值),并将这个字重新压入栈顶。
  • 6. 11 ldc #5 :加载栈顶的一个字,即hello。
  • 7. 13 invokespecial #6 <java/lang/String. : (Ljava/lang/String;)V>:初始化String,消耗一个string对象的引用和复制的字。
  • 8. 16 invokevirtual #7 <java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder;> : append操作,将hello追加进来。
  • 9. 19 new #4 <java/lang/String> : new一个String对象,对象的引用压入操作数栈。
  • 10. 22 dup:复制操作数栈栈顶的一个字(通常是对象引用或数据类型值),并将这个字重新压入栈顶。
  • 11. 23 ldc #8 : 加载栈顶的一个字,即world。
  • 12. 25 invokespecial #6 <java/lang/String. : (Ljava/lang/String;)V>:初始化String,消耗一个string对象的引用和复制的字。
  • 13. 28 invokevirtual #7 <java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder;>: append操作,将world追加进来。
  • 14. 31 invokevirtual #9 <java/lang/StringBuilder.toString : ()Ljava/lang/String;> :调用StringBuilder的toString方法
  • 15. StringBuilder的toString方法中是直接new了一个String对象。
  • 16. 而String str2 = “helloworld”;是常量池的引用。
  • 17. 因此不是同一个内存地址,所以结果是false。
6.2 示例2
6.2.1 代码示例
	@Testpublic void test(){String str1 = new String("hello") + new String("world");str1.intern();String str2 = "helloworld";System.out.println(str1 == str2);}
6.2.2 分析(jdk8)
  • 1.str1是直接new了一个对象,执行intern()方法后,将字符串对象添加到字符串常量池中。
  • 2.String str2 = “helloworld”;会先在字符串常量池中找是否有,如果有则返回其对象的引用。
  • 3.所以结果是true。
6.3 示例3
6.3.1 代码示例
	@Testpublic void test(){String str1 = new String("helloworld") ;String str2 = "helloworld";String intern = str1.intern();System.out.println(str1 == str2);System.out.println(str1 == intern);System.out.println(str2 == intern);}
6.2.2 分析(jdk8)
  • 1.str1在堆上new了一个string对象。
  • 2.str2是将字面量“helloworld”放入字符串常量池中。
  • 3.str1调用intern方法,判断字符串常量池中有没有helloworld,发现有,返回了该字符串常量池的引用即str2。
  • 4.此时str1不等于str2。str2和intern是相等的。

相关文章:

【jvm】字符串常量池问题

目录 一、基本概念1.1 说明1.2 特点 二、存放位置2.1 JDK1.6及以前2.2 JDK1.72.3 JDK1.8及以后 三、工作原理3.1 创建字符串常量3.2 使用new关键字创建字符串 四、intern()方法4.1 作用 五、优点六、字节码分析6.1 示例16.1.1 代码示例6.1.2 字节码6.1.3 解析 6.2 示例26.2.1 代…...

STM32学习和实践笔记(39):I2C EEPROM实验

1.I2C总线介绍 I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I…...

【Js】导出 HTML 为 Word 文档

在 Web 开发中&#xff0c;有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档&#xff0c;以便更方便地分享和打印。 html样式 word文档 工具准备 1、 html-docx-js - npm html-docx-js是一个 JavaScript 库&#xff0c;用于将 HTML 内容转换为 Word 文档的格式。它…...

c++入门基础篇(上)

目录 前言&#xff1a; 1.c&#xff0b;&#xff0b;的第一个程序 2.命名空间 2.1 namespace的定义 2.2 命名空间使用 3.c&#xff0b;&#xff0b;输入&输出 4.缺省参数 5.函数重载 前言&#xff1a; 我们在之前学完了c语言的大部分语法知识&#xff0c;是不是意…...

Java实现数据结构——双链表

目录 一、前言 二、实现 2.1 类的创建 三、对链表操作实现 3.1 打印链表 3.2 插入数据 3.2.1 申请新节点 3.2.2 头插 ​编辑 3.2.3 尾插 3.2.4 链表长度 3.2.5 任意位置插入 3.3 删除数据 3.3.1 头删 3.3.2 尾删 3.3.3 删除指定位置数据 3.3.4 删除指定数据 3…...

Python应用爬虫下载QQ音乐歌曲!

目录&#xff1a; 1.简介怎样实现下载QQ音乐的过程&#xff1b; 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网&#xff1a; https://y.qq.com/&#xff0c;在搜索栏上输入一首歌曲的名称&#xff1b; 如我在上输入最美的期待&#xff0c;按回车来到这个画面 我们首…...

AWS-WAF-Log S3存放,通过Athena查看

1.创建好waf-cdn 并且设置好规则和log存储方式为s3 2. Amazon Athena 服务 使用 &#xff08;注意s3桶位置相同得区域&#xff09; https://docs.aws.amazon.com/zh_cn/athena/latest/ug/waf-logs.html#waf-example-count-matched-ip-addresses 官方文档参考,建一个分区查询表…...

无法解析主机:mirrorlist.centos.org Centos 7

从 2024 年 7 月 1 日起&#xff0c;在 CentOS 7 上&#xff0c;请切换到 Vault 存档存储库&#xff1a; vi /etc/yum.repos.d/CentOS-Base.repo 复制/粘贴以下内容并注意您的操作系统版本。如果需要&#xff0c;请更改。此配置中的版本为 7.9.2009&#xff1a; [base] name…...

自动驾驶论文总结

1.预测 1.1光栅化 代表性论文 Motion Prediction of Traffic Actors for Autonomous Driving using Deep Convolutional Networks (Uber)MultiPath (Waymo) 问题 渲染信息丢失感受野有限高计算复杂度 1.2图神经网络 1.2.1 图卷积 LaneGCN (uber 2020) 1.2.2 边卷积 V…...

【uniapp微信小程序】uniapp微信小程序——页面通信

uniapp微信小程序——页面通信 在开发微信小程序过程中&#xff0c;页面之间的通信是一个常见需求。在使用 uniapp 开发微信小程序时&#xff0c;我们可以采用多种方式实现页面之间的数据传递和状态共享。本文将详细介绍几种常见的实现方式&#xff0c;以供开发者参考。 1. 页…...

【笔记】从零开始做一个精灵龙女-画贴图阶段(上)

此文只是我的笔记&#xff0c;不包全看懂&#xff0c;有问题可评论 PS贴图加工 1.打开ps 拖入uv图&#xff0c;新建图层&#xff0c;设置背景色为灰色&#xff0c;改一下图层名字 2.按z缩小一下uv图层&#xff0c;拖入实体uv图片&#xff08;目的是更好上色&#xff0c;比如…...

线性代数|机器学习-P22逐步最小化一个函数

文章目录 1. 概述2. 泰勒公式3. 雅可比矩阵4. 经典牛顿法4.1 经典牛顿法理论4.2 牛顿迭代法解求方程根4.3 牛顿迭代法解求方程根 Python 5. 梯度下降和经典牛顿法5.1 线搜索方法5.2 经典牛顿法 6. 凸优化问题6.1 约束问题6.1 凸集组合 Mit麻省理工教授视频如下&#xff1a;逐步…...

SpringCloudAlibaba Nacos配置中心与服务发现

目录 1.配置 1.1配置的特点 只读 伴随应用的整个生命周期 多种加载方式 配置需要治理 1.2配置中心 2.Nacos简介 2.1特性 服务发现与服务健康检查 动态配置管理 动态DNS服务 服务和元数据管理 3.服务发现 1.配置 应用程序在启动和运行的时候往往需要读取一些配置信…...

.NET 一款获取内网共享机器的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…...

备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点(持续)

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…...

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…...

Python酷库之旅-第三方库Pandas(021)

目录 一、用法精讲 52、pandas.from_dummies函数 52-1、语法 52-2、参数 52-3、功能 52-4、返回值 52-5、说明 52-6、用法 52-6-1、数据准备 52-6-2、代码示例 52-6-3、结果输出 53、pandas.factorize函数 53-1、语法 53-2、参数 53-3、功能 53-4、返回值 53-…...

jvm 06 补充 OOM 和具体工具使用

1.OOM 是什么 OOM&#xff0c;全称“Out Of Memory”&#xff0c;翻译成中文就是“内存用完了”&#xff0c;来源于java.lang.OutOfMemoryError。看下关于的官方说明&#xff1a; Thrown when the Java Virtual Machine cannot allocate an object because it is out of memor…...

使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析 (scikit-learn Open3D numpy)

使用 NearestNeighbors 进行点云分析 在数据分析和机器学习领域&#xff0c;最近邻算法&#xff08;Nearest Neighbors&#xff09;是一种常用的非参数方法。它广泛应用于分类、回归和聚类分析等任务。下面将介绍如何使用 scikit-learn 库中的 NearestNeighbors 类来进行点云数…...

安装jenkins最新版本初始化配置及使用JDK1.8构建项目详细讲解

导读 1.安装1.1.相关网址1.2.准备环境1.3.下载安装 2. 配置jenkins2.1.安装插件2.2.配置全局工具2.3.系统配置 3. 使用3.1.配置job3.2.构建 提示&#xff1a;如果只想看如何使用jdk1.8构建项目&#xff0c;直接看3.1即可。 1.安装 1.1.相关网址 Jenkins官网&#xff1a;https…...

微软子公司Xandr遭隐私诉讼,或面临巨额罚款

近日&#xff0c;欧洲隐私权倡导组织noyb对微软子公司Xandr提起了诉讼&#xff0c;指控其透明度不足&#xff0c;侵犯了欧盟公民的数据访问权。据指控&#xff0c;Xandr的行为涉嫌违反《通用数据保护条例》&#xff08;GFPR&#xff09;&#xff0c;因其处理信息并创建用于微目…...

【VRP】基于常春藤算法IVY求解带时间窗的车辆路径问题TWVRP,最短距离附Matlab代码

% VRP - 基于IVY算法的TWVRP最短距离求解 % 数据准备 % 假设有一组客户点的坐标和对应的时间窗信息 % 假设数据已经存储在 coordinates、timeWindows 和 demands 变量中 % 参数设置 numCustomers size(coordinates, 1); % 客户点数量 vehicleCapacity 100; % 车辆容量 numV…...

常用软件的docker compose安装

简介 Docker Compose 是 Docker 的一个工具&#xff0c;用于定义和管理多容器 Docker 应用。通过使用一个单独的 YAML 文件&#xff0c;您可以定义应用所需的所有服务&#xff0c;然后使用一个简单的命令来启动和运行这些服务。Docker Compose 非常适合于微服务架构或任何需要…...

Excel第28享:如何新建一个Excel表格

一、背景需求 小姑电话说&#xff1a;要新建一个表格&#xff0c;并实现将几个单元格进行合并的需求。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“XLS工作表”或“XLSX工作表”都可以&#xff0c;如下图所示。 之后&…...

计算机网络知识汇总

OSI七层模型 七层模型一般指开放系统互连参考模型&#xff0c;开放系统互连参考模型 &#xff08;Open System Interconnect 简称OSI&#xff09;&#xff0c;OSI参考模型是具有7个层次的框架&#xff0c;自底向上的7个层次分别是物理层、数据链路层、网络层、传输层、会话层、…...

数据结构——考研笔记(二)线性表的定义和线性表之顺序表

文章目录 二、线性表2.1 定义、基本操作2.1.1 知识总览2.1.2 线性表的定义2.1.3 线性表的基本操作2.1.4 知识回顾与重要考点 2.2 顺序表2.2.1 知识总览2.2.2 顺序表的定义2.2.3 顺序表的实现——静态分配2.2.4 顺序表的实现——动态分配2.2.5 知识回顾与重要考点2.2.6 顺序表的…...

quota使用

一、检查系统是否支持 grep CONFIG_QUOTA /boot/config* CONFIG_QUOTAy CONFIG_QUOTA_NETLINK_INTERFACEy # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREEy CONFIG_QUOTACTLy CONFIG_QUOTACTL_COMPATy二、安装 yum install -y quota三、配置 3.1 创建磁盘 格式一定要 …...

解决fidder小黑怪倒出JMeter文件缺失域名、请求头

解决fidder小黑怪倒出JMeter文件缺失域名、请求头 1、目录结构&#xff1a; 2、代码 coding:utf-8 Software:PyCharm Time:2024/7/10 14:02 Author:Dr.zxyimport zipfile import os import xml.etree.ElementTree as ET import re#定义信息头 headers_to_extract [Host, Conn…...

智慧城市的神经网络:Transformer模型在智能城市构建中的应用

智慧城市的神经网络&#xff1a;Transformer模型在智能城市构建中的应用 随着城市化的快速发展&#xff0c;智能城市的概念应运而生&#xff0c;旨在通过先进的信息技术提升城市管理效率和居民生活质量。Transformer模型&#xff0c;作为人工智能领域的一颗新星&#xff0c;其…...

产品经理-研发流程-敏捷开发-迭代-需求评审及产品规划(15)

敏捷开发是以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。 通俗来说&#xff0c;敏捷开发是一个软件开发流程&#xff0c;是一个采用了迭代方法的开发流程 简单来说&#xff0c;迭代就是把一个大产品拆分出一些最小的实现单位。完成不同的迭代就最…...