Java中关于字符串常量池的详解!!!

news2024/11/24 17:15:58

字符串常量池

  • 前言
    • 1. 直接赋值法,默认从常量池中取对象
    • 2. new一个对象
    • 3. 字符串常量池、字符串对象、内部的value引用、具体的字符数组之间的关系
    • 4. 手动入池方法:intern方法

前言

Java使用 “ ” 称为字符串常量,为了提高程序的运行速度,节省空间,JVM会维护一个字符串常量池。当字符串常量第一次出现,则产生新对象并将该对象置入常量池中,后续如果再出现该字符串常量,不会产生新对象,直接复用常量池中的已有对象。

1. 直接赋值法,默认从常量池中取对象

  • “ ” 内容都是字符串常量,都是字符串对象
  • 字符串对象不可变,无法修改value的内容
//第一次出现,产生新对象,入池
String s1="hello";
//第二次出现,不会产生新对象
String s2="hello";

以上代码的内存示意图s1==s2
在这里插入图片描述

2. new一个对象

  • new一个对象,需要调用构造方法进行新对象的创建。
  • 每调用一次new,都会在堆上开辟新空间,返回新创建的对象。
  • 总之:看见new就会产生新空间!!!
    对如下代码进行分析:
//直接赋值法
String s1="hello";
String s2="hello";
//构造方法产生新对象
String s3=new String("hello");
String s4=new String("hello");

分析:对于s1和s2来说,属于直接赋值类型,产生字符串对象放入字符串常量池,s2将会直接从字符串常量池取出已有对象,则s1==s2。s3属于构造方法new一个新对象,需要在堆区开辟一个新的空间,其中value值保存的是字符数组的地址。
在这里插入图片描述
上述代码共产生三个对象,一个在常量池中,两个在堆上;产生了4个引用,其中s1和s2指向的是常量池中的对象,s3和s4分别指向的是堆中的对象。

3. 字符串常量池、字符串对象、内部的value引用、具体的字符数组之间的关系

  • 字符串常量池中保存的都是字符串对象;
  • 字符串对象内部的value引用是指向字符数组的引用;
    举例:
    假如将CSDN的博客内容相当于字符数组的内容;value引用保存了这块内容的地址;字符串对象相当于博客链接;CSDN相当于字符串常量池,保存了许多字符串对象,即链接!
    new出来的字符串对象中的value引用,只是一个名字,指向字符数组,不是实体!!!

4. 手动入池方法:intern方法

将手动创建的字符串对象置入常量池,并返回置入常量池之后的地址。
看如下的代码:

char[] ch={'a','b','c'};
String s1=new String(ch)String s2="abc";
System.out.println(s1==s2);

s1:通过new的方式产生的字符串仍然在堆中存储,不会置入常量池
s2:字符串常量产生后直接置入常量池
s1 != s2

char[] ch={'a','b','c'};
String s1=new String(ch);
s1.intern();
String s2="abc";
System.out.println(s1==s2);

此时,将堆上new出来的新对象通过intern()方式手动置入常量池,当“abc”出现时,常量池中已经包含,因此,s2直接返回常量池中存储的地址。
s1 == s2
在这里插入图片描述

String s2="abc";
char[] ch={'a','b','c'};
String s1=new String(ch);
s1.intern();
System.out.println(s1==s2);

此时,s2属于直接赋值法将产生的字符串对象直接放入字符串常量池中;
s1属于new出来的对象放置在堆区,s1.intern()方法执行后的返回值无人接收,s1依旧指向的是堆区的字符串对象的地址。
s1 != s2
在这里插入图片描述

补充介绍intern()方法
尝试将当前字符串对象置入常量池;
若常量池中不存在该对象内部保存的内容“abc”,则将当前对象置入常量池;
若常量池中已经存在该对象保存的内容,则该方法直接返回常量池中的字符串对象地址!
intern()方法调用后会返回常量池中的字符串地址,调用之后进行接收即可!

如果让s1去接收intern()方法的返回值,此时由于字符串常量池中包含字符串“abc“,因此直接返回常量池中的字符串对象地址,则s1==s2

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最新软件测试面试题【1000道题含答案】

1、自动化代码中,用到了哪些设计模式? 单例设计模式 工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化测…

非法收集儿童数据,微软与 2000w 美元和解

文章目录 🤨 非法收集儿童数据,微软与 2000w 美元和解📈 苹果股价和 Vision Pro 一样高涨👮‍♀️ 美国证监会狙击币安和其老板赵长鹏3️⃣ 红杉资本一拆为三😮 加息出乎意料!澳洲央行对抗通胀&#x1f91c…

硬核拆解 | 拓尔微65W 2C1A氮化镓多口快充

随着身边智能设备的增多,一个充电头对应一个设备,出门需要携带多个充电器已经成为日常,有时还会忘带匹配的充电头,无法充电造成困扰...... 多口快充的出现解决了这一难题,出门仅需携带一个充电头,减轻背包…

AI智慧安监平台EasyCVR新版本v3.3如何接入V1版智能分析网关硬件?

EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流…

VFP发送公众号模板消息

公众号模板消息向用户发送重要的服务通知,比如验证码,消费通知,比如时间提醒什么的。 调用代码很简单 *--发送模板消息TEXT TO msgJson NOSHOW TEXTMERGE {"touser":"oljsK6OgHA9ftJxuCUWg7cFylj6Y","template_id&…

Godot 4 源码分析 - Project Manager

简单来说,Godot 4一共有三种运行模式:工程管理、编辑、运行 有点意思的是,每次调试,只能在其中一种模式下运行 如果同时配置了编辑器与工程管理器,则会报错: if (editor && project_manager) {O…

uni-app uni-forms组件的表单验证

前言 最近使用uni-app开发时,在使用加强表单时,使用表单验证的过程和PC端的区别uni-app文档说如果要使用自定义表单验证是需要去掉form中:rules"rules",使用ref绑定但最终我使用validateFunction 自定义校验规则,使用上面2种方式都…

音质更进一步,更耐用的骨传导耳机,南卡Runner Pro 4S上手

骨传导耳机是一种非常适合户外使用的耳机,很多喜欢运动的朋友都会配备一副,户外健身的时候会一直戴着。这种耳机使用时不入耳,通过震动颧骨来传递声音,不影响我们和别人的正常交流,户外也可以清楚感知车流、鸣笛的声音…

专业小程序开发平台 教你如何开发点餐小程序

今天小编借助在线工具乔拓云,只需借助在线模板和无编程开发工具,轻松实现点餐小程序开发和管理,下面跟着小编的教程一起学习,如何使用乔拓云工具开发专属的外卖点餐订餐小程序平台。 像这样一个点餐外卖小程序只需一个模板无编程就…

Java多线程与并发-原理

1、synchronized 线程安全问题的主要诱因 存在共享数据(也称临界资源)。存在多条线程共同操作这些共享数据。 解决问题的根本方法: 同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再对共享数据进…

【编译、链接、装载八】链接

【编译和链接八】链接 一、链接的起源——链接器年龄比编译器长1、 机器指令时代2、汇编指令时代3、链接4、静态链接5、结合CPU指令分析链接 二、链接的接口——符号1、ELF符号表结构1.1、符号类型和绑定信息(st_info)1.2、符号所在段(st_shn…

图神经网络的基本结构

文章目录 图神经网络的基本结构图谱和图傅里叶变换基于频谱域的GNN和基于空间域的GNN的比较图神经网络的任务需求和模型要求任务需求模型要求 图神经网络的实用框架GCN图神经网络的几道面试题 图神经网络的基本结构 图神经网络 (Graph Neural Network, GNN) 是一类用于处理图数…

UI自动化测试的痛点有哪些?怎么解决

目录 前言 1、需求不稳定,频繁变更的项目 2、开发维护周期短的项目 3、被测系统开发不规范,可测试性需求不明确 总结: 前言 当我们找工作的时候查看招聘信息发现都需要有自动化测试经验,由此看来测试人员不会一点自动化测试技…

【已解决】无法启动此程序,因为计算机中丢失vcruntime140.dll(解决方案)

vcruntime140.dll是什么什么文件呢?为什么电脑在运行一些游戏的时候会出现丢失vcruntime140.dll,然后游戏运行失败?这个dll文件是电脑重要的运行库文件。丢失了会导致很多程序无法运行。下面将介绍【已解决】无法启动此程序,因为计算机中丢失vcruntime1…

AOP介绍

AOP的介绍AOP相关概念相关概念:细谈通知 Spring AOP使用准备工作前置通知具体实现环绕通知配置规则表达式解析 Spring AOP原理 AOP的介绍 AOP:AOP是一种思想;面向切面编程。它对某一类的事情做集中处理;更准确的说是面向集中功能的编程 Spri…

【Linux常用命令上】——Linux系统02

目录索引 快速复习导航:查看Linux的ip:查看当前用户:切换路径:退出当前文件夹:用户工作目录: 文件树:测试网路是否正常连接:清除指令:查看当前操作系统信息:s…

SpringBoot整合模板引擎Thymeleaf(3)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 概述 在本章节详细介绍Thymeleaf的内置对象及其工具类。 Thymeleaf内置对象 对象描述#ctx上下文对象#vars同 #ctx,表示上下文变量#locale上下文本地化&#…

Java集合中ArrayList、LinkedList异同(面试题)

为什么一般都使用 List list new ArrayList() ,而不用 ArrayList alist new ArrayList()呢? 1. 问题就在于List有多个实现类,如 LinkedList或者Vector等等, 现在你用的是ArrayList,也许哪一天你需要换成其它的实现类呢&#xf…

自定义异常

打开搜索界面,快捷键:双击shift键盘 如何创立一个自己定义简单的异常,如下: 1,先用extends继承Exception(总异常类)然后定义私有类变量 2,用快捷键;latinsert 选择构造器(Constru…