字符串作为池中的对象或作为引用?

时间:2013-07-17 12:40:40

标签: java string

我对字符串池实际包含的内容感到有些困惑。

当我们说String s = "abc"时,这是否意味着在编译期间,字符串对象被放入字符串池中,或者它是放置的引用?

6 个答案:

答案 0 :(得分:1)

语句String s = "abc"会导致在abc字符串常量池中创建{{1}}(如果它尚不存在)。如果它存在,则返回引用。你可以在这里找到关于字符串常量池的好教程。

http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

答案 1 :(得分:1)

每次以这种方式创建String时,JVM都会检查此Object是否在String常量池中。如果是这样,将返回“池”实例的引用。如果没有,则初始化一个新实例并放入池中:

          ----------- String s = "Hello";
          |
          ٧
+-------------------+   
|      "Hello"      |
+-------------------+
        pool 

答案 2 :(得分:1)

字符串池只是字符串文字的缓存。每当我们将字符串文字分配给字符串引用时,将在字符串池中搜索文字,并将其分配给引用变量。 在String s="abc"中,JVM将在字符串池中搜索文字"abc",并将其引用引用变量s

                  ____________
          refers |           | 
String s ------->|   abc     |<---- String Pool 
                 |___________|       

答案 3 :(得分:0)

您正在谈论的池位于堆中,并且存在的所有引用都存在于堆栈(而非堆)中。创建字符串时String s = "abc";字符串文字“abc”放在字符串池中,除了使用new创建String对象的情况外,所有其他引用都将指向此文字(单独的内存空间分配在在这种情况下堆。)

答案 4 :(得分:0)

字符串池是指内存中定义字符串的位置。字符串池引用了要重用的常量。字符串池允许这种情况发生:

String a = "a" + "b";
String b = "ab";
if(a == b) {
System.out.println("this will print");
}

a == b将评估为true,因为编译器将String a和String b都视为等于“ab”,因此该字符串存储在String池中,String a和String b都指向此一个引用。

答案 5 :(得分:0)

“abc”在编译时定义,因此会自动实现。因此,此字符串对象将转到字符串实习池。如果那里已存在一个,那么将返回它的引用。字符串实习池是自Java 7以来的主java堆的一部分(我们知道堆将包含对象)。