Java字符串常量池
JVM为了减少字符串对象的重复创建,维护了一个特殊的内存,这段内存被称为字符串常量池。
Java中字符串对象的创建有两种形式:一种是字面量形式,String str = "a";一种是标准的构造对象的方法,String str = new String("a");
这两种实现存在性能和内存占用的差别。
当以字面量形式创建对象的时候,JVM会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串的引用,则将这个引用返回
否则创建新的字符串对象,然后将这个引用放入字符串常量池,并返回该引用。
举例:
字面量创建
String str = "a";
JVM检测这个字面量,发现字符串常量池中没有这个内容为a的对象存在,那么会创建这个字符串对象,将这个引用放入到字符串常量池中,
并返回该引用。
String str2 = "a";
同样JVM会检测这个字面量,发现内容为a的字符串对象存在,然后将已经存在的字符串对象的引用返回给变量str2,而不会创建新的字符串对象。
验证str和str2是不是同一个对象
system.println.out(str == str2);
结果为true。
new创建
String str3 = new String("a");
String str4 = new String("a");
system.println.out(str3 == str4);
结果为false。
当我们使用了new来创建字符串对象时,不管字符串常量池中有没有相同内容的对象的引用,都会创建新的字符串对象。
前提条件
String对象是不可变的,这样才可以保证多个变量共享一个对象。如果一个操作会改变String对象的话,那么会同时改变其他变量的值,就不可以使用这种方法了。
那么字符串常量池中存放的是引用还是对象,答案是,字符串常量池中存放的是对象的引用,对象存放在堆内存中。
优点
减少了相同内容字符串的创建,节省了内存空间。
Java字符串常量池的更多相关文章
- Java字符串常量池是什么?为什么要有这种常量池?
简单介绍 Java中的字符串常量池(String Pool)是存储在Java堆内存中的字符串池.我们知道String是java中比较特殊的类,我们可以使用new运算符创建String对象,也可以用双引 ...
- Java字符串常量池及字符串判等解析
一.理解"=="的含义 "=="常用于两个对象的判等操作,在Java中,"=="主要有以下两种用法: 1.基础数据类型:比较的是他们的值是否 ...
- java字符串常量池——字符串==比较的一个误区
转自:https://blog.csdn.net/wxz980927155/article/details/81712342 起因 再一次js的json对象的比较中,发现相同内容的json对象使用 ...
- 关于java字符串常量池
今天发现一个好玩的东西 public static void main(String[] args) { String str1 = new StringBuilder(" ...
- 理解Java字符串常量池与intern()方法
String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo ...
- 看完肯定懂的 Java 字符串常量池指南
字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...
- [JAVA]字符串常量池String pool
字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定.不仅如此,还可以使用 String 的 intern() 方法在运行过程中将 ...
- java——字符串常量池、字符串函数以及static关键字的使用、数组的一些操作函数、math函数
字符串常量池: 字符串比较函数: 字符串常用方法: 字符串截取函数: 字符串截取函数: static关键字使用: 要调用类中的static类型的变量的时候,可以用"类名.变量名&quo ...
- 深入理解JAVA字符串常量池
初学JAVA时,在学习如何比较两个字符串是否相等,大量资料告诉我,不能用等于号( = )去比较,需要使用equals方法,理由是String是一个对象,等号此时比较的是两个字符串在java内存堆中的地 ...
随机推荐
- VS2013 预定义的宏
Visual Studio 2013 预定义的宏 https://msdn.microsoft.com/zh-cn/library/b0084kay(v=vs.120).aspx 列出预定义的 ANS ...
- 【Network】UDP 大包怎么发? MTU怎么设置?
这里主要用UDP来发送视频,当发送的数据大于1500时分包发送,保证每包小于1500.发送好办,分割后循环发就可以了,关键是接收时的处理.先做一下处理的方法 :发送时每包上面加上标识,比如RTP的做法 ...
- .Net全景视图
http://www.oneapm.com/ai/dotnet.html OneOneAPM 助您轻松锁定 .NET 应用性能瓶颈,通过强大的 Trace 记录逐层分析,直至锁定行级问题代码.以用户角 ...
- bootscript/javascript组件
javascript组件 (1)每一个插件(带有js功能的组件),想使用bootstrap插件,一个是要去写他的html,第二个是使用CSS去修饰它,再引入相应的js文件. bootstrap框架 ...
- Thinkphp5简单初体验
<?php namespace app\index\controller; use think\Controller; //引用think/Controller类 class Index ext ...
- PCM数据格式,多少字节算一帧
转自:http://blog.chinaunix.net/uid-9185047-id-3327302.html Somehow i remember that normally 2048 sampl ...
- Asp.net通过模板(.dot/Html)导出Word,同时导出图片
一.Office组件导出Word(服务器配置麻烦) 需要引用Office的DLL,在下文的附件中,不同的Offic版本用的不一样,虽然高级版本可以兼容低级的,不过,还是统一版本最好 贴上核心代码(转载 ...
- Hadoop学习笔记(1) 初识Hadoop
1. Hadoop提供了一个可靠的共享存储和分析系统.HDFS实现存储,而MapReduce实现分析处理,这两部分是Hadoop的核心. 2. MapReduce是一个批量查询处理器,并且它能够在合理 ...
- http协议和浏览器缓存问题
HTTP是超文本传输协议. HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.HTTP是一个无状态的协议.
- python 线程之 threading(二)
在http://www.cnblogs.com/someoneHan/p/6204640.html 线程一中对threading线程的开启调用做了简单的介绍 1 在线程开始之后,线程开始独立的运行直到 ...