字符串常量池、堆、栈
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
字符串常量池、堆、栈相关推荐
- 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 ...
- 理解Java字符串常量池与intern()方法
理解Java字符串常量池与intern()方法 阅读目录 Java内存区域 两种创建方式在内存中的区别 解释开头的例子 intern()方法 参考资料 String s1 = "Hello& ...
- android p版本 字符串常量池,Android OOM 问题
1. java 虚拟机模型 image.png 2. 关于Android heapsize 的位置 取自android10-c2f2-release \frameworks\base\core\jni ...
- 面试进阶之字符串常量池
转载自 面试进阶之字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池 ...
- 1、如何进行字符串常量中的字符定位_Java String:字符串常量池,我相信会有很多朋友不很理解这部分...
作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字符串常量池的设计意图是什么? ...
- 字符串equal_Java String:字符串常量池
作者:Seven_Nee 来自:https://segmentfault.com/a/1190000009888357 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以 ...
- java字符串常量池——字符串==比较的一个误区
转自:https://blog.csdn.net/wxz980927155/article/details/81712342 起因 再一次js的json对象的比较中,发现相同内容的json对象使用== ...
- JVM——字符串常量池详解
关注微信公众号:CodingTechWork,一起学习进步. 引言 在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串.作为最常用也是 ...
- JVM学习-StringTable字符串常量池
StringTable 1.StringTable的特性 1.1.面试题 1.2.常量池与串池的关系 1.3.字符串的拼接 1.4.编译器优化 1.5.intern方法 1.5.1.intern方法( ...
- JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)
以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...
最新文章
- 学习笔记Spark(九)—— Spark MLlib应用(1)—— 机器学习简介、Spark MLlib简介
- tomcat 禁用access.log
- Chromium Android编译指南
- windows 系统监视器_使用Windows 7中的可靠性监视器对计算机问题进行故障排除
- 冷知识:摄影艺术与图像处理算法之间的纠葛关系你知道吗
- 总结与整理:Ubuntu系统下安装、配置Nginx及其他注意事项
- 机器学习与计算机视觉(计算机视觉的嵌入式平台)
- 逐句深扒 Apache 许可协议原文,一文看懂!
- Android开发学习之仿手机QQ消息列表侧滑删除效果
- Java面向对象-String类
- 2021最新一线互联网大厂常见高并发面试题解析
- win10开启ftp连接不上的正确解决方案
- Android怎么制作圆角矩形,如何在Android UI中绘制圆角矩形?
- Premature end of Content-Length delimited message body 报错原因
- 【成长访谈】周新林:靠持续的努力,总能换来自己期望的生活
- 比较全面的log4j配置
- solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现
- Java 和 MySQL 数据类型对照表
- MySQL入门:数据库是什么 | SQL是什么 | MySQL是什么
- PPC气箱脉冲除尘器
热门文章
- 解决Sublime Text 2中文显示乱码问题
- (js技巧)input文本框回车或者失去光标触发事件
- Android UI学习之ListView(使用BaseAdapter)
- Systrace分析app启动分析
- 深入解读Linux内存管理系列(6)——地址空间划分
- 用glew,glfw实现opengl-学习笔记3着色器
- mysql cluster 1186_配置Mysql Cluster时出错Unable to connect with connect string_MySQL
- 全国航空机场分布矢量数据/旅游景点poi/全国港口码头分布/地铁站分布/火车站分布/2020年POI矢量数据
- 统计单词个数 状态机方法
- matlab e52pt,matlab 神经网络的文字识别 有详细注释-补充样本