String 内存到底是怎么分配的?例如:
String str1 = "string";str1中的内容"string"是存储在栈中呢还是堆中?String str1 = new String("string");这个str1 的对象应该是存储在堆中。String str1 = "java";
String str2 = "ja";
String str3 = "va";
String str4 = str2 + str3;System.out.print(str1 == str4);
输出的为什么是false?

解决方案 »

  1.   

    补充:String str4 中的内容又是存在栈中还是堆中?
      

  2.   

    str1,str2,str3,str4这些都是String对象的引用,就是说它们存放的是堆中String对象的地址.你用==比较的话,当然是比较它们的引用是否相同.这当然不相同啦,所以是false.
    如果你是想比较它们引用的内容即字符串是否相同应用用,str1.equals(str4)
      

  3.   

    所以用的String对象当然是在堆中,栈中存放的只是引用
      

  4.   

    为什么str1 和 str4 的引用也不同呢?
    str4 = str2 + str3;
    那么在堆中应该先搜索有没有"string",因为前面已经有了 str1 = "string" 所以堆中应该有string, 并且str4也指向str1存的那个相同的string啊, 那应该是true啊。
    我的理解肯定是有误, 但是到底怎么错了?
      

  5.   

    str1 和 str4 的引用应该也相同啊
      

  6.   

    栈中永远不会发现Java对象
      

  7.   

    对象都在堆中。String str1 = "string";
    这里的是字符串常量,是存在于data segment中。String str1 = new String("string");
    这里是一个对象,存在于堆中。==比较的是内存地址,显然不同。下面的同理可得。
    还有,你说什么现在堆中找找有没有“string”,不知道你是说“string”字符串常量,还是对象,不管怎么样,都是不能这么说的。前者,字符串常量不再堆中,后者,就算两个内容一样的对象,那也是两个对象,除非你直接用 = 把引用复制给另一个。
      

  8.   

      ==只会比较两个字符串是不是指向同一个目标,而不会去比较里面的内容,你这里生成了两个字符串java,然后用两个String名去指向它,他们指向的内存不同,故会输出false.
      要想输出true,可以用str1.equals(str2).也可以直接加一条语句str1=str1.intern();将该字条串扣留。   
      

  9.   

    String str1 = "java";
    String str2 = "ja";
    String str3 = "va";
    String str4 = str2+str3;

    System.out.println(str1==str4); // 1:false

    str4 = str4.intern();

    System.out.println(str1==str4); // 2:truejvm载入java类时,有个常量池,这些String常量str[1-3]都存放在常量池中,str4是由str1与str2相加得到一个新的常量,也存放到了常量池中。==对比的引用的是不是一个对象,1的情况下,str1和str4分别指向的是2个String对象
    而String.intern()方法,是需要查看常量池是否已经存在这个字符串对象,存在返回这个字符串对象的引用,不存在则把这个新的字符串对象放到常量池中返回这个新放入常量池中字符串的引用,故2返回true将java的执行者jvm看做一个程序,这些对象的空间是由jvm给它们申请的,那么这些对象的空间应该是用jvm new的,这样的话这些对象就应该存放在属于jvm的堆中
      

  10.   

    str1和str4是分别指向不同字符串对象的引用。
      

  11.   

    当你定义一个新的String类型的时候,它会新建一个不同的对象的引用,你可以用StringBuffer试试
      

  12.   

    它是在原来的字符串的基础上加的,而不是新建一个,good luck
      

  13.   

    str1和str4是分别指向不同字符串对象的引用。
      

  14.   

    lz 始终记住 一点 java中定义一个对象 对象只是存着实例的引用 ==比较的是引用是否相等 结果当然是false了
      

  15.   

    String 问题永远是 CSDN Java SE 版块的月经帖!而且我发现,喜欢看 Thinking in Java 的人特别喜欢深究诸如此类没用的东西!