String s = a+b+c+d+e;创建了几个对象的详细分析?

String s="a"+"b"+"c"+"e" 总共创建了几个对象? 问:String s="a"+"b"+"c"+"e" 总共创建了几个对象 ? 答案:1个   当我看到这个问题的时候,我的答案是错的,当我查阅资料后最终确认答案是1个。然后经过了大量的测试,最终答案是1个对象。 测试:    String s1="a"; String s2=s1+"b"; String s3="a"+"b"; System.out.println(s2=="ab"); S 阅读详情

最近看到许多类似的帖子,大致意思如下:

问题1: String s = "a" + "b" + "c" + "d" + "e";
问此语句共创建了几个对象,

答案是
就创建了一个
String s = "a" + "b" + "c" + "d" + "e";
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接讲它们连接的结果提取出来变成了"abcde"
该语句在class文件中就相当于String s = "abcde"
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个


问题2:但是如果改成 String s = a+b+c+d+e;
呢 又是几个了。

就是说上面是一个是因为 "a"、"b"、"c"、"d"、"e"都是常量
但如果是变量呢?



我的答案是3个对象,但只有一个String对象:

由于编译器的优化,最终代码为通过StringBuilder完成:
  1. StringBuilder builder = new StringBuilder(); 
  2. builder.append(a); 
  3. builder.append(b); 
  4. builder.append(c); 
  5. builder.append(d); 
  6. builder.append(e); 
  7. String s = builder.toString(); 


我们先看看StringBuilder的构造器
  1.     public StringBuilder() {
  2.      super(16);
  3.     }
看下去
  1.     AbstractStringBuilder(int capacity) {
  2.         value = new char[capacity];
  3.     }
可见,分配了一个16自己长度的char数组

我们看看append的整个过程(注意,源代码我从各个类进行了整合,他们实际上不在一个类里面的)

  1.   public StringBuilder append(String str) {
  2.     super.append(str);
  3.     return this;
  4.   }

  5.   public AbstractStringBuilder append(String str) {
  6.     if (str == null)
  7.       str = "null";
  8.     int len = str.length();
  9.     if (len == 0)
  10.       return this;
  11.     int newCount = count + len;
  12.     if (newCount > value.length)
  13.       expandCapacity(newCount);
  14.     str.getChars(0, len, value, count);
  15.     count = newCount;
  16.     return this;
  17.   }

  18.   public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
  19.     if (srcBegin < 0) {
  20.       throw new StringIndexOutOfBoundsException(srcBegin);
  21.     }
  22.     if (srcEnd > count) {
  23.       throw new StringIndexOutOfBoundsException(srcEnd);
  24.     }
  25.     if (srcBegin > srcEnd) {
  26.       throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
  27.     }
  28.     System
  29.         .arraycopy(value, offset + srcBegin, dst, dstBegin, srcEnd - srcBegin);
  30.   }
可见,我们的代码不会超过16个,所以不会出现扩展value的情况。
而append里面使用了arraycopy的复制方式,也没有产生新的对象。

最后,我们再看StringBuilder的 toString()方法:
  1. public String toString() {
  2.     // Create a copy, don't share the array
  3.     return new String(value, 0, count);
  4.   }
这里通过前面的数组生成了一个新的String。



大家注意那个默认的16容量,如果题目出现了总长度超过16,则会出现如下的再次分配的情况
  1.   void expandCapacity(int minimumCapacity) {
  2.     int newCapacity = (value.length + 1) * 2;
  3.     if (newCapacity < 0) {
  4.       newCapacity = Integer.MAX_VALUE;
  5.     } else if (minimumCapacity > newCapacity) {
  6.       newCapacity = minimumCapacity;
  7.     }
  8.     value = Arrays.copyOf(value, newCapacity);
  9.   }

  10.   public static char[] copyOf(char[] original, int newLength) {
  11.     char[] copy = new char[newLength];
  12.     System
  13.         .arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
  14.     return copy;
  15.   }
可见,expand容量时,增加为当前(长度+1)*2。
注意这里用了Arrays的方法,注意不是前面的 System.arraycopy方法哦。这里产生了一个新的
copy的char数组,长度为新的长度


总结:三个对象分别为
1 StringBuilder
2 new char[capacity]
3 new String(value,0,count);

如果说String对象,则为1个。


【RS】哨兵系列数据下载(哨兵2号Sentinel-2波段介绍、下载) 以哨兵二号为示例,分享如何下载欧空局的哨兵系列数据 阅读详情

相关推荐

Mind+掌控板实战:5分钟搞定Easy IoT的MQTT通讯(附完整代码)

本文详细介绍了如何利用掌控板和Mind+图形化编程软件,快速实现基于Easy IoT平台的MQTT通讯。通过清晰的步骤讲解和完整的代码示例,指导用户完成从云端配置、Wi-Fi连接到MQTT消息发布与订阅的全过程,帮助初学者轻松构建物联网设备间的双向对话系统。

weixin_29300241的博客 450

String s = “a“+“b“创建了什么对象

首先是面试里被问过一万多遍的问题 publicstaticvoidmain(String[]args){ Stringa="a"; Stringb="b"; Stringab=a+b; } 这段代码里创建了多少个对象 答案是两个 a和b都在常量池里,不会创建对象 那么问题来了 创建的对象是什么 在编译后的字节码文件里,能看到是 NEW java/lang/StringBuilder 并调用了StringBuilder的构造方法, 然后在使用append来拼接a和b 最后将ab的引用指向这个Str

武陵人 1001

SVA学习笔记(1)——property基本语法及巧用define与property

巧用define与property,让代码更加灵活

craftsman2018ship的博客 1574

String str = "a"+"b"+"c"+"d";一共创建了几个对象?

前一段时间我参加了我们学校的招聘会,然后有个面试人员就问了我String str = "a"+"b"+"c"+"d"共创建了几个对象。平时我知道String类型的字符串可以叠加,但这个底层原理却有些模糊。当时就想这是字符串的叠加啊,肯定只创建了一个对象。信心满满的回答了一个对象,结果面试官说肯定不止一个。我回来就百度了,结果百度的答案分两种,一种创建了7个对象,一个创建了一个对象,而且理由都很充分

findblackhorse的博客 1万+

腾讯混元3D世界模型2.0实战:从AI生成到Unity/UE引擎集成全指南

生成式AI正在重塑3D内容创作流程,其核心原理是通过大语言模型理解自然语言描述,并驱动多阶段生成流水线自动创建3D资产与场景。这项技术为游戏开发、虚拟仿真和数字孪生领域带来了革命性的效率提升,能够将传统需要数周的美术协作流程压缩至几分钟。在实际应用中,开发者需要掌握本地环境部署、模型推理优化以及生成资产与主流游戏引擎的集成工作流。本文以腾讯开源的混元3D世界模型为例,详细解析如何将AI生成的场景通过插件高效导入Unity和Unreal Engine,并针对光照烘焙、材质调整、性能优化等工程实践问题提供解决方

cnracht8153的博客 1396

达梦数据库(DM)的备份与恢复功能

本文系统介绍了达梦数据库(DM)的备份与恢复功能,主要包括作业系统和物理/逻辑备份还原两大模块。作业系统部分详细说明了通过代理环境创建定时备份和删除备份作业的步骤;物理备份还原部分阐述了联机和脱机备份方式,包括数据库、表空间、表和归档的备份还原操作;逻辑备份还原部分介绍了dexp/dimp工具的使用方法及四种级别的导入导出功能。文章还介绍了图形化管理工具进行备份还原的操作流程,全面覆盖了达梦数据库的数据保护方案,为数据库管理员提供了详细的技术指导。

weixin_48812832的博客 1212

字符串(String)的相加 +

1、对象(String str=new String("a"))的相加与常量(String a="a")的相加,区别。 public static void main(String[] args) { testStr(); System.out.println("位置发生变化:"); testStr2(); } /** * 1 */ ..

weixin_45938948的博客 309

行列式详解:从定义到应用

本文系统介绍了行列式的核心概念和应用。首先从二阶、三阶行列式入手,逐步扩展到n阶行列式的定义,讲解了余子式和代数余子式的概念。其次,详细阐述了行列式的重要性质,包括转置不变性、行列交换变号等基本性质以及乘积性质等推论。在计算方法方面,介绍了按行展开法、化上三角矩阵法等实用技巧,并列举了特殊行列式的计算案例。最后重点讨论了行列式在克拉默法则、矩阵可逆性判断、几何体积计算及线性相关性判断等领域的应用。文章强调理解行列式的几何意义和灵活运用性质的重要性,并给出了学习建议和常见误区提示。行列式作为连接代数与几何的桥

aichitang2024的博客 3036

String详解,创建多少对象问题

String详解,创建多少对象问题。

jpkopkop的博客 3013

发那科机器人karel程序

备份和查看发那科机器人中的 Karel 程序的过程主要包括从示教器中备份程序,并通过 RoboGuide 等仿真软件查看和运行程序。步骤相对简单,但需要确保你的设备和软件已经设置好,可以通过 FTP 或直接从示教器的外部存储设备进行操作。如果你在操作过程中遇到问题,建议查阅相关的用户手册或联系发那科的技术支持,确保设备设置正确。如果你有更具体的问题或需要进一步帮助,欢迎继续提问!希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1603

从零开始学Agent的搭建——多角色项目需求分析框架实战

场景一:电商促销需求——技术细节顾此失彼团队用单Agent分析一个"双11秒杀系统"的需求。Agent输出了完整的功能清单,但当我们拿着这份方案找架构师评审时,发现了致命问题:Agent完全没有考虑库存扣减的并发一致性、Redis与MySQL之间的数据同步延迟、以及超卖风险的控制策略。原因是单Agent在处理"业务理解"任务时,已经耗尽了它的"注意力预算",技术深度分析几乎为空。场景二:ERP集成需求——跨系统边界模糊。

软件行业技术文化交流。 536

String s = "a"+"b"+"c"+"d"共创建了多少个对象?

String s1 = "a"; String s2 = s1+"b"; String s3 = "a"+"b"; System.out.println(s2=="ab"); System.out.println(s3=="ab"); 输出结果为false和true,说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉加

hao901017的专栏 1304

Eclipse邂逅Deepseek:本地化部署全攻略

通过前面一系列的步骤,我们成功地在 Eclipse 中完成了 Deepseek 的本地化部署,并且对部署后的功能进行了测试和优化,还解决了可能遇到的一些常见问题。这一过程不仅让我们体验到了将强大的大语言模型与高效的开发环境相结合的魅力,也为我们在软件开发过程中带来了诸多便利。本地化部署 Deepseek 到 Eclipse,使得我们在代码编写过程中能够获得智能的代码补全和精准的问答支持,大大提高了开发效率。同时,本地化部署保障了数据的安全性和隐私性,避免了数据在传输过程中可能面临的风险。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4522

String s a+b+c+d+e 创建了几个对象的详细分析

String s a+b+c+d+e 创建了几个对象的详细分析

qq_43685277的博客 1412

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

下面这条语句一共创建了多少个对象:String s=“a“+“b“+“c“+“d“;

作者:老紫竹 最近看到许多类似的帖子,大致意思如下: 问题1: String s = “a” + “b” + “c” + “d” + “e”; 问此语句共创建了几个对象? 答:就创建了一个 解析:String s = “a” + “b” + “c” + “d” + “e”; 赋值符号右边的&amp;quot;a&amp;quot;、“b”、“c”、“d”、“e&amp;quot;都是常量 对于常量,编译时就直接存储它们的字面值而不是它们的引用 在编译时就直接将它...

Xxacker的博客 8694

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

new String(“abc“) 创建了几个对象?

本文分析了以下3个问题: new String("abc") 创建对象数量问题。 String对象在什么情况下会复用。 String对象,在什么情况下会复用常量池中String的value对象。

qq_25775675的博客 2263

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IBM Java面试题,String s = "a" + "b" + "c" + "d" + "e"; 问此语句共创建了几个对象

关键字: 以下都转自http://www.java2000.net 1个。 编译器编译的时候就处理为"abcde"了 。 就创建了一个 String s = "a" + "b" + "c" + "d" + "e"; 赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量 对于常量,编译时就直接存储它们的字面值而不是它们的引用 在编译时就直接讲它们连接的结果提取出来变成了"abcde"

lhy55040817的专栏 2223

这条语句一共创建了多少个对象 String s = "a"+"b"+"c"+"d";

javac 编译可以对 字符串常量直接相加的表达式进行优化, 不必要等到运行期去进行加法运算处理, 而是在编 译时去掉其中的加号, 直接将其编译成一个这些常量相连的结果。 题目中的第一行代码被编译器在编译时优化后, 相当于直接定义了一个”abcd”的字符串, 所以, 上面的代码应该只创建了一个 String 对象。

必以璀璨惊世人 3063

String类创建对象、String方式创建对象个数问题

String类创建对象的方式、String类的内存分配图、关于两种创建String方式创建几个对象的问题、String类和数组有关参数类型的影响、equals相等问题、StringBuffer类不能重写equals方法

m0_54435916的博客 1079

String s=new String("abc")创建了几个对象?

我们首先来看一段代码: String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。 我们可以把上面这行代码分成String str、=、"abc"和new S...

phantomes的专栏 220
上一篇: 每日IN语(2009-01-01)
下一篇: 白话Java里面的传值和传引用
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 22
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值