String s=“123” 和String S = new string("123") 区别 string对象 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 String s="123" 创建一个对象“123” 放入常量池中String s=new String("123") 创建两个对象,首先new String()的参数是String对象,创建“123”放入常量池,然后在new一个对象放入堆中 常量池里的数据不能称之为对象常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表 常量池里的数据不能称之为对象常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表常量池只是一种说法,在JVM规范里就是class的一部分,在实现上就是方法区里的一个内存块,何来的对象一说?对象是对堆里数据结构的一种抽象描述,方法区里没有这种描述 我区分是否是对象的方法就是看这个值放在堆中还是放在栈中。放在对中的都是对象。String s = "123";这种方式创建的字符串,"123"放在栈中,而只要是用new的方式创建的东西都是放在堆中。所以我认为String s="123"没有创建对象,而String s = new String("123"); 是创建了对象的。而且因为new是强制创建对象,所以肯定创建了1个对象。我对这个问题也一直没研究透,大家讨论下~如果说的不对还请指正! 一个貌似公开的“结论”是:String s = new String("123");创建了两个对象 其实 String s="123" 和 String s=new String("123") 区别,学java的人大多数都能知道两个s不等。只要自己理解通了,具体解释,就不那么重要了。不用过分争执对象,常量池,堆栈的概念。 然后new了一个对象,这个对象的值是“123”,那么这个值是存放在哪里呢?在栈里,还是在堆里呢?有说法是:拷贝的一份,放到了堆里;还有说法是,new的对象,他的内容就是,对栈里对象“123”的一个引用各种角度,各种解释........ 其实 String s="123" 和 String s=new String("123") 区别,学java的人大多数都能知道两个s不等。只要自己理解通了,具体解释,就不那么重要了。不用过分争执对象,常量池,堆栈的概念。可是有面试官,在问过==,equals之后;就问了, String s="123" 和 String s=new String("123") 区别有什么区别?然后答了一些看法,面试官说,你这基础比较差劲......... 莫非面试官想让你从JVM的角度去解释,什么方法区啊,常量池,堆栈这些角度去说,而不是单单的知道他们一个在堆,一个在栈。这里面都是JVM自己的实现,JVM里面的东西也常在改变,所以我觉得过分较真这个东西没有什么意义。java是个语言,我们主要是用它,能用起来就可以了。 常量池里的数据不能称之为对象常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表常量池只是一种说法,在JVM规范里就是class的一部分,在实现上就是方法区里的一个内存块,何来的对象一说?对象是对堆里数据结构的一种抽象描述,方法区里没有这种描述这个常量池,如果涉及到是jvm虚拟机概念的,进而认为是constant_pool那这个问题就飘起来了;我们可不可以这样认为:提到的常量池是内存中保存,“常量”的一个区域。就是物理实体,而不是虚拟机概念上的常量池。 常量池也是JVM里面的区域,不是物理实体,是JVM的一个内存分区。 莫非面试官想让你从JVM的角度去解释,什么方法区啊,常量池,堆栈这些角度去说,而不是单单的知道他们一个在堆,一个在栈。这里面都是JVM自己的实现,JVM里面的东西也常在改变,所以我觉得过分较真这个东西没有什么意义。java是个语言,我们主要是用它,能用起来就可以了。也许是;之前我也觉得,用,是关键,可是慢慢发现,虽然很多东西,一直在用,但是就是熟练了一些,没有实质上的长进,如果想在这个行业立足还是要知根知底一些,不然很容易被取代,淘汰;看到一些30多岁的人,找工作很难,实在有点寒心啊 有本书叫做 深入理解java虚拟机 ,前段时间看过一遍,里面东西太晦涩了,只了解了一些简单的东西。楼主看看那本书,对这个问题就不纠结了。 有本书叫做 深入理解java虚拟机 ,前段时间看过一遍,里面东西太晦涩了,只了解了一些简单的东西。楼主看看那本书,对这个问题就不纠结了。你看的老版的吧,那个最老的绝版书里讲的还是jdk1.1里的东西,前年出了一般红色的那个讲虚拟机的书,比那个老版书通俗易懂很多,可以看看。constant_pool是规范里的东西,编译出来的class有定义这么个东西,具体到JVM的实现,就是方法区里的一块内存。PS。。String s="123" 和 String s=new String("123") 区别有什么区别? 问这种问题的面试官真心好没水平 面试官的问题确实问的没水平。我看的第二版的,当时重点想看类加载顺序,双亲委派那个东东的。然后看class解析什么的,就全蒙了,书先放那里,后面再看。 难道是先new一个空的String对象,然后再创建一个123的String对象,然后让前一个对象指向123?另外,关于==和equals,存在栈里的可以用==,存在堆里的用equals。 难道是先new一个空的String对象,然后再创建一个123的String对象,然后让前一个对象指向123?另外,关于==和equals,存在栈里的可以用==,存在堆里的用equals。不对。String s是构建一个引用new String是在堆里开辟一块内存创建一个对象,这个对象里放的内容是123,这个123是从常量池里读取数据,然后拷贝一份放进新的对象里==和equals可以对任意对象使用,默认情况下==和equals是等价的,Object里的默认实现就是==public boolean equals(Object obj) { return (this == obj); } 推荐你看看尚学堂的基础视频,对这个问题有很详细的解释,我不是打广告,是真的不想打太多字解释这个问题了。1.栈2.堆代码区,栈、堆、静态变量区s引用在栈new 在堆 楼主这个帖子里最终还是众说纷纭啊,我觉得这个高层的知识已经解决不了了,应该要深入到JVM里才能给出一个完全合理的解释,啃一下深入JVM吧··· 小弟跪求大神帮忙,看看js基础问题 连接ActiveMQ的JMX问题 哪个有officeproject2003能发我邮箱吗 hibernate中的缓存怎么处理 现场直憋啊! hibernate 一对多级联更新,老问题重提 问个myeclipse自动生成映射问题 ireport 导出html poseidon-ce-6的下载地址? 请问有没有根据XML Schema生成XML文件的方法呢?? spring的controller和servle有关系吗? 页面导出Excel问题
String s=new String("123") 创建两个对象,首先new String()的参数是String对象,创建“123”放入常量池,然后在new一个对象放入堆中
常量池里的数据不能称之为对象
常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表
常量池里的数据不能称之为对象
常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表常量池只是一种说法,在JVM规范里就是class的一部分,在实现上就是方法区里的一个内存块,何来的对象一说?对象是对堆里数据结构的一种抽象描述,方法区里没有这种描述
String s = "123";这种方式创建的字符串,"123"放在栈中,而只要是用new的方式创建的东西都是放在堆中。所以我认为String s="123"没有创建对象,而String s = new String("123"); 是创建了对象的。而且因为new是强制创建对象,所以肯定创建了1个对象。
我对这个问题也一直没研究透,大家讨论下~如果说的不对还请指正!
其实 String s="123" 和 String s=new String("123") 区别,学java的人大多数都能知道两个s不等。
只要自己理解通了,具体解释,就不那么重要了。不用过分争执对象,常量池,堆栈的概念。
有说法是:拷贝的一份,放到了堆里;还有说法是,new的对象,他的内容就是,对栈里对象“123”的一个引用
各种角度,各种解释........
其实 String s="123" 和 String s=new String("123") 区别,学java的人大多数都能知道两个s不等。
只要自己理解通了,具体解释,就不那么重要了。不用过分争执对象,常量池,堆栈的概念。
可是有面试官,在问过==,equals之后;就问了, String s="123" 和 String s=new String("123") 区别有什么区别?
然后答了一些看法,面试官说,你这基础比较差劲.........
常量池里的数据不能称之为对象
常量池中包含多种类型,包括java基本数据类型、对象型(如:String)、等等。具体可搜索下常量类型表常量池只是一种说法,在JVM规范里就是class的一部分,在实现上就是方法区里的一个内存块,何来的对象一说?对象是对堆里数据结构的一种抽象描述,方法区里没有这种描述
这个常量池,如果涉及到是jvm虚拟机概念的,进而认为是constant_pool那这个问题就飘起来了;
我们可不可以这样认为:提到的常量池是内存中保存,“常量”的一个区域。就是物理实体,而不是虚拟机概念上的常量池。
也许是;之前我也觉得,用,是关键,可是慢慢发现,虽然很多东西,一直在用,但是就是熟练了一些,没有实质上的长进,如果想在这个行业立足还是要知根知底一些,不然很容易被取代,淘汰;看到一些30多岁的人,找工作很难,实在有点寒心啊
面试官的问题确实问的没水平。我看的第二版的,当时重点想看类加载顺序,双亲委派那个东东的。然后看class解析什么的,就全蒙了,书先放那里,后面再看。
难道是先new一个空的String对象,然后再创建一个123的String对象,然后让前一个对象指向123?
另外,关于==和equals,存在栈里的可以用==,存在堆里的用equals。
难道是先new一个空的String对象,然后再创建一个123的String对象,然后让前一个对象指向123?
另外,关于==和equals,存在栈里的可以用==,存在堆里的用equals。不对。String s是构建一个引用
new String是在堆里开辟一块内存创建一个对象,这个对象里放的内容是123,这个123是从常量池里读取数据,然后拷贝一份放进新的对象里==和equals可以对任意对象使用,默认情况下==和equals是等价的,Object里的默认实现就是==
public boolean equals(Object obj) {
return (this == obj);
}
2.堆代码区,栈、堆、静态变量区s引用在栈
new 在堆