String s = new String("xyz");创建了几个对象?
下面说法正确吗?创建String 有两个方法
1,String a = "xyz"
2,String a = new String("xyz")为了提高效率,JVM 有个 String constant pool 的东东,先命名为scp
当用第一种方法创建 String  时,首先在这个scp里找,
看有没有现成的"xyz",如果有,就直接把 a  指向它,如果
没有,就在scp 里面创建一个,然后把 a 指向它。
当用第二种方法创建String 时,用正常的方法在 heap 中创建一个
"xyz" .然后再创建一个 "xyz" 放到 scp 里,以备使用。
scp 与 heap 是两个不同的内存区域)

解决方案 »

  1.   

    有没有高手 讲下 Java 内存分配机制?堆和栈。
      

  2.   

    我的理解:String a = new String("xyz")
    类加载时,"xyz"就被读入并在常量池创建了,
    然后调用到new String("xyz")的时候,就在堆上创建new String("xyz")所以是2个对象。。-----------------------------------------------------------------其实常量池是属于类的内容,所以在加载的时候也是创建在堆上的,
    所以其实常量池的内容应该也是存在于堆上的。简单的说,堆上用来存放 所有new出来的对象。
    栈则多是存放存放 基本类型的变量数据和对象的引用
      

  3.   

    是两个对象。可以参考一下Java API 再结合你理解的常量池.
    String(String original) 
    初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
    换句话说,新创建的字符串是该参数字符串的副本。
      

  4.   

    String str1 = new String("xyz");
    String str2 = new String("xyz");
    String s1 = "xyz";
    String s2 = "xyz";System.out.println(s1==s2);     返回true
    System.out.println(str1==str2); 返回false
    从内存上来说
    后者 栈空间分配内存给s
    栈空间分配内存给字符串"xyz"
    s指向"xyz"前者是 栈空间分配内存给str
    堆new了一个对象 值为空
    对象赋值"xyz"
    s指向string对象不知道我理解的对不?
      

  5.   

    1,String a = "xyz"   一个
    2,String a = new String("xyz") 两个
      

  6.   

    首先:java存储区
    1.寄存器 (不能直接控制)2。堆栈 (存放临时变量和对象引用,函数参数,基本数据类型)3。堆(heap区,对象) 4。静态存储区(静态变量) 5。常量存储区 6。非静态存储区(流持久化和序列化对象,存活于程序外,如磁盘等)
    其次:程序加载时String s =“abc”会先在常量池中查找时否存在字符串,若有将s指向他,若无在常量池中创建 并s指向它
          String s = new String("abc")在会先在常量池中查找是否存在"abc“字符串,如果存在,则直接在heap区创建其引用,否则会先在常量池中创建字符串"abc",再在heap区上创建“abc”的引用
    再次:对于 String s = new String("abc") 程序会再在堆栈上创建 s,并将s指向heap区中的引用,而heap区指向常量池。
    对于常量池,不同jvm分配不同的大小 以下可以测试jdk1.6
    public class Test
    {
    public static void main(String[] args){
    Integer i1=1;
    Integer i2=1;
    System.out.println(i1==i2);
    Integer i3=128;
    Integer i4=128;
    System.out.println(i3==i4);

    }
    }