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字符串常量池的更多相关文章

  1. Java字符串常量池是什么?为什么要有这种常量池?

    简单介绍 Java中的字符串常量池(String Pool)是存储在Java堆内存中的字符串池.我们知道String是java中比较特殊的类,我们可以使用new运算符创建String对象,也可以用双引 ...

  2. Java字符串常量池及字符串判等解析

    一.理解"=="的含义 "=="常用于两个对象的判等操作,在Java中,"=="主要有以下两种用法: 1.基础数据类型:比较的是他们的值是否 ...

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

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

  4. 关于java字符串常量池

    今天发现一个好玩的东西 public static void main(String[] args)    {        String str1 = new StringBuilder(" ...

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

    String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo ...

  6. 看完肯定懂的 Java 字符串常量池指南

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 背景说明 ...

  7. [JAVA]字符串常量池String pool

    字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定.不仅如此,还可以使用 String 的 intern() 方法在运行过程中将 ...

  8. java——字符串常量池、字符串函数以及static关键字的使用、数组的一些操作函数、math函数

    字符串常量池: 字符串比较函数:  字符串常用方法:  字符串截取函数: 字符串截取函数:  static关键字使用: 要调用类中的static类型的变量的时候,可以用"类名.变量名&quo ...

  9. 深入理解JAVA字符串常量池

    初学JAVA时,在学习如何比较两个字符串是否相等,大量资料告诉我,不能用等于号( = )去比较,需要使用equals方法,理由是String是一个对象,等号此时比较的是两个字符串在java内存堆中的地 ...

随机推荐

  1. redis部署

    下载软件 [root@localhost /]# wget http://download.redis.io/releases/redis-2.8.9.tar.gz 解压.编译.安装 [root@lo ...

  2. Python ORM Storm 源码修改

    安装 storm : pip install storm 目标:修改 Storm 源代码以支持自动重连文件:python安装目录/site-packages/storm/database.py 在41 ...

  3. 【转】Java读取matlab的.mat数据文件

    参考:Java读取mat文件 下载链接:ujmp  jmatio 下载完两个.jar文件之后,如何引用到java项目当中?项目名称->右键->Property->Java Build ...

  4. K closest points

    Find the K closest points to a target point in a 2D plane. class Point { public int x; public int y; ...

  5. Delete,Update与LEFT Join

    UPDATE:UPDATE A SET ApproverID=NULL FROM [SH_MaterialApplyBuyBill] A LEFT JOIN [SH_MaterialApplyBuyB ...

  6. OC编程之道-创建对象之原型模式

    一 什么是原型模式?(what) 有些对象的创建代价过大或过于复杂,要是可以重建相同的对象并作轻微的改动,事情会容易的多(效率变高).典型的例子是复制组合结构(eg树形结构),从零开始构建一个树型组合 ...

  7. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  8. java面试题及答案(转载)

    JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...

  9. Yii 动作过滤的方法

    protected function _init() { } public function beforeAction($action) { //黑名单 $blackList = array('tes ...

  10. Swift - 生成随机颜色(Extension UIColor)

    在开发中,我们有时需要生成一些随机的颜色.但 UIColor 没有提供方法或属性来直接获取随机颜色,这里对其进行扩展,方便使用. 1,扩展UIColor,增加随机颜色属性 1 2 3 4 5 6 7 ...