String a="a"+"b"+"c" 创建了几个对象


这个问题涉及到了字符串常量池字符串拼接

String a="a"+"b"+"c"

通过编译器优化后,得到的效果是

String a="abc"

Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";

另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");

这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而这两种实现其实存在着一些性能和内存占用的差别。这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池

当我们使用了new来构造字符串对象的时候,不管字符串常量池中有没有相同内容的对象,新的字符串对象都会创建(在堆中)。

:存放所有new出来的对象;

存放基本类型的变量数据和对象的应用,对象(new出来的对象)本身并不存在栈中,而是存放在堆中或者常量池中(字符串常量对象存放在常量池中);

常量池:存放基本类型常量和字符串常量。

对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会自动消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

而对于字符串来说,其对象的引用都是存储在栈中的,如果是编译期已经创建好(即指用双引号定义的)的就存储在常量池中,如果是运行期(new出来的对象)则存储在堆中。对于equals相等的字符串,在常量池中是只有一份的,在堆中则有多份。

两个深入阅读的链接
 字符串常量池: http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/
 字符串拼接内部实现:http://droidyue.com/blog/2014/08/30/java-details-string-concatenation/

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1733249

字符串常量池、堆、栈相关推荐

  1. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  2. 理解Java字符串常量池与intern()方法

    理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...

  3. android p版本 字符串常量池,Android OOM 问题

    1. java 虚拟机模型 image.png 2. 关于Android heapsize 的位置 取自android10-c2f2-release \frameworks\base\core\jni ...

  4. 面试进阶之字符串常量池

    转载自  面试进阶之字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池 ...

  5. 1、如何进行字符串常量中的字符定位_Java String:字符串常量池,我相信会有很多朋友不很理解这部分...

    作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字符串常量池的设计意图是什么? ...

  6. 字符串equal_Java String:字符串常量池

    作者:Seven_Nee 来自:https://segmentfault.com/a/1190000009888357 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以 ...

  7. java字符串常量池——字符串==比较的一个误区

    转自:https://blog.csdn.net/wxz980927155/article/details/81712342 起因 再一次js的json对象的比较中,发现相同内容的json对象使用== ...

  8. JVM——字符串常量池详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串.作为最常用也是 ...

  9. JVM学习-StringTable字符串常量池

    StringTable 1.StringTable的特性 1.1.面试题 1.2.常量池与串池的关系 1.3.字符串的拼接 1.4.编译器优化 1.5.intern方法 1.5.1.intern方法( ...

  10. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)

    以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...

最新文章

  1. 学习笔记Spark(九)—— Spark MLlib应用(1)—— 机器学习简介、Spark MLlib简介
  2. tomcat 禁用access.log
  3. Chromium Android编译指南
  4. windows 系统监视器_使用Windows 7中的可靠性监视器对计算机问题进行故障排除
  5. 冷知识:摄影艺术与图像处理算法之间的纠葛关系你知道吗
  6. 总结与整理:Ubuntu系统下安装、配置Nginx及其他注意事项
  7. 机器学习与计算机视觉(计算机视觉的嵌入式平台)
  8. 逐句深扒 Apache 许可协议原文,一文看懂!
  9. Android开发学习之仿手机QQ消息列表侧滑删除效果
  10. Java面向对象-String类
  11. 2021最新一线互联网大厂常见高并发面试题解析
  12. win10开启ftp连接不上的正确解决方案
  13. Android怎么制作圆角矩形,如何在Android UI中绘制圆角矩形?
  14. Premature end of Content-Length delimited message body 报错原因
  15. 【成长访谈】周新林:靠持续的努力,总能换来自己期望的生活
  16. 比较全面的log4j配置
  17. solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现
  18. Java 和 MySQL 数据类型对照表
  19. MySQL入门:数据库是什么 | SQL是什么 | MySQL是什么
  20. PPC气箱脉冲除尘器

热门文章

  1. 解决Sublime Text 2中文显示乱码问题
  2. (js技巧)input文本框回车或者失去光标触发事件
  3. Android UI学习之ListView(使用BaseAdapter)
  4. Systrace分析app启动分析
  5. 深入解读Linux内存管理系列(6)——地址空间划分
  6. 用glew,glfw实现opengl-学习笔记3着色器
  7. mysql cluster 1186_配置Mysql Cluster时出错Unable to connect with connect string_MySQL
  8. 全国航空机场分布矢量数据/旅游景点poi/全国港口码头分布/地铁站分布/火车站分布/2020年POI矢量数据
  9. 统计单词个数 状态机方法
  10. matlab e52pt,matlab 神经网络的文字识别 有详细注释-补充样本