String a ="123";
String b =new String("456");
对于a来说,栈中存有a的地址,string池中存在“123”。
对于b来说,栈中存有b的对象在堆中的地址,New String()的对象存在堆中,那么我想请问,对于b新建的string对象的值“456”存在哪里?请各位大侠给解释一下。谢谢

解决方案 »

  1.   

    看String的构造函数  就知道里面重新new了一个 新的对象 
      

  2.   

    String = final类型的char[]  +  操作
      

  3.   

    说实话 这方面我也不太懂 虽说我用了一年的java了  你上面的代码应该是创建了三个对象 
    第一个 是a
    第二个 是b
    第三个 是new String("456")这三个对象都放在哪?  当然是放在内存中了  看得出new String("456")很快会被垃圾收集器给清理掉
      

  4.   

    孩子,真的没有必要深究这个问题,劝你把 Thinking in Java 放到箱子的最底下吧。
      

  5.   

    String(String) 的构造根据 API 文档上的说明,除非你需要一个字符串的副本,否则你不该使用这个构造。使用一个字符串的副本,在开发中几乎不可能用到,因此,可以简单地认为这个构造就不应该被使用。至于产生了几个对象,在国内能说清楚的人廖廖无几,在中国根本就没有 JVM 的实现,所以没有必要纠结什么东西放在栈上,什么东西放在堆上。如果需要进行 JVM 性能调优的话,基本上只能在堆上面作文章。我想你肯定是看过 Thinking in Java 的吧?这书害人不浅,让人追求一些细枝末节而忽略重要的东西,作者也不是 Java 方面的专家,什么东西火就写什么,这样能写出什么好书?真搞不懂怎么有那么多人推荐这本书?Thinking in Java 在教书育人方面,跟霍斯特曼的 Core Java 和迪特尔父子的 Java How to Program 相比真的是相差得很远!
      

  6.   

    前辈,不瞒您说,我还真没看过thinking in java,但是我从网上浏览的一些文章,关于这些东西,就像你说的,众说纷纭,好多种说法,但是我个人觉得,这个东西本不应该这么复杂。但是,看了您的回复,我受教了,谢谢。
      

  7.   

    我问你  楼主   你是想改编java语言还是准备用java去写其它程序?
    如果是前者,那你就研究去吧,如果是后者  那让sun的人研究去 
    1+1=2
    为什么不等于3?
      

  8.   

    看来这个问题是真的很常见啊 我的博客里有答案http://blog.csdn.net/mengxiangyue/article/details/6818142看完这个看看回复的有一个网址
      

  9.   

    String a = "123";
    string b = new string("456");
    在java中,带" "修饰的变量叫做字符串字面量,所有的字符串字面量都是放在字符串池中的(字符串池中的变量是共享的),也就是说,上面两条语句中的123和456都是字符串字面量,所以,它们都在池中,而b使用的new关键字,new关键字把所有产生的对象放在堆区里,也就是说,除了池中有456,堆区中还有一个456,二者是不同的,而堆中的变量是不共享的,
    所以,如果我string c = new string("456");堆中就会出现第二个456,
    所以,本题中,a的对象放在池中,b new出的对象放在堆中。我还专门画了个图,但是这里黏贴不上啊,我上传到我的资源里了,不知道你能不能看到