String str = “a” + “b” + “c"到底创建了几个对象?这是我们在讨论中最经常遇到的一个问题同时也是面试题。我们都知道在Java中从”.java"文件编译成".class"文件的过程,会有一个优化器去优化我们的代码。这个问题需要分成三种情况去考虑,下面我们就来分析这三种情况!!

前言
在JVM(JDK8)的内存结构中有一块区域叫作字符串常量池,这块区域存储了两样东西,分别是“字面量”和“符号引用”。字面量也就是一串字,例如String str = “abc” 这里的"abc"就是字面量。符号引用是用于定位引用指向的问题。(JDK8完完全全把字符串常量池从方法区搬到堆中了)

一、第一种情况(常量相加)

String str = “a” + “b” + "c

因为这种情况是常量之间相加,经过编译器优化成了String str = “abc”,所以答案是创建了一个对象。“a”、“b”、"c"这些都是常量,因为它们是final修饰放在字符串常量池中的对象(注意:字面量也是对象)

我们通过javac编译,然后反编译后的结果和内存分配情况如下

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.soft.wesker;public class Test {public Test() {}public static void main(String[] var0) {String var1 = "abc";}
}


二、第二种情况(变量相加)

String a = “a”;
String b = “b”;
String c = “c”;
String str = a + b + c;

因为这种情况是变量之间相加,已经不是之前的常量相加了,经过编译器优化成了StringBuilder,所以答案是创建了三个对象。new StringBuilder()、new String()、“abc”,因为最终会通过StringBuilder()里面的toString()方法进行new String(“abc”)类型转换。

我们通过javac编译,然后反编译后的结果和内存分配情况如下

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.soft.wesker;public class Test {public Test() {}public static void main(String[] var0) {String var1 = "a";String var2 = "b";String var3 = "c";(new StringBuilder()).append(var1).append(var2).append(var3).toString();}
}


三、第三种情况(无优化)

String str = “a” + “b” + "c

如果不考虑优化的情况下,这一共是创建了5个对象的,因为一个双引号就是一个字面量(对象),这里创建了5个对象,分别是"a"、“b”、“c”、“ab”、“abc”。

下面是内存分配情况

总结
在没有明确的题目的情况下,我们讨论这个问题,有时候没有正确的答案,大家的想法和说法都不一样,需要分情况去讨论,这是一个争议题,比如还有人把char[]或者byte[]也算进去了。
最后我们还需要考虑一个问题,在创建字面量的时候,JVM会先从字符串常量池中寻找是否已经存在,如果已经存在则直接返回引用,不存在就会先创建一个字面量,然后再返回引用。所以就会出现创建了0个对象的问题

【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?相关推荐

  1. String s=a+b+c,到底创建了几个对象?

    首先看一下这道常见的面试题,下面代码中,会创建几个字符串对象? String s="a"+"b"+"c"; 如果你比较一下Java源代码和反 ...

  2. JAVA怎么创建对象组_java – 如何根据特定字段创建一组有序的对象?

    我需要根据排序字段检索排序的对象列表;它们的集合类型是SortedSet,但代码抛出异常. 我还尝试添加@Sort注释,如 hibernate documentation的排序集合部分所述,但它似乎已 ...

  3. 深入理解String.intern

    在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本 ...

  4. 深入理解String、StringBuffer和StringBuilder

    1.String类的特性 public final class Stringimplements java.io.Serializable, Comparable<String>, Cha ...

  5. 搞定Java中的string类

    Copyright©Stonee String类在日常的编程工作中所用甚多,这里就string的常用方法和面试题做些记录和说明 1. 概述 看这么一行代码:String str = "abc ...

  6. Java 中的 String、StringBuilder、StringBuffer 的区别

    目录 一.是什么? 二.区别是? 1. 运行速度(执行速度) 2. 线程安全 三.小结 四.加餐 一.是什么? String 不可变字符序列 String 是字符串常量,其对象一旦创建之后该对象是不可 ...

  7. String s = new String(123) 究竟创建了几个对象

    分享一波:程序员赚外快-必看的巅峰干货 前言 今天上班划水的过程中有人询问到这个问题,网上对于这个问题也有争议,有说创建了一个对象,有说两个,有说三个. 首先说三个的肯定是扯淡了,今天来讨论一下这条语 ...

  8. 工作10年后,再看String s = new String(xyz) 创建了几个对象?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:艾小仙 这个问题相信每个学习java的同学都不陌生, ...

  9. Java基础提升篇:理解String 及 String.intern() 在实际中的应用

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...

最新文章

  1. BM提供支持云的量子计算平台,以加速创新
  2. 如何创建一个数据科学项目?
  3. python3.6.5无法安装-Python3.6无法安装numpy,如何解决?
  4. 几种作图软件使用感言
  5. Java实例开发教程:SpringBoot开发案例
  6. Cloud for Customer UI designer模型里编写的script运行时是如何执行的
  7. 红旗河最早设计计算机的目的,论红旗河的利弊及其替代方案
  8. Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取
  9. Linux主机通过直连线直连,【IT基础】网线的直连线与交叉线之间的区别
  10. spark算子_Spark 性能优化(四)——程序开发调优
  11. win7下手动配置apache+ php + mysql 记
  12. 【我的OpenGL学习进阶之旅】Assimp库支持哪些3D模型格式?
  13. linux下的几种文本去重方法
  14. macOS Big Sur 11.6.5 (20G527) Boot ISO 原版可引导镜像
  15. java获取上周一_java如何得到上周一和上周日的日期
  16. 对称矩阵特征向量正交推导
  17. Android Push哪家强——分析豌豆荚1400个APP
  18. 微信分享内容给朋友、朋友圈、QQ、QQ空间等
  19. 小米4c怎么添加语言怎么设置在哪,小米4c路由器设置教程
  20. day1-python基础1

热门文章

  1. haarcascades---各种分类器xml文件下载地址
  2. [转载] Java——数组习题
  3. [转载] JVM中对象的回收过程
  4. java中get接口示例_Java即时类| 带示例的get()方法
  5. Java RandomAccessFile getFilePointer()方法与示例
  6. 武汉市江岸区2021年高考成绩查询,2021年武汉各区一、二、三批次高中有哪些(名单)...
  7. Java ObjectStreamClass getSerialVersionUID()方法(带示例)
  8. jQuery.html()方法ie下不能设置html代码的问题
  9. Oracle备份还原
  10. android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item