JAVA String对象和字符串常量的关系解析

java2实用教程 (课后习题总结) java2实用教程 (课后习题总结)第八章 阅读详情

JAVA String对象和字符串常量的关系解析

1 字符串内部列表

  JAVA中所有的对象都存放在堆里面,包括String对象。字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了。 虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string、integer和float point常量)和对其他类型、字段和方法的符号引用。

例如,

String s = new String( "myString" );

其中字符串常量是"myString",在编译时被存储在常量池的某个位置。在解析阶段,虚拟机发现字符串常量"myString",它会在一个内部字符串常量列表中查找,如果没有找到,那么会在堆里面创建一个包含字符序列[myString]的String对象s1,然后把这个字符序列和对应的String对象作为名值对( [myString], s1 )保存到内部字符串常量列表中。如下图所示:

 


 

  如果虚拟机后面又发现了一个相同的字符串常量myString,它会在这个内部字符串常量列表内找到相同的字符序列,然后返回对应的String对象的引用。维护这个内部列表的关键是任何特定的字符序列在这个列表上只出现一次。

例如,String s2 = "myString",运行时s2会从内部字符串常量列表内得到s1的返回值,所以s2和s1都指向同一个String对象。但是String对象s在堆里的一个不同位置,所以和s1不相同。

JAVA中的字符串常量可以作为String对象使用,字符串常量的字符序列本身是存放在常量池中,在字符串内部列表中每个字符串常量的字符序列对应一个String对象,实际使用的就是这个对象。

2 字符串截留intern

在某些上下文环境下,仅仅保留某个字符串的一份copy能够提高内存的使用和效率。String类的intern()方法可以截留字符串,如果String对象包含的字符序列不在字符串常量内部列表中,那么就把这个String对象包含的字符序列和String对象的引用作为名值对保存到内部列表中,最后intern()返回一个指向String对象本身的引用;如果 String对象包含的字符序列在字符串常量内部列表中,那么就返回列表的名值对中的对应的字符串对象引用,而String对象本身的就会被丢弃。

例如,s.intern()就会返回和s2相同的引用,而以前的s对象就会被垃圾回收。

使用intern()要注意,被放到字符串内部列表中的字符串对象是不会被垃圾回收的,生命周期和整个程序相同,所以如果使用不当会造成内存泄露。

 

Java中String和字符串常量池 本文简单讲解Java中那些String引用和字符串常量池的关系 什么是String 什么是字符串常量池 String 根据源码可知,字符串String对象的底层是char[]数组来存储数据,也就是String对象中包括了char[]数组对象。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for 阅读详情

相关推荐

激光可燃气体传感器DIY指南:从TDLAS原理到STM32实战(附代码)

本文详细介绍了如何DIY激光可燃气体传感器,从TDLAS原理到STM32实战,包括硬件选型、光路搭建、电子系统设计和嵌入式软件开发。通过TDLAS技术实现高灵敏度甲烷检测,适合工业安全和环境监测应用。附有完整代码和实用调试技巧,帮助开发者快速掌握光学气体检测技术。

fanta的博客 440

字符串常量与字符串对象分配内存时的区别

字符串常量和字符串变量以及他们对象的创建过程, 字符串常量:是放在字符串常量池里的,在代码里也就是"abc" 字符串对象:是一个对象,是放在堆里的,在代码里也就是"new String("abc")" String s1 = new String("abc") String s2 = "abc".........

peinanwei__的博客 780

数据安全实战技能解析:从加密攻防到数字水印的竞赛指南

数据安全是信息安全领域的核心,其基础在于密码学与信息隐藏技术。密码学通过加密算法(如AES、RSA)和哈希函数,保障数据的机密性与完整性,其原理涉及对称/非对称加密、工作模式及密钥管理。数字水印技术则基于信号处理(如DCT/DWT变换),将信息嵌入多媒体载体,用于版权保护与溯源。这些技术的价值在于为数据全生命周期提供“防泄漏”与“可追溯”的解决方案,广泛应用于企业数据治理、合规审计和**数据防泄漏(DLP)** 系统。本文以一场贴近实战的**数据安全职业技能竞赛**为切入点,深入剖析如何运用密码分析、磁盘取

weixin_34314962的博客 402

String常量

//String str="abc";字符串常量,一旦被赋值不能被修改 //注意:不能被修改的是"abc",而不是str。str依旧是一个变量 public class Final { public static void main(String[] args){ String str="abc"; str+="efg"; System.out.println(str);   }

shicuicui1234的博客 767

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1980

神州数码防火墙(DCN)NAT SSL-VPN配置

SSL-VPN是基于应用层的VPN,采用SSL协议来实现远程接入的一种新型VPN技术,比L2TP更加灵活的VPN方案。是天然的安全远程接入方案。用户可以通过浏览器的HTTPSs登录VPN的网址。SSL-VPN的认证方式包括LDAP,radius,CA,USB Key等方式。 SSL VPN的主要应用场景是保证远程用户能够在企业外部安全\高效的访问企业内部的网络资源

qq_50966485的博客 4555

String:字符串类型

String:字符串类型。 有多种构造方式,常用的有以下三种: //第一种用的最多 String str1 = "helloworld"; //第二种 String str2 = new String("helloworld"); //第三种 char[] array = {'h','e','l','l','o'}; String str3 = new String(array); “he

wah369的博客 963

VMware虚拟机安装MS-DOS 7.10教程

dos安装教程dos版本7.10附下载链接。

Minecraft_xiaole的博客 1万+

String的定义规则汇总

//先来看看初始化String的几种方法 String str1 = "123"; String str1_1="123"; System.out.println(str1); String str2 = new String("123"); System.out.println(str2); //值得注意的是str1和str2虽然都是创建新的String对象,但是内存中的显示方式有不同点 ...

Nan1mono的博客 843

AI自动化流程在金融风控中的3个典型案例

AI自动化风控流程全流程自动化:最小化人工干预,实现从数据输入到决策输出的闭环自适应学习:通过持续数据反馈实现模型自动迭代优化实时决策能力:满足毫秒级(支付风控)至分钟级(信贷审批)的响应需求多模态数据融合:整合结构化、非结构化和实时流数据智能决策解释:自动生成符合监管要求的决策解释人机协同机制:在高风险场景下实现AI与人类专家的协同决策实施后关键绩效指标(KPI)变化指标实施前实施后改进幅度平均审批时间3.2天4.7分钟-99.7%自动审批率15%85%+467%

架构师的AI之路,分享AI应用开发架构的学习与实践。 1535

【PyQt】使用PyQt6基于Scenedetect制作视频场景自动分割应用

通过详细介绍PySceneDetect的功能和应用,本文阐释了如何利用这一工具提高视频编辑的效率。我们讨论了安装方法、命令行使用示例以及如何在Python脚本中集成PySceneDetect。此外文章还涵盖了基于PyQt6的图形界面设计,通过多线程技术处理视频,保证界面的响应性,并通过实时反馈机制提升用户体验。无论是专业的视频制作团队还是个人爱好者,PySceneDetect都提供了一种可行的、效率高的场景检测工具,让视频编辑工作变得更加简单快捷。

Mr数据杨 960

java正确的字符串常量是什么意思_JAVA String对象和字符串常量的关系解析

JAVA String对象和字符串常量的关系解析1 字符串内部列表JAVA中所有的对象都存放在堆里面,包括String对象。字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了。虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string、integer和float point常量)和对其他类型、字段和方法的符号引用。例如,Stri...

weixin_39816024的博客 1506

深度学习笔记——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总

本文简要介绍深度学习的前向传播与反向传播,以及前馈神经网络与反馈神经网络。

haopinglianlian的博客 3042

Java String实例的创建和常量池的关系及intern方法

Java String实例的创建和各种常量池的关系 常量池 class文件常量池(class constant pool) class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。 字面量就是我们所说的常量概念,如文本字...

超越时代 641

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android 蓝牙通讯demo

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

java string pool 栈_Java字符串常量池String Pool的理解

Java中String是一个非常特殊的数据类型,在学习JVM虚拟机的时候,才真正意识到为了让String类型在运行过程中速度更快、更节省内存,才提供了字符串常量池的概念。概念字符串常量池(String Pool)保存所欲字符串字面量(literal strings),这些字面量在编译时期就确定,不仅如此,还可以使用String的intern()方法在运行时添加到常量池中。常量池的使用主要有两种方法...

weixin_35544017的博客 170

WINCC7.3破解文件

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

对堆和字符串常量池的一些理解

对堆和字符串常量池的一些理解堆和常量池的关系创建String对象时的内存结构分析为常量赋值创建对象的赋值举例intern()方法的使用(直接看代码) 堆和常量池的关系 堆(Heap) Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Heap是被所有线程共享的一块内存区域,在虚拟机启动时被创建。 Heap的唯一目的就是存放对象实例,几乎所有的对象实例都是在这里分配内存。 字...

weixin_43180461的博客 1164

Java对String字符串对象的创建,管理和“+”运算符的实现

<br />http://hi.baidu.com/boywell/blog/item/a069bccbc45e7c4cf31fe758.html<br />来源:1,http://topic.youkuaiyun.com/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html<br />         2,http://topic.youkuaiyun.com/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html

开心生活每一天 935

Java定义字符串:String 和 new String()的区别

先了解三个不同存储区: 栈区:存放基本类型和引用类型的引用地址。 堆区:存放对象 字符串常量池: 直接使用双引号声明出来的 String 对象会直接存储在常量池中。 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方String.intern()。它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。

学而不思则忘 1338

String类intern()方法和字符串常量池

String类和常量池 1. String对象创建方式 String str1 = "abcd"; String str2 = new String("abcd"); System.out.println(str1==str2);//false 这两种不同的创建方法是有差别的,第一种方式是在常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。 只要使用new方法,便需要创建新的对象。 创建了几个对象? 1. String s1 = new String(“xyz”); 考虑类加...

好好学java 301

String类及字符串常量池的学习

String 是Java中常用的基础类之一,用来表示字符串类型,但是相较于其他对象还是比较特殊的,它与字符串常量池(String Pool)密切相关。JVM规范中字符串常量池是在方法区上一个驻留字符串(Interned Strings)的位置,是为了优化而专门供字符串存储的一块区域,这个区域在整个虚拟机中是共享的,而在JDK7及以后的版本被移到了堆空间中。 String 是如何被创建的 String 创建对象有两种方式: 字面量赋值String s = "Hello World"; new关键字创建Str

ZHANGDX的博客 211
上一篇: JAVA类装载器classloader和命名空间namespace
下一篇: JAVA动态绑定的内部实现机制
飞天金刚
博客等级 码龄17年 35粉丝 15原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值