java 常量池

java中的常量池 本文介绍了Java中的三种常量池:Class文件常量池、运行时常量池和字符串常量池。Class文件常量池存储编译期的字面量和符号引用;运行时常量池是类文件常量池的运行时表现,位于元空间;字符串常量池用于存储字符串字面量,JDK7后移至堆内存。文章详细解析了字符串常量池的驻留机制、不同创建方式(如直接赋值、new String)的内存分配流程,并通过示例说明intern()方法的差异(JDK6与JDK8行为不同)。最后通过字符串拼接示例,展示了编译期优化对常量池的影响。这些机制共同保障了Java字符串的高效复 阅读详情

常量池用于保存在编译期已确定的,已编译的,class文件中的一份数据,它包括了关于类,方法,接口等中的常量,也包括字符串常量。如第一种声明方式,当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。

用new String()创建的字符串不是常量,不能在编译期就确定,所以new String()创建的字符串不放入常量池中,他们有自己的地址空间。

String  s1 = “text”;

String s2 = “text”;

String s2 = s2+"java";

s1,s2同时指向常量池中的常量值"text",s2=s2+"java",后,s2原先指向一个常量,内容"text”,通过对s2进行+操作后,s2所指向的那个值没有改变,此时s2不指向原来那个变量值了,而指向了另一个String变量,内容为”text java“。原来那个变量还存在于内存之中,只是S2这个变量不再指向他了。

String 对象(内存)的不变性机制会使修改String字符串时,产生大量的对象,因为每次改变字符串,都会生成一个新的String。

java 为了更有效的使用内存,jvm有一块特殊的内存区域,被称为常量池,当编译期遇见String 字符串时,他检查该池内是否已经存在相同的String 字符串,如果找到,就把新变量的引用指向现有的字符串对象,不创建任何新的String 常量对象,没找到再创建新的。所以对一个字符串对象的任何修改,都会产生一个新的字符串对象,原来的依然存在,等待垃圾回收。


如果反汇编以上程序的字节码,可以发现,String a = b + "love"; 的实际实现是:
String a = new StringBuilder().append(b).append("love").toString();
所以其实最后是通过toString()方法返回的对象
再查看API中toString()方法的源代码
可以得出结论,返回的是一个堆中的新的对象

 String xx = "ab";

xx = xx + "cd"; //返回的是一个堆中的新的对象

String x1 = "abcd";//常量池中的对象

所以 if(xx == x1)  xx 和 x1 是不同的对象

String b = "hate";
String a = b + "love";
总共创建3个对象,分别是常量池中的“hate”和“love”,以及堆中的“hatelove”
执行过程分析:
1.类加载时,常量池中创建了2个字符串字面常量"hate"和"love"
2.栈中创建引用b,指向常量池中的"hate"
3.栈中创建引用a,+运算后,堆中创建String对象"hatelove",引用a指向该对象


Integer(http://www.iteye.com/topic/1112923)

和String的对象池一样,几种整数基本类型的包装类型也有对象池机制。 
也就是说用Integer int1 = 30;这种方式声明一个Integer对象时会先在对象池中找有没有值为30的对象,如果有直接拿来用,如果没有则重新创建一个对象放入对象池中。java中“==”是比较值,int1和int2引用的同一个对象,内存地址相同,所以int1==int2结果为true。 
而Integer int4 = new Integer(30);这种方式是重新创建一个Integer对象,不会放入对象池中,所以int4和int5是两个不同对象的引用int4==int5结果为false。 
至于int4==int5+int6,因为涉及到运算,所以都是取的各个Integer对象的intValue,也就是比较的30==30+0,所以为true。 
另外补充一点,对象池中对象的值的在[-128,127]之间,超过此范围的不会在对象池中缓存。也就是说Integer int7 = 130;Integer int8 = 130;判断int7==int8,结果为false。

 

Integer int1 = 30; 
Integer int2 = 30; 
Integer int3 = 0; 
System.out.println(int1 == int2); 
System.out.println(int1 == int2 + int3); 

Integer int4 = new Integer(30); 
Integer int5 = new Integer(30); 
Integer int6 = new Integer(0); 
System.out.println(int4 == int5); 
System.out.println(int4 == int5 + int6); 

深度解析Java常量池 Java常量池体系Class文件常量池运行时常量池字符串常量池方法区存储堆内存存储。 阅读详情

相关推荐

封包(一)(雷电模拟器+ProxyDroid+查尔斯3.93+WPE)

自从换了工作就没有给大家分享一些干活,在加上陪伴自己的孩子没有时间更新文章了,这只能在晚上给大家写文档了,我最近在游戏公司上班,研究封包。我把这些东西都做成了笔记,我想有些东西是大家都想弄明白d ...

寒梅独自开 1万+

Java中的常量池(字符串常量池、class常量池和运行时常量池)

简介: 这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去优快云、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨: 在Java的内存分配中,总共3种常量池:1.字符串常量池(String Constant Pool):1.1:字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串

ZhuMin_ChosenOne的博客 4万+

Aspose Java 25.10 版本深度破解:基于字节码修改的实战指南

本文提供了Aspose Java 25.10版本基于字节码修改的实战指南。详细介绍了如何通过Javassist工具逆向分析并修改Aspose Cells、Words、Slides及PDF组件的许可证验证逻辑,从而实现绕过限制,并完成最终的打包与功能验证。

stone的博客 1358

java中常量池存的是什么_Java中常量池是什么?Java常量池的介绍

本篇文章给大家带来的内容是关于Java中常量池是什么?Java常量池的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。Java当中的常量池在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区。程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方法所使用的栈,而虚拟机栈是用来执行程序代码的栈,在方法区中有类变量...

weixin_33148993的博客 2952

Codex API 直接集成指南:告别中转代理,构建稳定高效的 AI 应用

在 AI 应用开发中,API 集成是连接模型能力与业务逻辑的核心环节。其基本原理是通过 HTTP 协议,按照服务提供商定义的规范发送请求并解析响应,实现远程调用。标准化的 API 设计确保了跨平台和跨语言的互操作性,其技术价值在于提供了稳定、可控且可扩展的服务接入方式,是构建企业级智能应用的基础。在实际应用场景中,开发者常需集成如 Codex 这类聚合了多种大语言模型的平台,以调用诸如 DeepSeek 等先进模型。然而,部分开发者仍依赖过时的第三方中转代理工具,这不仅引入了单点故障和版本锁定的风险,还可能

weixin_28224217的博客 339

Ubuntu22.04下,用Fast-LIVO2+3DGS重建桌面小物件:从点云到高清模型的保姆级避坑实录

本文详细介绍了在Ubuntu22.04环境下,使用Fast-LIVO2与3DGS技术进行桌面小物件三维重建的完整流程。从环境配置、数据采集到点云-图像对齐和3DGS训练,提供了针对小物件优化的参数设置和避坑指南,帮助用户实现媲美商业扫描仪的高清模型重建效果。

weixin_30897233的博客 399

Java 常量池

常量池分为 Class 常量池常量池、运行时常量池、字符串常量池。 1、 Class 常量池常量池(静态常量池) Java 文件被编译成 Class 文件,Class 文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项就是 Class 常量池,Class 常量池是当 Class 文件被 Java 虚拟机加载进来后存放各种字面量 (Literal)和符号引用 。 字面量相当于 Java 语言层面常量的概念,如文本字符串、基础数据、声明为 final 的常量等;符号引用则属于编译原理方面的概念,

IT__learning的博客 7890

【笔记篇】Davinci Configurator EcuM模块

autosar ecum模块简介

weixin_47571898的博客 1268

java 常量池详解

java、jvm、常量池、虚拟机

李帅的博客 1874

【异常】DeepSeek API HTTP 401 认证失败错误完整排查与解决方案

摘要:本文针对DeepSeek API开发中的HTTP 401认证失败错误进行深度解析,指出该错误属于不可重试的认证类问题。文章首先拆解错误日志关键字段,区分401与其他API错误的本质差异。随后提供优先级排序的全链路解决方案:1)检查API密钥有效性;2)规范请求头认证格式;3)排查账户权限状态;4)验证请求环境配置。最后建议通过新建测试密钥、使用官方示例代码或联系技术支持进行兜底处理。全文采用技术脱敏处理,为开发者提供系统性的401错误排查指南。(149字)

奶爸的编程之路,也就一周冷个三天 1530

行为预测模型:Social LSTM与Graph Neural Networks

行为预测模型:Social LSTM与Graph Neural Networks ,人工智能,计算机视觉,大模型,AI,本文围绕行为预测模型Social LSTM与Graph Neural Networks展开,介绍了两者的基础概念、原理、应用场景,还对比了它们在优势、劣势和适用场景上的不同,最后给出了相应的代码示例。Social LSTM基于LSTM,通过社交池化层处理多智能体交互;图神经网络处理图结构数据,靠消息传递获取信息,二者各有侧重,适用于不同场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

深入解析 Java 常量池:Class 常量池、运行时常量池与字符串常量池

理解这些常量池的概念和特性对于 Java 开发者来说至关重要。它不仅有助于我们更好地理解 Java 程序的运行机制,还能帮助我们在开发过程中优化内存使用,避免常见的内存问题,如内存溢出等。

2201_75353178的博客 1409

openmediavault(OMV)(30)插件介绍(3)filebrowser文件管理器

filebrowser可以对omv的文件进行图形化管理,而不需要每次都通过命令进行修改。filebrowser安装。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2320

Java 中的常量池

总之,Java 常量池是一套围绕常量存储、复用、类加载支持的机制,从 Class 文件编译时的内容准备,到类加载后的运行时动态管理,再到不同 JDK 版本的演进优化,深刻影响着 Java 程序的内存使用、性能和灵活性 ,理解它对分析类加载过程、字符串优化、内存问题(如常量池内存溢出 )等都有重要意义。时,这些内容会被加载到运行时常量池 ,后续执行。方法相关的符号引用等。文件,其 Class 文件常量池会包含。,在 JDK 1.7 及之前还有。Java 里的常量池可细分为。,就会从运行时常量池获取。

weixin_43521001的博客 1113

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java常量池

方法时,在字符串常量池分配内存,内存值指向str对象。方法返回字符串常量池引用,与str引用不同。3.1 为什么要设计字符串常量池。方法返回引用和str是同一个引用。方法返回的引用与str引用一致。因为test通过形参传入,会。3.2 创建字符串对象的。3.4 字符串的不可变性。3.3 字符串的+操作。1 Class常量池。

GzlAndy的博客 661

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java中常量池

java 中常量池,字符串常量池,intern() 方法详解,基本对象常量池

a141210104的专栏 1188

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java常量池总结

java常量池1.class常量池2.运行时常量池3.基本类型包装类常量池4.字符串常量池 1.class常量池 在JAVA中,Java类(.java)文件被编译后就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是class常量池,用于存放编译器生成的各种字面量和符号引用,每一个class文件都有一个对应的class常量池。 其中各种字面量包括: 1.文本字符串 2.八种基本类型的值 3.被声明为final的常量 符号引用包括: 1.类和方法的 全限

weixin_47983174的博客 1191

Java几种常量池区分(字符串常量池、class常量池和运行时常量池)

        在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。 1.全局字符串池(string pool也有叫做string literal pool)         全局字符串池里的内

Syntactic Sugar 1961

java常量池在哪里_java常量池在哪?有什么用处?

为了更方便的使用对象,常量池是我们需要了解的必要一环,下面来看看常量的用处及它的存放地点。Java常量池存放地点在哪?如图:在Java6和6之前,常量池一般是存放在方法区中的,到了Java7,常量池就被存放到了堆中,Java8之后,就取消了整个永久代区域,取而代之的是元空间。在运行时常量池与静态常量池都会存放在元空间中,但字符串常量池依然存放在堆中。常量池的用处是?常量池,是指在编译期被确定,并被...

weixin_39872395的博客 3305

Java中几种常量池(字符串常量池, Class常量池, 运行时常量池)的区别与联系

字符串常量池, Class常量池, 运行时常量池

向上的"狼"的博客 3730

Java运行时常量池

概述 1.常量池在内存中的位置: 在JDK1.6中,方法区是以永久代的方式实现(HotSpot),常量池是方法区的一部分。 在JDK1.7中,方法区合并到堆内存中,常量池可以说在堆内存中。 在JDK8中,方法区又被剥离出来,只不过实现方式不是永久代,此时的方法区叫元数据区,常量池也就在元数据区。 2. 常量池的概念以及作用 通常来讲,所有变量,包括基本类型和引用类型,他们都存在虚拟机栈中,包括变量类型、变量名称、和变量值。对于基本类型来说,值就是具...

weixin_44250483的博客 6786

java 常量池和运行时常量池

运行时常量池存在于内存中,即类常量池加载到内存后的版本,是方法区的一部分(JDK1.8运行时常量池在元空间,也是方法区的一种实现)。有些数据没有提前缓存在字符串常量池中,但如果要创建的字符串存在于常量池中,则返回对象的引用,如果不存在,则创建一个并放入常量池中。(每个用new创建的new都会在堆上创建一个对象,用引号创建的会直接指向常量池(如果已经存在的话),所以不需要创建。在Java中,创建string对象有两种方法,一种是直接创建literal对象,另一种是创建新的String对象。

fmz2222的博客 1191

JAVA中几种常见的常量池

在JAVA程序的运行过程中,常常需要重复使用大量的常量,如果每使用一次就重新创建一次常量的话,不仅会造成内存的浪费,同时也会因为频繁的创建常量而导致性能下降。使用常量池,本质上就是一个缓存池,把使用的常量放入池中,在使用的时候,如果常量池中有对应的常量,则将对象地址指向常量池的常量,避免了频繁的创建常量带来的内存和性能的损耗。

是琼琼琼琼琼啊的博客 851

java常量池:字符串常量池,静态常量池,运行时常量池,

转载自:https://blog.youkuaiyun.com/qq_25825923/article/details/84972256 字符串常量池(String Poll) java6: 存在于永久代中。 字符串常量池保存的是字符串常量。 java7: 转移到了堆中。 字符串常量池存的是字符串常量和堆内的字符串对象的引用。 静态常量池 zld自身理解:java编译后生成的...

祁东握力的博客 699

java的常量池

java常量池 java的常量池有三个概念,静态常量池,运行时常量池,字符串常量池 JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。 静态常量池用于存放编译期生成的各种字面量和符号引用,而当类加载到内存中后,jvm就会将静态常量池中的内容存放到运行时常量池中。而字符串常量池存的是引用值,其存在于运行时常量池之中。 静态常量池 静态常量池也就是Class文件中的常量池。 静态常量池用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常

fall_hat的博客 296
上一篇: linux shell 管道命令(pipe)使用及与shell重定向区别
下一篇: Java初始化顺序
randomnet
博客等级 码龄19年 59粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值