【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?
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“到底创建了几个对象?相关推荐
- String s=a+b+c,到底创建了几个对象?
首先看一下这道常见的面试题,下面代码中,会创建几个字符串对象? String s="a"+"b"+"c"; 如果你比较一下Java源代码和反 ...
- JAVA怎么创建对象组_java – 如何根据特定字段创建一组有序的对象?
我需要根据排序字段检索排序的对象列表;它们的集合类型是SortedSet,但代码抛出异常. 我还尝试添加@Sort注释,如 hibernate documentation的排序集合部分所述,但它似乎已 ...
- 深入理解String.intern
在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本 ...
- 深入理解String、StringBuffer和StringBuilder
1.String类的特性 public final class Stringimplements java.io.Serializable, Comparable<String>, Cha ...
- 搞定Java中的string类
Copyright©Stonee String类在日常的编程工作中所用甚多,这里就string的常用方法和面试题做些记录和说明 1. 概述 看这么一行代码:String str = "abc ...
- Java 中的 String、StringBuilder、StringBuffer 的区别
目录 一.是什么? 二.区别是? 1. 运行速度(执行速度) 2. 线程安全 三.小结 四.加餐 一.是什么? String 不可变字符序列 String 是字符串常量,其对象一旦创建之后该对象是不可 ...
- String s = new String(123) 究竟创建了几个对象
分享一波:程序员赚外快-必看的巅峰干货 前言 今天上班划水的过程中有人询问到这个问题,网上对于这个问题也有争议,有说创建了一个对象,有说两个,有说三个. 首先说三个的肯定是扯淡了,今天来讨论一下这条语 ...
- 工作10年后,再看String s = new String(xyz) 创建了几个对象?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:艾小仙 这个问题相信每个学习java的同学都不陌生, ...
- Java基础提升篇:理解String 及 String.intern() 在实际中的应用
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...
最新文章
- BM提供支持云的量子计算平台,以加速创新
- 如何创建一个数据科学项目?
- python3.6.5无法安装-Python3.6无法安装numpy,如何解决?
- 几种作图软件使用感言
- Java实例开发教程:SpringBoot开发案例
- Cloud for Customer UI designer模型里编写的script运行时是如何执行的
- 红旗河最早设计计算机的目的,论红旗河的利弊及其替代方案
- Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取
- Linux主机通过直连线直连,【IT基础】网线的直连线与交叉线之间的区别
- spark算子_Spark 性能优化(四)——程序开发调优
- win7下手动配置apache+ php + mysql 记
- 【我的OpenGL学习进阶之旅】Assimp库支持哪些3D模型格式?
- linux下的几种文本去重方法
- macOS Big Sur 11.6.5 (20G527) Boot ISO 原版可引导镜像
- java获取上周一_java如何得到上周一和上周日的日期
- 对称矩阵特征向量正交推导
- Android Push哪家强——分析豌豆荚1400个APP
- 微信分享内容给朋友、朋友圈、QQ、QQ空间等
- 小米4c怎么添加语言怎么设置在哪,小米4c路由器设置教程
- day1-python基础1
热门文章
- haarcascades---各种分类器xml文件下载地址
- [转载] Java——数组习题
- [转载] JVM中对象的回收过程
- java中get接口示例_Java即时类| 带示例的get()方法
- Java RandomAccessFile getFilePointer()方法与示例
- 武汉市江岸区2021年高考成绩查询,2021年武汉各区一、二、三批次高中有哪些(名单)...
- Java ObjectStreamClass getSerialVersionUID()方法(带示例)
- jQuery.html()方法ie下不能设置html代码的问题
- Oracle备份还原
- android.support.v7 fragme,打造最强RecyclerView侧滑菜单,长按拖拽Item,滑动删除Item