Java字符串常量池是什么?为什么要有这种常量池?
简单介绍
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、为了让数据不冲突进行共享等