关于字符串在常量池中中的存储问题

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

关于字符串在常量池中中的存储问题

package com.xwl;
/**
 * 关于常量池的问题
 * @author Administrator
 * 字符串常量池
 */
public class AboutInterview {
    public static void main(String[] args) {
         String s1 = "hello";
         String s2 = "hello";
         String s3 = "he" + "llo";
         String s4 = "hel" + new String("lo");
         String s5 = new String("hello");
         String s6 = s5.intern();
         String s7 = "h";
         String s8 = "ello";
         String s9 = s7 + s8;
         System.out.println(s1==s2);//true  s1创建后在串池中,s2创建时候发现已经有,这返回s1的地址 因此相等
         System.out.println(s1==s3);//true  s3字符串拼接后就是s1 jvm在编译期间就已经对它进行优化   因此相等
         System.out.println(s1==s4);//false
         /**
          * s4中的new String("lo")生成了两个对象,"lo","new String("lo")",
          *"lo"存在字符串常量池,"new String("lo")"存在堆中,
          *String s4 = "hel" + new String("lo")实质上是两个对象的相加,
          *编译器不会进行优化,相加的结果存在堆中,而s1存在字符串常量池中,当然不相等。
          */
         System.out.println(s1==s9);//false
         System.out.println(s4==s5);//false
         System.out.println(s1==s6);//true
         System.out.println("-----------------------------------");
         String c1 = new String("hello");
         String c2 = "hello";
         String intern1 = c1.intern();
         System.out.println(intern1 == c2);
         String c3 = new String("hello") + new String("hello");
         String c4 = "hellohello";
         String intern3 = c3.intern();
         System.out.println(intern3 == c4); 
         /**
          * jdk1.6下字符串常量池是在永久区中,是与堆完全独立的两个空间,
          * c1指向堆中的内容,c2指向字符串常量池中的内容,两者当然不一样,
          * c1.intern1()将字面量加入字符串常量池中,
          * 由于字符串常量池中已经存在该字面量,所以返回该字面量的唯一引用,intern1==c2就输出true。
          * jdk1.7,1.8下字符串常量池已经转移到堆中了,是堆中的一部分内容,
          * jvm设计人员对intern()进行了一些修改.
          * 当执行c3.intern()时,jvm不再把s3对应的字面量复制一份到字符串常量池中,
          * 而是在字符串常量池中存储一份s3的引用,这个引用指向堆中的字面量,
          * 当运行到String c4 = "hellohello"时,
          * 发现字符串常量池已经存在一个指向堆中该字面量的引用,则返回这个引用,而这个引用就是c3。所以c3==c4输出true。
          */
         System.out.println("---------------------");
         String d1 = new String("hello");
         String d2 = "hello";
         String inter1 = d1.intern();
         System.out.println(d1 == d2);
         String d3 = new String("hello") + new String("hello");
         String d4 = "hellohello";
         String inter3 = d3.intern();
         System.out.println(d3 == d4);
         /**
          * s3指向堆内容,接着s4="hellohello"发现字符串常量池中没有该字面量,创建并返回该引用。
          * s3,s4一个在堆,一个在字符串常量池,是两个独立的引用,所以s3==s4输出false。
          */    
        }
}
Java字符串常量池和intern方法解析:优化内存与提高性能 字符串常量池(String Pool)是Java中的一个特殊的内存区域,用于存储字符串常量(String literals)。它是一种字符串对象的缓存机制,旨在节省内存和提高性能。字符串重用:字符串常量池的主要作用是重用字符串对象。在Java中,字符串常量(通过双引号括起来的字符串字面值)会被自动放入字符串常量池。当程序中出现相同的字符串常量时,它们实际上引用的是同一个字符串对象。这样可以避免创建多个相同内容的字符串对象,节省内存空间。 阅读详情

相关推荐

深入理解JVM(三)-JVM中的常量池

JVM常量池包括运行时常量池、字符串常量池、基本类型包装类常量池、class文件常量池。

cxxf688的博客 352

解决“对于常量池来说, 字符串 "..." 的 UTF8 表示过长”以及读取properties中文乱码的问题

用IDEA写程序时碰到了一个问题,读取写在常量类中的一个字符串时发生了错误 Error:(6, 8) java: 对于常量池来说, 字符串 "{"actualCapital":"",..." 的 UTF8 表示过长网上查了一下,是这个字符串的大小超过了65535个字节,也就是64K。的确,我的这个字符串长度大概是94K,超过了64K。 2. 解决方法:把这个字符串从常量类中挪到properties

飞天神猪 1万+

网络摄像机安装说明书

网络摄像机安装说明书

对于常量池来说, 字符串 *** 的 UTF8 表示过长怎么解决

需要从一个json字符串中拿点数据,但是报了这样一个错误,这一看,难受了啊,字符串太长了,导致无法继续了 上网上搜索了攻略,发现都是一些比较拉闸的办法,感觉使用起来比较复杂。。 这里给大家说一个新方法。仅适用于跑程序的时候出现这种问题的情况。。。。。。 直接将字符串放到一个桌面的.txt文件中,然后在程序中读取这个文件。 使用如下代码需要使用guava包,引入以下 <dependency> <groupId>com.google.guava&lt

水镜先生的博客 7835

jvm如何处理长字符串

jvm如何处理长字符串?java的classs文件中,constant_utf8_info的长度是u2,也就是说,一个字符串最长是65535个字节,但是,在本机做测试,超过这个长度的字符串也是允许的,原因是什么?

数字IC后端时钟树综合实战:OCC电路优化与时钟树平衡策略

本文深入探讨了数字IC后端设计中时钟树综合的关键挑战,重点分析了OCC电路时钟树优化的必要性。通过实战案例,详细阐述了如何通过手动干预、时钟分组与分段长树等策略,避免工具自动平衡导致的时序违例和资源浪费,从而有效实现时钟树平衡并提升设计质量。

weixin_29306261的博客 326

Error,java对常量池来说字符串xxx的UTF8表示过长

做项目,客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了。老方法直接google、百度然后看到一堆有关String 字符串常量池字符最大限制的文章,这些前辈都是从jvm的运行时常量池的常量表占的内存数,从原理上讲解了常量池所能容纳的最大字符数。对于不了解jvm的同学来说,啥无符号数、有符号数、u1、u2之类的看着看着就懵逼了......

dev晴天的博客 8402

三相直流无刷电机(带HALL传感器)BLDC控制一

本案例选择TIM0的CH0/CH1/CH2三个通道接入三路原始hall输出信号。三路TIM_CHx(48)通过配置存入到NIP寄存器(new input pattern,3 bits)内。未完待续。

m0_69929716的博客 405

编译出错:对于常量池来说,字符串表示的UTF过长,那我想知道,JVM的常量池到底有多大?

输入缓冲说是8000个字符,和这有关吗? 解决方案 » 虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,

z69183787的专栏 7914

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

阿里云导出的镜像raw转换成vmdk格式工具

阿里云导出的镜像raw转换成vmdk格式工具 1.安装java环境,安装教程不介绍了 2.raw2vmdk软件下载: 在我的链接里面: 3.使用 打开cmd.bat软件: java -jar raw2vmdk.jar (原镜像)C:\\images\\raw\\disk.img (转换的镜像)D:\\images\\vmdk\\disk.vmdk 4.vmware打开vmdk文件 ...

3843

java字符串过长编译不通过问题。

Error:(207, 19) java: 对于常量池来说, 字符串 “” ..." 的 UTF8 表示过长

城北码农的博客 1010

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1171

字符串常量池有什么作用

是 Java 中一种用于优化内存和提高性能的机制。它是方法区 (Java 8 之前) 或元空间 (Java 8 之后) 中专门用来存储。

m0_69529796的博客 876

OpenCV图像去畸变实战指南:从原理到参数调优(附完整代码与效果对比)

本文深入解析了OpenCV图像去畸变的原理与实战技巧,详细对比了标准透视、鱼眼及全能型omnidir三种校正函数的核心参数调优方法。通过分析alpha、balance、centerX/Y及focalScale四大参数对输出效果的影响,并结合完整代码与效果对比图,帮助开发者精准校正镜头畸变,提升计算机视觉任务精度。

weixin_29046611的博客 341

【SpringBoot】1、创建第一个SpringBoot项目

创建SpringBoot项目可以通过两种方式,1、通过访问:https://start.spring.io/,SpringBoot的官方网站进行创建SpringBoot项目;2、通过工具(例如:Idea)创建SpringBoot项目。本次使用开发工具:Idea创建我的第一个SpringBoot项目。 首先,打开我们的Idea开发工具 选择Create New Poject(创建一个新的项目) ...

JACKAL 21万+

JVM中常量池和运行时常量池、字符串常量池三者之间的关系

在Java虚拟机(JVM)中,常量池、运行时常量池和字符串常量池是三个相关但又有所区别的概念。本文将详细解释这三个概念及其相互的联系。

weixin_46425661的博客 1645

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

在Java的内存分配中,总共3种常量池: 1.字符串常量池(String Constant Pool): 1.1:字符串常量池在Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。 1.2:字符串常量池是什么? 在HotSpot VM...

qfc8930858的博客 200

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Java随手小记】字符串常量池是怎样的?存储的是引用还是对象?

其实很多资料中写过字符串常量池中存储的是引用,但是在很多视频讲解里又经常简化成对象就在字符串常量池里,固然明白这是为了讲解,简化了一些结构,但是也难免使人产生好奇,到底是怎样的一个结构呢?

m0_51214238的博客 636

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

string字符串常量池在内存中的位置

这里只是举个简单的例子说明字符串常量池在内存中的位置。     闲言少叙,直接上代码。   Java代码   "font-size: large;">import java.util.ArrayList;    public class Test {        public static void main(String[] args) {          Strin

litong09282039的博客 9286

Java 字符串String 在堆,栈,常量池中

Java 字符串String 在堆,栈,常量池中

分享我的点点滴滴,在成长路上与你同行! 3093

Java常量池储存什么_JAVA常量池中存储的常量是什么

展开全部我当初也存在这样一个疑问,下面我把e69da5e887aa3231313335323631343130323136353331333262356165当初所搜集的一些资料以及自己的理解贴出来给你看看(比较多,需要耐心点看,呵呵):理解Java常量池JVM运行时数据区的内存模型由五部分组成:【1】方法区【2】堆【3】JAVA栈【4】PC寄存器【5】本地方法栈对于String s = "hah...

weixin_39875760的博客 2310

JAVA字符串常量池你弄懂了吗?看看这个10个问题你能不能回答正确

字符串常量池你弄懂了吗?看看这个题你能不能回答正确 /** * @author humorchen * @date 2021/12/28 10:43 */ public static void main(String[] args) throws InterruptedException { String s = new String("1"); String intern = s.intern(); String s1 = "1"; .

HumorChen的博客 581

java字符串常量池_java字符串常量池小问题

救救孩子吧QWQ在《疯狂java讲义》中对于字符串有这么一段描述“当 java 程序直接使用形如 "hello" 这样的字符串直接量(包括在编译时就可以计算出来的字符串值)时,JVM 将会使用常量池来管理这些字符串;当使用 new String("hello") 这样的表达式时,JVM 会先使用常量池来管理 "hello" 直接量,再调用 String 类的构造器来创建一个新的 String 对象...

weixin_42390041的博客 142

java字符串太长会有什么异常,【转】Error,java对常量池来说字符串xxx的UTF8表示过长的解决及其理解...

做项目,客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了。老方法直接google、百度然后看到一堆有关String 字符串常量池字符最大限制的文章,这些前辈都是从jvm的运行时常量池的常量表占的内存数,从原理上讲解了常量池所能容纳的最大字符数。对于不了解jvm的同学来说,啥无符号数、有符号数、u1、u2之类的看着看着就懵逼了。...

weixin_42097533的博客 1630
上一篇: 算法_创建三个线程交替循环打印“A”、"B"、“C”
下一篇: 动态代理的两种实现方式小案例
丿千寻
博客等级 码龄8年 8粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值