2

原文地址

正如名字所示:Java中字符串池存储在堆内存中。我们知道java中String是一个特殊的类,我们可以通过new 操作符或者使用双引号“”创建一个String对象。

  1. Java里的字符串池
  2. 字符串池中创建了多少字符串对象?

Java里的字符串池

下面是一个图,清晰的解释了java堆内存怎么管理字符串池的。以及当我们使用不同的方式创建字符串时发生了什么。

String-Pool-Java1-450x249.png

字符串池是可行的,只是因为在Java中String是不可变类型的。而且它实现了字符串的interning 概念。
字符串池是享元设计模式的一个实例。

字符串池有助于为Java运行时节省了很多的内存空间,即使它使用了更多的时间。

当我们使用双引号创建字符串时,它首先在字符串池中寻找同样值的字符串,如果找到了就返回该引用。如果没找到,就在池中创建一个新的字符串并返回它的引用。

然而使用new操作符创建字符串时,我们强制String类在堆内存上创建一个新的String对象。我们可以使用intern() 方法将它放到String池中。或者指向字符串池中有相同值字符串对象的引用。

下面是java程序:

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));
    }

}

上面程序输入如下:

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

推荐阅读: Java String Class

字符串池中创建了几个String对象呢?

有时候在Java面试中,你可能被问到关于字符串池的问题,比如,下面的语句创建了几个string.

String str = new String("Cat");

在上面的语句中,1个或者2个string被创建了,如果字符串池中已经有’cat‘字符串了,就只创建一个String.如果字符串池中没有’cat‘字符串,首先在字符串池中创建一个字符串,然后在堆内存中创建一个字符串,所有总共有2个string对象被创建了。


philadelphia
17 声望4 粉丝

雪山千古冷,独照峨眉峰