简单介绍

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

Java中的字符串常量池

下图,清楚地解释了如何在Java堆内存中维护字符串常量池,以及当我们使用不同的方式创建字符串时在堆内存中如何存放。

之所以有字符串常量池,是因为String在Java中是不可变(immutable)的,它是String interning概念的实现。字符串常量池也是亨元模式(Flyweight)的实例。

字符串常量池有助于为Java运行时节省大量空间,虽然创建字符串时需要更多的时间。

当我们使用双引号创建一个字符串时,首先在字符串常量池中查找是否有相同值的字符串,如果发现则返回其引用,否则它会在池中创建一个新的字符串,然后返回新字符串的引用。

如果使用new运算符创建字符串,则会强制String类在堆空间中创建一个新的String对象。我们可以使用intern()方法将其放入字符串常量池或从字符串常量池中查找具有相同的值字符串对象并返回其引用

如下是上文图中有关字符串常量池的程序实现:

package com.journaldev.util;

public class StringPool {

    /**
* Java String Pool example
* @param args
*/
public static void main(String[] args) {
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat"); System.out.println("s1 == s2 :"+(s1==s2));
System.out.println("s1 == s3 :"+(s1==s3));
}
}

上述程序的输出是

有时在java面试中,你会被问到有关字符串常量池的问题。例如,在下面的语句中创建了多少个字符串对象:

String str = new String("Cat");  

在上面的语句中,可能创建1或2个字符串对象。如果池中已经有一个字符串“Cat”,那么池中只会创建一个字符串“str”。如果池中没有字符串字面量“Cat”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共2个字符串对象。

字符串常量池简单了解

字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为 了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池。如果字符串已经存在池中, 就返回池中的实例引用。如果字符串不在池中,就会实例化一个字符串并放到池中。Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突 进行共享。

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

1、存储在Java堆内存中的字符串池

2、为了让数据不冲突进行共享等

最新文章

  1. vs2015 附加到进程找不到w3wp.exe
  2. C#获取文件MD5字符串
  3. ListView的使用-模拟微博随便看看栏目【执行与优化】
  4. php socket获取数据类
  5. Java修改数组长度
  6. 一些实用的js高级技巧
  7. datatables完整的增删改查
  8. 转:玩转Google开源C++单元测试框架Google Test系列
  9. 关于asp:login控件和验证码的问题?(转)
  10. Microservice架构模
  11. SQL 连接(内连接,外连接)
  12. APP界面设计 大概总结
  13. 检索 COM 类工厂中 CLSID 为 {91493441-5A91-11CF-8700-00AA0060263B} 的组件失败
  14. 30. Spring Boot ActiveMQ
  15. TensorFlow学习笔记之--[tf.app.flags使用方法]
  16. Oracle EBS GL 会计科目报错 GL_ACCESS_SET_LEDGERS
  17. Django Rest Framework源码剖析(六)-----序列化(serializers)
  18. urljoin
  19. 如何获取显示器的EDID信息
  20. PL/SQL 程序

热门文章

  1. 初探angular
  2. ztree框架使用问题汇总
  3. JAVA 利用反射自定义数据层框架
  4. Apache-Maven 的安装及配置
  5. SpringSecurity 3.2入门(9)自定义权限控制代码实现
  6. 03.枚举和string以及int类型之间的转换
  7. [Linq To Sql]解决join时的Collation冲突
  8. cf1072B. Curiosity Has No Limits(枚举)
  9. CentOS 7 学习笔记
  10. 菜鸟学习Spring——SpringMVC注解版前台向后台传值的两种方式