什么是Java字符串池?

时间:2020-02-23 14:34:43  来源:igfitidea点击:

顾名思义,java中的字符串池是存储在Java堆内存中的字符串池。
我们知道String是Java中的一个特殊类,我们可以使用新的运算符以及在双引号中提供值来创建String对象。

Java中的字符串池

字符串池之所以可能,是因为字符串在Java及其实现字符串内部化概念中是不可变的。
字符串池也是Flyweight设计模式的示例。

字符串池可以帮助节省Java Runtime的大量空间,尽管创建字符串需要花费更多时间。

当我们使用双引号创建一个String时,它将首先在String池中查找具有相同值的String,如果发现它只是返回引用,否则它将在池中创建一个新String,然后返回引用。

但是,使用new运算符,我们强制String类在堆空间中创建一个新的String对象。
我们可以使用" intern()"方法将其放入池中,或者从字符串池中引用另一个具有相同值的String对象。

这是字符串池镜像的Java程序:

package com.theitroad.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));
  }

}

上面程序的输出是:

s1 == s2 :true
s1 == s3 :false

在字符串池中创建了多少个字符串?

有时在Java面试中,系统会询问您有关字符串池的问题。
例如,在下面的语句中创建了多少个字符串;

String str = new String("Cat");

在上面的语句中,将创建1或者2个字符串。
如果池中已经有字符串文字" Cat",则池中将只创建一个字符串" str"。
如果池中没有字符串文字" Cat",则将首先在池中然后在堆空间中创建它,因此将总共创建2个字符串对象。