这两个陈述之间有什么区别?
String s = "text";
String s = new String("text");
Run Code Online (Sandbox Code Playgroud) 看完SCJP Tip Line的作者Corey McGlone撰写关于javaranch网站的文章后,我感到很困惑.命名为Strings,Literally和SCJP Java 6程序员指南,由Kathy Sierra(javaranch的联合创始人)和Bert Bates撰写.
我将尝试引用Corey先生和Kathy Sierra女士引用的关于String Literal Pool的内容.
1.据Corey McGlone先生说:
String Literal Pool是指向String对象的引用的集合.
String s = "Hello"; (假设Heap上没有名为"Hello"的对象),将"Hello"在堆上创建一个String对象,并在String Literal Pool(Constant Table)中放置对该对象的引用
String a = new String("Bye");(假设Heap上没有名为"Bye" new的对象,操作符将强制JVM在堆上创建一个对象.
现在,"new"对于创建String及其引用的运算符的解释 在本文中有点令人困惑,所以我将文章本身的代码和解释放在下面.
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
System.out.println(one.equals(two));
System.out.println(one == two);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于关键字,我们实际上最终会遇到略微不同的行为."new."
在这种情况下,对两个String文字的引用仍然放在常量表(String Literal Pool)中,但是当你来到关键字时"new,"JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.
这是解释它的图表..

那么它是否意味着,String Literal Pool也有对这个Object的引用?
以下是Corey McGlone撰写文章的链接
http://www.javaranch.com/journal/200409/Journal200409.jsp#a1
2. …
在查看在线代码示例时,我有时会通过使用new运算符将String常量赋值给String对象.
例如:
String s;
...
s = new String("Hello World");
Run Code Online (Sandbox Code Playgroud)
当然,这与之相比
s = "Hello World";
Run Code Online (Sandbox Code Playgroud)
我不熟悉这种语法,也不知道目的或效果是什么.由于String常量通常存储在常量池中,然后以JVM处理String常量的任何表示形式存在,甚至还会在堆上分配任何内容?
据说substring String类中的方法会导致内存泄漏.这是真的吗?怎么样?有什么替代方案吗?
特别是在寻找答案,
在java中可能导致内存泄漏的所有其他事情是什么?这将有助于我在编码时保持谨慎.