我对字符串池实际包含的内容感到有些困惑。
当我们说String s = "abc"
时,这是否意味着在编译期间,字符串对象被放入字符串池中,或者它是放置的引用?
答案 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堆的一部分(我们知道堆将包含对象)。