【发布时间】:2015-10-01 10:55:26
【问题描述】:
我正在通过SCJP考试,发现一本书中有一行。
String s = new String("abc");
上面写着,将在上面一行创建两个对象。一个在HEAP,一个在STRING POOL。
我对那里的声明不满意。有人可以让我理解为什么要创建两个对象吗?
提前致谢。
【问题讨论】:
-
如果你只想要一个对象:
String s = "abc" -
这个问题很奇怪。可以在类加载期间创建实习字符串以及大量其他对象(即使您不执行此行,您也会有这个
"abc"实习)。但是,如果它之前已经被实习过(例如,您在另一个名为abc的类中有一个方法),那么在加载此类时不会创建它。然而,在给定行的执行 时,只创建了一个新对象:新的String实例。另请注意,这些天,interned 字符串池也位于堆中。 -
我同意在类加载或编译时将在字符串池中创建实习字符串,但是在编译时或在字符串池中加载类时创建的那个东西被称为一个单独的对象?
-
作者不正确。文字的字符串对象不是“在上面的行”创建的。它是在编译和类加载期间创建的。您永远无法执行该行,它仍然会被创建。
标签: java string heap-memory string-pool