关于String对象的值存在哪了

【c#】变量的作用域 1.全局变量 全局变量定义在函数外,用static修饰 class Program {     static string myString;     static void Main(string[] args)     {     } } 2.循环中变量的作用域     class Program 阅读详情

       String是一个Final类, 一旦赋值之后,就不能再修改了, 但平时编码时经常会遇到对String对象修改的情况, 那就只有一种解释:

                  平时对String的值的每次修改都是创建了一个新的String对象 ,并将引用指向了这个新的对象 .

       因为String的值永远不会变,那么多处引用如果存储同一个字符串就没有必要为这一个不会变的字符串分配多份存储空间,可以推测出, 所有同一个值的引用最终指向的都是一块存储空间. 查询JVM规范之后,证实了这一点:

        

  • Literal strings within the same class (§8 (Classes)) in the same package (§7 (Packages)) represent references to the same String object (§4.3.1).

  • Literal strings within different classes in the same package represent references to the same String object.

  • Literal strings within different classes in different packages likewise represent references to the same String object.

参考链接: Oracle官方文档JDK8   https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5

       String的值到底存在哪呢?  根据以上文档5.1章节, 可以知道应该是在运行时常量池中,运行时常量池属于方法区, JVM结构如下图:

                                

    方法区是由所有线程共享的数据区.下面用代码来验证一下这一点:

 public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String str1="abc";
        String str2="abc";
        String str3=new String("abc");
        System.out.println(str1==str2);
        System.out.println(str1==str3);

        Class str3Clazz=str3.getClass();
        Field field=str3Clazz.getDeclaredField("value");
        field.setAccessible(true);
        char[] str3Chars= (char[]) field.get(str3);
        str3Chars[0]='b';
        System.out.println(str1+" "+str2+" "+str3);

    }

此处的输出结果为:

true
false
bbc bbc bbc
 

用反射来验证的思路参考于:  https://blog.youkuaiyun.com/qq_36418435/article/details/81623756

性能调优基础篇之内存中大量重复String对象 String 为不可变对象, StringBuffer为可变对象。 阅读详情

相关推荐

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

激光雷达和相机联合标定(一)——ROS同步解包

qq_44703886的博客 4233

【经验总结】全局变量在循环中不能赋值的问题

全局变量在循环中不能赋值的问题by katana 全局变量在循环中不能赋值的问题 先来看一个例子: itest=0 echo -e "katana/nlear/nfracnis/nkatana/n"|while read sLine do  if [ "$sLine" == "katana" ] then  let itest=$itest+1

【 无线技术运营 】 (本专栏是http://wireless.qzone.qq.com的镜像) 1801

⭐⭐⭐全网最详细YOLOv8教程,从环境配置到自己训练,再到数据集的制作,包的各位⭐⭐⭐

问题原因:当你“pip install ultralytics” 时,torch和torchvision会作为它的依赖一起安装了,当执行“pip install torch torchvision torchaudio --index-url。”时,会卸载torch,然后再安装torch+cuda版本,但是不会自动卸载torchvision已有版本,然后再安装torchvision+cuda版本。🎉🎉🎉恭喜各位道友,已经可以训练模型了,现在就是制作自己的数据集,所谓申神通秘境,随心所欲,万物皆可识别也

weixin_74840239的博客 7491

C++ 中的 string 在内存中的位置

我们先不考虑 string 的实质是什么,先做一个实验。 执行如下代码: int _tmain(int argc, _TCHAR* argv[]) { string temp = "LYSM"; getchar(); return 0; } 调试查看 temp 的地址: 修改代码为: int _tmain(int argc, _TCHAR* argv[]) { string temp...

LYSM 4685

使用GitLab+Drone CI持续集成自动部署web项目,图文详细

kind: pipeline # 定义对象类型,还有secret和signature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: mall-tiny-drone # 定义流水线名称 steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: package # 流水线名称 image: maven:3-jdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库

4105

从想法到零件:手把手拆解一个汽车功能如何从PRD写到SSTS和CTS

本文详细拆解了汽车电子需求从市场文档(MRD)到零部件技术规范(CTS)的完整流程,以雨天自动关窗功能为例,展示了PRD、SSTS和CTS的编写要点与交互设计。文章重点解析了系统分解的艺术和零部件落地的精确参数要求,为汽车电子工程师提供了从概念到实现的全流程实践指南。

weixin_30300225的博客 480

String类

文章目录字符串常量池StringBuffer和StringBuilder 字符串常量池 字符串一经创建无法改变,字符串的内容都作为常量存在字符串常量池内,字符串常量池是堆内存中的一部分称为方法区,但方法区虽原则上是堆内存的一部分,在逻辑上却是对立的;JDK1.8版本开始,方法区的实现由永久代改为元空间 堆内存的简单划分: 新生代(刚创建好的对象存于此处,GC会频繁检查是否可以释放) 老年代(创建了一段时间满足某些条件的对象会被迁入老年代,GC的检查频率很低) 永久代(永久存在于内存中,比如static修

Aeroblaze的博客 339

用友U8接口开发全攻略:从EAI到OpenAPI的5种方式详解(附避坑指南)

本文深度解析了用友U8系统接口开发的五种核心方式:EAI、API、OpenAPI、SQL直连与内部CO组件。文章详细对比了各方式的适用场景、优缺点及实战操作,并提供了清晰的选型决策框架与避坑指南,帮助开发者根据具体业务需求选择最高效、最稳定的集成路径。

weixin_29322855的博客 680

String类之那些你不知道的知识点

  关于Java JDK中内置的一个类:java.lang.String我们需要了解的有以下几点: String表示字符串类型,属于引用数据类型,切记不属于基本数据类型; 在java中随便使用双引号 “” 括起来的都是String类型的对象。例如"abc"、“张三”、“HelloWorld”,这是三个String对象; java中规定,双引号括起来的字符串是不可变的,也就是说“abc”这个字符串自出生到死亡这个过程都是不可变的,不可能再变成“abcd”; 在JDK当中双引号括起来的字符串都是直接存储下 “

hpf_coding的博客 553

GPU 运维实战:H100/H800/B300 换卡与压测

(烧多久、看什么、什么算合格)。文末还给了一个能直接跑的验收判定脚本,三个真实场景的裁决输出都在。

老韩的Linux云计算架构师进阶之路 269

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

AI人人懂 927

String 与 包装类的静态创建对象的值被存在哪里

包装类的静态创建对象的值被存在哪里: public static void main(String[] args) { Integer ii = 12; Integer ii1 = 12; Integer bb1 = 128; Integer bb2 = 128; Integer ii2 = 12; Integer ii3 = new Integer(12); Integer ii4 = 2 + ii3; Integer ii5 =

qq_43079667的博客 151

39-Halcon-- fit_primitives_object_model_3d函数功能(从3D数据中提取几何基元)

Halcon算子fit_primitives_object_model_3d工业应用精要 该算子专为3D几何特征提取设计,支持平面、球体、圆柱等基元拟合。核心优势: 参数化输出:返回几何元素的数学参数(如平面方程、球心半径) 智能控制:通过max_dist、min_size等参数调节拟合精度 工业场景适配:针对薄壁件、孔系等提供专用优化方案 典型应用流程: 数据预处理(点云降噪/采样) 基元类型与参数设置 多阶段拟合(先平面后圆柱) 几何精度验证 误差控制在0.1%-1.2%范围内(视点云密度而定),适用于

weixin_45590420的博客 1161

Java中String的到底存在哪里???

这篇文章专门聊 Java 里 String 是怎么存的。我们会讲到堆和字符串常量池的区别,字面量和 new 出来的字符串在内存里的不同去处,还会顺带回答一个常见的面试问题:到底创建了几个对象?最后再看看 String.intern() 是怎么影响常量池的,让你对字符串的内存分配和优化有个清晰的认识。

2301_79742544的博客 638

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

String s = Null 与 s="" 有什么区别?null意思是不存在,""意思是存在,但是值为空 null表示还没new出对象,就是还没开辟空间 “”表示new除了对象,但是这个对象装的是空

null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s=""; string.trim()就不会抛,为什么? 答: NULL代表声明了一个空对象,根本就不是一个字符串。 ""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。 NULL代表声明了一个空对象,对

y_dzaichirou的博客 905

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java String对象不可变的学习

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。 区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = "ABCabc"; Syst.

dream_coke的博客 204

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【面试题】String创建对象

String创建对象面试题

weixin_44317179的博客 245

Kotlin中String的==相等比较符

Kotlin中String的==和equals()比较结果相同,都会比较字符串内容。示例代码展示了字符串常量比较都返回true,因为Kotlin/Java会复用字符串常量池中的相同对象。当创建字符串时,若池中已存在相同值则直接返回引用,否则新建对象并缓存。这种机制优化了内存使用,使得相同字符串常量的比较更高效。

Zhang Phil 617

JSONObject中取String 值的几种方法和对比

今天写代码的时候发现以前写JSON中取String值喜欢这样写: String kewen = (String)test.get("kewen"); 其实这样写比较挫,一般来说JSON对象中取String类型的值有这两种方法: test.getString("name"); test.optString("name"); 然后来看一下这两种方法有什么不同 public stat

江湖小虾米 1万+

通过反射改变String类的值

原文:https://www.jianshu.com/p/4d57ad5f8950 作者:Eric新之助前面有篇文章:为什么String被设计成不可变 很多人挺感兴趣的,...

JAVA葵花宝典 1250

JAVA中String类型的值为什么不能被修改。

首先,它和我们其他的引用类型一样,是一个被java封装好的方法。以便于在代码编写时处理数据。但是String类型比其他的引用类型更特殊,String这个类是使用final修饰的。这就意味着这个类不能被继承,同时类中的方法也不能被重写,并且String定义的值虽然没有看见final 但是依然是常量。

qq_57167753的博客 1386

String对象的intern()方法介绍

首先,我们先了解一下intern()方法的应用场景? String string1 = "zhangsan"; String string2 = string1.intern(); System.out.println(string1 == string2); 这个结果是打印出来一个true; 大家咋眼一看,是不是认为将string2的指针指向了string1的对象地址值?,其实不是...

第二颗大白菜 3382

String str = new String(“xyz“) 会创建几个对象

答案是 两个对象,要理解这个,就要知道string类的工作原理。下面来慢慢分析一下: public class StringTest { public static void main(String[] args){ String s1="Hello"; String s2="Hello"; String s3=new String("

andychen314的专栏 1万+

Java Integer和String内存存储

先看代码:void foo() { Integer i1 = 2; Integer i2 = 2; Integer i3 = new Integer(2); System.out.println("i1 = i2? " + (i1 == i2)); //true System.out.println("i1 = i3? " + (i1 == i3)); /

isunn的专栏 6126

【java基础】之String和new String()的区别

String s = "java基础",这种形式的赋值在java中被称之为直接量,它是存在于常量池中。 当我们程序启动后,程序会自动在JVM中开辟内存空间。当我们声明了这样一个字符串之后,JVM会首先常量池中查找这个值为“java基础”的对象。如果有,就把它赋给当前引用。 如果没有则在常量池中新建一个“java基础”对象。 而当我们用new String()时,就是在堆里面建立一个Strin

如切如磋,如琢如磨,臻于至善。 901

jsonobject中getkey_JSONObject中取String 值的几种方法和对比

今天写代码的时候发现以前写JSON中取String值喜欢这样写:String kewen = (String)test.get("kewen");其实这样写比较挫,一般来说JSON对象中取String类型的值有这两种方法:test.getString("name");test.optString("name");然后来看一下这两种方法有什么不同public static void main(Str...

weixin_31980019的博客 663
上一篇: idea配置tomcat,Loader delegate、Libraries、以及Dependencies
下一篇: java中的NIO是什么?
终极大叉哥
博客等级 码龄12年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值