有什么区别
String str = new String("abc");
和
String str = "abc";
看完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);
    }
}
在这种情况下,由于关键字,我们实际上最终会遇到略微不同的行为."new." 
在这种情况下,对两个String文字的引用仍然放在常量表(String Literal Pool)中,但是当你来到关键字时"new,"JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.
这是解释它的图表..

那么它是否意味着,String Literal Pool也有对这个Object的引用?
以下是Corey McGlone撰写文章的链接
http://www.javaranch.com/journal/200409/Journal200409.jsp#a1
2. …
我想知道如何在以下程序中分配内存:
public class MemoryClass {
    public static void main(final String[] args) {
        int i = 0;
        MemoryClass memoryClass = new MemoryClass();
        memoryClass.myMethod(memoryClass);
    }
    private void myMethod(final Object obj) {
        int i = 1;
        String s = "HelloWorld!";
    }
}
在上图中,堆栈存储器中的内存,obj和s实际上是对它们放置在堆内存中的" 实际对象 " 的引用.
以下是我想到的一系列问题:
MemoryClass内部对象myMethod,JVM会在堆栈内存中再次为相同的方法分配内存吗?myMethod是否会在执行完成后立即释放分配的内存,如果是,它将如何管理问题2中提到的情况(仅当JVM多次为同一方法分配内存时才适用).java.lang.String类的方法分配内存,如果是这样,为什么呢?这些声明如何彼此不同?
String s="MY PROFESSION";
char c[]="MY PROFESSION";
在每种情况下内存分配怎么样?
这是作者说的
3)字符串池是在Heap的PermGen区域中创建的,垃圾收集可以在perm空间中进行,但依赖于JVM到JVM.顺便提一下,从JDK 1.7更新,String池被移动到创建对象的堆区域.
它有什么具体的原因吗?我无法在网上找到任何内容.有什么影响?
我们知道当我们用new关键字创建新的String对象时,如下所示:
String str = new String("New String Will Have Two Objects");
它将创建两个对象,一个在java堆内存上,另一个在String池上.
那么当我们调用访问"str"哪个字符串对象被访问时(堆对象或字符串池对象)?
根据我的理解,可以访问字符串池对象,如果是,那么堆对象会发生什么?
请考虑以下情形:
String dude = "Harold";
//some stuff
dude = "Kumar";
一旦dude被赋予其第二个"Kumar"值,就会出现一个与"Harold"分开的全新对象.我想知道的是,因为"哈罗德"显然没有用,它是立即收集垃圾还是在JVM认为合适的时候收集?
更新:
仅仅因为dude已经设置为新值(对象)并不一定意味着已经消除了对旧对象的所有引用.如果另一个引用dude在"Harold"之后和"Kumar"之前调用,它显然会保留"Harold"对象:
String dude = "Harold";
//some stuff
String interim = dude;
dude = "Kumar";
System.out.println("dude = " + dude);
System.out.println("interim = " + interim);
版画
dude = Kumar
interim = Harold
因此,有比我最初想象的更多的考虑因素,因此初始值不一定必须在更改后超出范围.