String s1=new String("abc");
String s2="abc"
如果abc没有被new的话会在String池中创建abc,如果new的话会在堆中new出的对象,在栈中创建引用对吗?
java中存在string池,常规区,代码区,堆栈还有什么不清楚,谁能帮我梳理下

解决方案 »

  1.   

    首先没有String池这个概念吧。。
    至于原理,建议楼主看一下
    http://blog.csdn.net/songjie521/article/details/3368386
    感觉写的还不错
      

  2.   

    我不知道有没有String这个概念!
    但是new出来的对象是放在堆中的;
    String s1=new String("abc"); 这条语句,创建对象为1或两个;
    为什么呢?
    首先“abc"这个字符串,如果常量池里面已经存在的话,就不需要重新创建了,因此这就不算创建了一个新的对象,如果没有的话,就只能重新创建一个了!
    new 对象你也是了解的!
      

  3.   

    楼主可以学习一下Java虚拟机的相关知识,下面的链接讲得挺全面的。
    http://blog.csdn.net/yohoph/article/details/8191875
      

  4.   

    最喜欢这种知其然知其所以然的态度,支持LZ.java本质不止堆栈、方法区、常量池这么一点,我自己也是在探索当中.还是要静下心来慢慢思考深入java的学习,深入JVM中学习才能系统掌握不纠结呐。
      

  5.   

    好像没听说过有String池这个概念。凡是new 出来的对象,都是放在堆区里面的。而引用而是放在栈区的。比如String s1=new String(""); s1放在栈区,new出来的对象放在堆区。