解决方案 »

  1.   

    String s="123" 创建一个对象“123” 放入常量池中
    String s=new String("123") 创建两个对象,首先new String()的参数是String对象,创建“123”放入常量池,然后在new一个对象放入堆中
      

  2.   


    常量池里的数据不能称之为对象
    常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表
      

  3.   


    常量池里的数据不能称之为对象
    常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表常量池只是一种说法,在JVM规范里就是class的一部分,在实现上就是方法区里的一个内存块,何来的对象一说?对象是对堆里数据结构的一种抽象描述,方法区里没有这种描述
      

  4.   

    我区分是否是对象的方法就是看这个值放在堆中还是放在栈中。放在对中的都是对象。
    String s = "123";这种方式创建的字符串,"123"放在栈中,而只要是用new的方式创建的东西都是放在堆中。所以我认为String s="123"没有创建对象,而String s = new String("123"); 是创建了对象的。而且因为new是强制创建对象,所以肯定创建了1个对象。
    我对这个问题也一直没研究透,大家讨论下~如果说的不对还请指正!
      

  5.   

    一个貌似公开的“结论”是:String s = new String("123");创建了两个对象
      

  6.   


    其实 String s="123" 和 String s=new String("123")  区别,学java的人大多数都能知道两个s不等。
    只要自己理解通了,具体解释,就不那么重要了。不用过分争执对象,常量池,堆栈的概念。
      

  7.   

    然后new了一个对象,这个对象的值是“123”,那么这个值是存放在哪里呢?在栈里,还是在堆里呢?
    有说法是:拷贝的一份,放到了堆里;还有说法是,new的对象,他的内容就是,对栈里对象“123”的一个引用
    各种角度,各种解释........
      

  8.   


    其实 String s="123" 和 String s=new String("123")  区别,学java的人大多数都能知道两个s不等。
    只要自己理解通了,具体解释,就不那么重要了。不用过分争执对象,常量池,堆栈的概念。
    可是有面试官,在问过==,equals之后;就问了, String s="123" 和 String s=new String("123")  区别有什么区别?
    然后答了一些看法,面试官说,你这基础比较差劲.........
      

  9.   

    莫非面试官想让你从JVM的角度去解释,什么方法区啊,常量池,堆栈这些角度去说,而不是单单的知道他们一个在堆,一个在栈。这里面都是JVM自己的实现,JVM里面的东西也常在改变,所以我觉得过分较真这个东西没有什么意义。java是个语言,我们主要是用它,能用起来就可以了。
      

  10.   


    常量池里的数据不能称之为对象
    常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表常量池只是一种说法,在JVM规范里就是class的一部分,在实现上就是方法区里的一个内存块,何来的对象一说?对象是对堆里数据结构的一种抽象描述,方法区里没有这种描述
    这个常量池,如果涉及到是jvm虚拟机概念的,进而认为是constant_pool那这个问题就飘起来了;
    我们可不可以这样认为:提到的常量池是内存中保存,“常量”的一个区域。就是物理实体,而不是虚拟机概念上的常量池。
      

  11.   

    常量池也是JVM里面的区域,不是物理实体,是JVM的一个内存分区。
      

  12.   

    莫非面试官想让你从JVM的角度去解释,什么方法区啊,常量池,堆栈这些角度去说,而不是单单的知道他们一个在堆,一个在栈。这里面都是JVM自己的实现,JVM里面的东西也常在改变,所以我觉得过分较真这个东西没有什么意义。java是个语言,我们主要是用它,能用起来就可以了。
    也许是;之前我也觉得,用,是关键,可是慢慢发现,虽然很多东西,一直在用,但是就是熟练了一些,没有实质上的长进,如果想在这个行业立足还是要知根知底一些,不然很容易被取代,淘汰;看到一些30多岁的人,找工作很难,实在有点寒心啊
      

  13.   

    有本书叫做 深入理解java虚拟机 ,前段时间看过一遍,里面东西太晦涩了,只了解了一些简单的东西。楼主看看那本书,对这个问题就不纠结了。
      

  14.   

    有本书叫做 深入理解java虚拟机 ,前段时间看过一遍,里面东西太晦涩了,只了解了一些简单的东西。楼主看看那本书,对这个问题就不纠结了。你看的老版的吧,那个最老的绝版书里讲的还是jdk1.1里的东西,前年出了一般红色的那个讲虚拟机的书,比那个老版书通俗易懂很多,可以看看。constant_pool是规范里的东西,编译出来的class有定义这么个东西,具体到JVM的实现,就是方法区里的一块内存。PS。。String s="123" 和 String s=new String("123")  区别有什么区别?  问这种问题的面试官真心好没水平
      

  15.   

     
    面试官的问题确实问的没水平。我看的第二版的,当时重点想看类加载顺序,双亲委派那个东东的。然后看class解析什么的,就全蒙了,书先放那里,后面再看。
      

  16.   


    难道是先new一个空的String对象,然后再创建一个123的String对象,然后让前一个对象指向123?
    另外,关于==和equals,存在栈里的可以用==,存在堆里的用equals。
      

  17.   


    难道是先new一个空的String对象,然后再创建一个123的String对象,然后让前一个对象指向123?
    另外,关于==和equals,存在栈里的可以用==,存在堆里的用equals。不对。String s是构建一个引用
    new String是在堆里开辟一块内存创建一个对象,这个对象里放的内容是123,这个123是从常量池里读取数据,然后拷贝一份放进新的对象里==和equals可以对任意对象使用,默认情况下==和equals是等价的,Object里的默认实现就是==
    public boolean equals(Object obj) {
    return (this == obj);
        }
      

  18.   

    推荐你看看尚学堂的基础视频,对这个问题有很详细的解释,我不是打广告,是真的不想打太多字解释这个问题了。1.栈
    2.堆代码区,栈、堆、静态变量区s引用在栈
    new 在堆
      

  19.   

    楼主这个帖子里最终还是众说纷纭啊,我觉得这个高层的知识已经解决不了了,应该要深入到JVM里才能给出一个完全合理的解释,啃一下深入JVM吧···