首页 > 其他分享 >详解:字符串常量池

详解:字符串常量池

时间:2024-11-08 21:16:23浏览次数:3  
标签:字面 对象 池中 String 详解 字符串 常量

        字符串常量池是Java运行时环境(JRE)的一部分,它用于存储字符串字面量。字符串字面量是源代码中直接用双引号括起来的字符串,例如"hello"。在Java中,字符串是不可变的,这意味着一旦创建了一个字符串对象,它的值就不能改变。

        当Java编译器遇到字符串字面量时,它会将这些字面量放入字符串常量池中。如果常量池中已经存在相同的字符串字面量,编译器会复用已有的字符串对象,而不是创建一个新的对象。这样做可以节省内存,并提高性能。

一、字符串常量池的工作原理

  1. 存储位置

    • 在Java 7及之前的版本中,字符串常量池位于方法区的永久代(PermGen)中。
    • 从Java 7开始,字符串常量池被移动到堆内存中。但需要注意的是,虽然常量池本身在堆中,但字符串对象的引用仍存储在字符串常量池中。
  2. 共享性

    • 字符串常量池是全局共享的,即在一个Java虚拟机中,所有类共享同一个字符串常量池。这意味着如果一个字符串对象已经存在于常量池中,它可以在多个类中共享,从而减少内存占用。
  3. 实现方式

    • 一种是直接使用字符串字面值创建字符串对象并存储在常量池中。
    • 另一种是使用String.intern()方法将字符串对象的引用添加到常量池中。如果常量池中已经存在相同的字符串,则直接返回其引用;如果不存在,则将当前字符串的引用添加到常量池中,并返回该引用。

二、字符串常量池的示例

示例1:

String s1 = "red";
String s2 = "red";
System.out.println(s1 == s2); // 输出true

        解释:s1和s2都是直接通过字符串字面量创建的,因此它们指向的是字符串常量池中的同一个字符串对象。

示例2

String s3 = new String("red");
String s4 = new String("red");
System.out.println(s3 == s4); // 输出false

        解释:s3和s4都是通过new关键字创建的,它们在堆中各自创建了一个新的字符串对象,因此s3和s4指向的是不同的对象。

示例3

String s5 = new String("hello");
String s6 = "hello";
String s7 = s5.intern();
System.out.println(s5==s6);//输出false
System.out.println(s6 == s7); // 输出true

        解释:s5是通过new关键字创建的,在堆中创建了一个新的字符串对象。由于s6是直接通过字符串字面量创建的,它指向的是字符串常量池中的字符串对象。因此,s5和s6不是同一个对象。注意:intern()方法返回的是该对象的字符串在常量池中的地址,s7的地址:s5对象的字符串在字符串常量池中的地址,因为和s6的字符串是"hello"说明s7和s6的字符串常量池的地址一样,也是同一个对象。

示例4:

String s8 = "1";
String s9 = "1";
String s10 = "1" + "1";
String s11 = s8 + s9;
String s12 = "11";
System.out.println(s10 == s11);//输出false
System.out.println(s10 == s12);//输出true

        解释:s10是通过两个“1”拼接而成的,这里s11字符串的连接操作通常是通过StringBuilder类来实现的,StringBuilder是一个可变的字符串构建器,它允许高效的字符串连接操作。append方法会将s8s9的值添加到StringBuilder对象中,然后toString方法会将StringBuilder对象转换为一个不可变的String对象(该对象是在堆中创建,对象的字符串字面量的引用指向字符串常量池中的“11”的地址)。s10是在字符串字面量创建的,s11是在堆中创建的,所以不是同一个对象。

图解:

示例5:

public class Person {
    public String name;
    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2 = new Person();
        person2.name="jack";
        person1.name="jack";
        System.out.println(person1.name== person2.name);//输出true
    }
}

结果为true

        字符串字面量(例如"jack")会被存储在字符串常量池中。当你在代码中创建字符串字面量时,JVM会首先检查字符串常量池中是否已经存在相同的字符串。如果存在,它会返回该字符串的引用;如果不存在,它会创建一个新的字符串并将其添加到字符串常量池中。

        person1.name = "jack";和person2.name = "jack";这两行代码都使用了相同的字符串字面量"jack"。由于字符串字面量会被存储在字符串常量池中,所以这两行代码实际上都引用了字符串常量池中的同一个字符串对象,所以返回true。

图解:

标签:字面,对象,池中,String,详解,字符串,常量
From: https://blog.csdn.net/2401_83418369/article/details/143580253

相关文章

  • Oracle OCP认证考试考点详解082系列15
    题记:本系列主要讲解OracleOCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。71.第71题:题目解析及答案:对于数据库,使用数据库配置助手(DBCA)可以执行以下哪两项任务?A.为新数据库配置非标准块大小。数据库配置助手(DBCA)可用于为新创建的数据库配置非标准块大小。在......
  • 前端入门一之JS对象、字符串对象、数组对象、Data()对象等
    前言JS是前端三件套之一,也是核心,本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点,这篇是JS常用的内置对象;这篇文章是本人大一学习前端的笔记;欢迎点赞+收藏+关注,本人将会持续更新。文章目录目录总览1、对象1.1、创建对象(object)利用字面量创建对象对象的调用变量......
  • 深度学习:循环神经网络(RNN)详解
    循环神经网络(RNN)详解**循环神经网络(RecurrentNeuralNetwork,RNN)**是一类能够处理序列数据的神经网络,其设计使得网络可以在每个时间步上保留先前时间步的信息。RNN通过在时间步之间共享参数,能够建模输入序列中元素的时序依赖关系。由于其递归结构,RNN在自然语言处理、语音......
  • Dubbo详解及其应用
    DubboDubbo是一个阿里巴巴开源的高性能JavaRPC框架,专为解决大规模微服务架构中的服务治理、服务发现、负载均衡和远程通信等问题而设计。它允许服务提供者将业务功能封装成服务,而服务消费者则可以像调用本地方法一样调用这些远程服务,从而实现服务的解耦和可扩展性。Dubbo......
  • 华为机试HJ29 字符串加解密
    首先看一下题描述对输入的字符串进行加解密,并输出。加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;其他字符不做变化。解密方法为加密的逆过程。......
  • 华为机试HJ30 字符串合并处理
    首先看一下题描述按照指定规则对输入的字符串进行处理。详细描述:第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串"dec"和字符串"fab",合并后生成的字符串为"decfab"第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从......
  • 【MySQL】数据库备份详解
    一、引言1.1数据库备份的重要性二、MySQL数据库备份的基础知识2.1备份类型2.2备份工具与方法三、MySQL数据库备份的实施步骤3.1环境准备3.2选择合适的备份工具与方法3.3执行备份3.4验证备份3.5存储与管理备份四、MySQL数据库恢复流......
  • CTF 网络安全大赛详解:挑战自我,提升技能的竞技场
    CTF 比赛形式:CTF 比赛内容:CTF 比赛的价值:如何参与 CTF 比赛:CTF(Capture The Flag)网络安全大赛,是一种流行的信息安全竞赛形式,旨在考察参赛者在信息安全领域的知识、技能和实战能力。CTF 比赛通常以团队形式进行,参赛者需要解决各种安全挑战,获取 flag(标志),并提交 fl......
  • ansible.cfg 配置参数详解
    #configfileforansible--https://ansible.com/#===============================================#nearlyallparameterscanbeoverriddeninansible-playbook#orwithcommandlineflags.ansiblewillreadANSIBLE_CONFIG,#ansible.cfginthecurrent......
  • 基于常量值提取浅析elf文件结构
    Elf(可执行和可链接文件)是一个永远也绕不开的话题,只要我们还在使用安卓手机/linux服务器,我们就需要了解elf的一些方方面面,现在就让我们从一个常量值提取的小需求出发,逐步解析elf文件结构吧! 一、写作目的:网络上关于elf文件结构描述的文章不在少数,但能具体到二进制分析的却屈指......