当前位置:编程学习 > JAVA >>

String s = new String("xyz");创建了几个String Object?

今天在论坛里看到这个题目,很多人贴的答案都是:两个.解释是:一个是“xyx”,一个是指向“xyx”的引用对象s。  
看不懂啊...."xyz"可以理解,后面那个指向"xyz"的引用对象s怎么解释?s应该是个变量而已啊,在栈中,引用对象"xyz"啊!哪有什么引用对象s?我是这样理解的,是我理解错了,还是别人错了?求教... --------------------编程问答-------------------- 首先你要明白java虚拟机对你的变量是怎样在内存中分配的。在java中一般的变量、基本数据类型和对象的句柄多存放在堆栈里面,堆栈的特点是存取的速度块(详解请楼主看一下think in java这一本书,longtengbing@163.com)而对象都放在了堆里,上面的意思就是说在堆栈里保存了s在堆里创建了s的对象“xyx” --------------------编程问答--------------------
引用楼主 big_3_shot 的回复:
今天在论坛里看到这个题目,很多人贴的答案都是:两个.解释是:一个是“xyx”,一个是指向“xyx”的引用对象s。  
看不懂啊...."xyz"可以理解,后面那个指向"xyz"的引用对象s怎么解释?s应该是个变量而已啊,在栈中,引用对象"xyz"啊!哪有什么引用对象s?我是这样理解的,是我理解错了,还是别人错了?求教...

对的,s只是一个引用类型的变量,但是通过new关键字在堆上开辟了空间,此空间存放的对象被s所引用。
而"xyz"本身就是一个匿名的String对象,一出现即在堆里面开辟了空间并存放在此空间中。
现在,题目问你,创建了几个String Object? 就等同于现在堆里面有创建了几个对象。你还可以把这个表达式拆开理解
String s = new String("xyz") 等同于String s = new String();s="xyz";这样堆上创建了几个对象,一看就明白了。 --------------------编程问答-------------------- 注意与
String s="xyz"的区别,像这样不通过new关键字,堆上只创建了一个String对象。 --------------------编程问答-------------------- up up ++ --------------------编程问答-------------------- 了解各个程序执行过程中在内存中的实现就清楚了、 --------------------编程问答-------------------- 顶!学习了! --------------------编程问答-------------------- 两个对象++ --------------------编程问答-------------------- 那个解释是错的.
正确解释是:一个字符串常量池中的"xyz",一个是以这个字符串对象为模板生创建一个内容与之一模一样的字符串对象 --------------------编程问答-------------------- 这种帖子以后能不能不要发了?要知道创建了几个对象有什么用呢? --------------------编程问答--------------------
引用 9 楼 bao110908 的回复:
这种帖子以后能不能不要发了?要知道创建了几个对象有什么用呢?

--------------------编程问答-------------------- 谁都有不明白的时候哈。。。 --------------------编程问答-------------------- 多看看书 --------------------编程问答--------------------
引用 11 楼 wingson_shen 的回复:
谁都有不明白的时候哈。。。


回复框的上面,可以看一下有多少?都已经成灾了!这个问题是 CSDN Java 版著名的周经帖,每周最少出现一次! --------------------编程问答-------------------- 毫无疑问 别人说的太书面化了   创建了两个对象 一个是s后无疑问s是一个对象 我肯定你肯定赞同  然后就是new String("xyz")  因为这里有一个new  老师说过 凡是有new关键字 就是创建一个对象的意思 --------------------编程问答-------------------- 一个堆中,一个在字符串常量池中。 --------------------编程问答--------------------
引用 9 楼 bao110908 的回复:
这种帖子以后能不能不要发了?要知道创建了几个对象有什么用呢?
求知,不要带有这么功利性!在实际应用中,对于多数人确实没啥用,但是这不能作为我们不需要理解它的借口.我就是想知道它在内存里是怎么工作的!你不想知道是你自己的事情.凡事知其然,但是知其所以然更好.伽利略看着钟摆,他也可以不思考钟摆原理,也不会影响他的生活.但是没有他的思考,那些个原理,知识,理论可能就要再过很多年后才被发现.你也许会说,人家是科学家,我们是凡人,是P民,不是一个等级的.但是人家也不是天生就是科学家.是得,我们一辈子也达不到伽利略的高度,但是这不能阻止我要弄懂一个东西的原理,我不光想知道它是这样运作的,还想知道它为什么是这样运作的,就这么简单.就是想知道...你自己不想知道,不要管别人! --------------------编程问答-------------------- http://blog.csdn.net/mengxiangyue/article/details/6818142看看你就懂了 --------------------编程问答-------------------- http://www3.ntu.edu.sg/home/ehchua/programming/java/J3d_String.html
英文可以的话,推荐~ --------------------编程问答-------------------- 不是已经回答了么  楼主能给点回应不 这帖子该结了吧 --------------------编程问答--------------------
引用 13 楼 bao110908 的回复:
引用 11 楼 wingson_shen 的回复:

谁都有不明白的时候哈。。。


回复框的上面,可以看一下有多少?都已经成灾了!这个问题是 CSDN Java 版著名的周经帖,每周最少出现一次!



还真的不少。。谁叫那网上的面试题里总爱出现这题呢。其实这个没什么好考的。也只是JVM做了优化而已 --------------------编程问答--------------------
引用 16 楼 big_3_shot 的回复:
引用 9 楼 bao110908 的回复:
这种帖子以后能不能不要发了?要知道创建了几个对象有什么用呢?
求知,不要带有这么功利性!在实际应用中,对于多数人确实没啥用,但是这不能作为我们不需要理解它的借口.我就是想知道它在内存里是怎么工作的!你不想知道是你自己的事情.凡事知其然,但是知其所以然更好.伽利略看着钟摆,他也可以不思考钟摆原理,也不会影响他的生活.但是没有他的思考,那些个原理,知识,……

支持LZ!

--------------------编程问答-------------------- 新人进驻学习的路过 --------------------编程问答-------------------- 两个(一个是“xyz”,一个是指向“xyz”的引用对象s)
--------------------编程问答-------------------- 看看这篇文章吧,其实,我上面说的也不对
http://www.iteye.com/topic/774673 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 可能是一个,也可能是两个。如果“xyz”已经存在就不再创建了。 --------------------编程问答-------------------- 字符串本身就是以对象的形式储存在字符串常量池中;
而有用new关键字重新建了一个对象因此是两个。
我 建议如果的确不理解就先记住以后见的多了自然就明白了。 --------------------编程问答-------------------- 毫无疑问 是两个嘛  一个字符串就是一个String类的匿名对象 但是如果使用的是New关键字 此时会开辟一个新的空间 虽然此时内容还是xyz 但是此时真正使用的New开辟的空间。不用的那个命运就是就等待垃圾回收了。 --------------------编程问答-------------------- 这个问题只能说不一定是2个,有可能是一个。在进行new String("xx")操作时,首先回去String pool中检查是否有xx,若有的话,就会直接在堆中产生一个对象,并返回引用,这个时候实际上是一个对象,若检查出来没有的话,则现在String POOL中创建xx,然后继续在堆中创建一个,并返回堆中的引用,这个时候就是2个对象。 --------------------编程问答-------------------- 常量池中为 "xyz" 堆中为String对象
栈中为String类型变量

String类型变量中保存的是 堆中的String对象的地址,堆中的String对象保存的是常量池中"xyz"的地址 --------------------编程问答-------------------- String s = new String("xyz");

 一个对象 是在创建  s  对象 时候,在堆里分配了空间, new String(指向"xyz")

 另一个对象字符串常量"XYZ",也在堆里面

new String()  里面放的是   对象"xyz"的地址
--------------------编程问答-------------------- 现在回帖的速度也太快了~!
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,