解决方案 »

  1.   

    我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb”
                                     String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
                                     String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
      

  2.   

    我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb”
                                     String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
                                     String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
    s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
      

  3.   

    我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb”
                                     String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
                                     String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
    s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
    您所指的常量池,是不是存在堆内存中的对象值?
      

  4.   

    string s = "xxx";这种声明赋值,指向的是常量池,所以对象都是一个。string s = new String("xxx");这种创建是重新分配内存,对象不是同一个。
      

  5.   

    我是这样理解的: String s = "acb";栈内存中创建对象s,堆内存创建对象“acb”
                                     String s1 = "acb";栈内存中创建对象s1,指向了刚才堆内存中创建的“acb”
                                     String s2 = new String("acb");栈内存中创建对象s2,堆内存中又创建了“acb”
    s 和 s1 是两个引用指向,他们同时指向常量池的acb, s2 指向堆内的acb
    您所指的常量池,是不是存在堆内存中的对象值?
    常量池在方法区,堆是另外一块内存区域 参考Java虚拟机学习 - 体系结构 内存模型 
      

  6.   

    当直接String s = "***" 的时候对象中的值是放在常量池中的!!当再次String s1 = "***"  时先看常量池中是否有这个值如果有指向这个值如果没有在创建    String s2 =  "****" 的时候是在堆里创建一个新的对象每次都是不同的!!!
      

  7.   

    是String s2 = new String("***")  额手误了!!
      

  8.   

    可以参考下这个:http://blog.csdn.net/gaopeng0071/article/details/11741027
      

  9.   

    String s = "acd" 中的常量是存放在常量池中的,相同的只保存一个,因此直接赋值的常量会相等;如果是new出来的对象,判断的是内存地址,因此不一样。
      

  10.   

    下面的代码对楼主理解String的存储会有帮助
    new出来的对象存在堆中,直接声明的在栈中(具体一点就是在常量池中)String str1 = "a";//constant pool
    String str2 = "b";//constant pool
    String str3 = new String("a");//heapSystem.out.println(str1 == str3);//falseString str4 = "a"+str2;//heap
    String str5 = "a"+"b";//constant pool
    String str6 = new String("ab");//heap
    String str7 = "ab";//constant pool
    System.out.println(str4 == str5);//false
    System.out.println(str4.intern() == str5);//true
    System.out.println(str4 == str6);//false
    System.out.println(str5 == str7);//trueString str8 = str6;//heap
    System.out.println(str6 == str8);//trueString str9 = new String("ab");//heap
    System.out.println(str6 == str9);//false
      

  11.   


    同一个字符串在常量池中只会有一份,所以,当不同引用指向同一个常量池中的字符串时,他们的地址永远都是一样的。==true
    如果是new出来的两个相同的字符串对象,则他们的地址永远不会相同。== false
      

  12.   

    楼主看了《think in java》吧,被字符串问题折磨得死去活来的。
      

  13.   

    因为有字符串常量池的存在,当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。具体你可以看一下这篇文章http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/