A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾辉 黑马帝   /  2012-1-17 14:34  /  3009 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str = "yes"   
if (str == "no")
str += "ok"
一共创建了几个对象

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

15 个回复

倒序浏览
没有对象啊通过关键词new才能创建出出对象啊
回复 使用道具 举报
木对象额。。。就一字符串
回复 使用道具 举报
木对象额。。。就一字符串
回复 使用道具 举报
我认为这里面有一个对象!也就是“yes”,而第二句永远是flase,所以第三句就执行不到,那么就不会创建对象了。
回复 使用道具 举报
本帖最后由 房宝彬 于 2012-1-17 17:52 编辑

String类比较特殊,它被放在一个特殊的池中。当你声明一个String对象时,系统会检查具体的字符值是否已经存在,如果存在,则不会另开辟空间存。所以:无论你new 了多少个String对象,假设它们的值都是"abc"的话,那么在这个特殊的字符池中也有切仅有一个“abc"而已。 因此该题中有一个对象,接下来的if判断不会返回true,所以该题创建了一个对象。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张伟~ 黑马帝 2012-1-17 19:48:37
7#
首先可以肯定,一个对象是有的(yes)
String是一个引用类型的变量String str="yes";其实就是String str=new String("yes");
后面的if语句就像楼上说的返回的是false,str+="ok";根本执行不到
所以只有一个对象

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
余松霖 黑马帝 2012-1-17 22:10:51
8#
一共创建了两个对象
常量池里边:"yes"
栈内存里边有个str
回复 使用道具 举报
黄秋 黑马帝 2012-1-17 22:39:48
9#
余松霖 发表于 2012-1-17 22:10
一共创建了两个对象
常量池里边:"yes"
栈内存里边有个str

我觉得是一个对象。
常量池那个不算是对象吧,应是变量。
回复 使用道具 举报
老罗 黑马帝 2012-1-18 12:40:23
10#
继续讨论哦。
回复 使用道具 举报
本帖最后由 房宝彬 于 2012-1-18 14:18 编辑
老罗 发表于 2012-1-18 12:40
继续讨论哦。


老师的意思是  不是1个对象么?
回复 使用道具 举报
沈样 黑马帝 2012-1-19 19:21:45
12#
一般是new才会产生对象,String这个字符串="XXX"的话,他们在字符串池中取,对象应该是jvm自动开辟,如果String没有new产生的就永远只有一个,如果错了请指教
回复 使用道具 举报
黄秋 黑马帝 2012-1-21 23:32:36
13#
既然老师说“继续讨论”,我也来说两句。应是一个对象。
  String str = "yes":JAVA首先在字符串池中查找是否已经存在了值为"yes"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
  如果有“new”语句,则创建一对象到堆中,字符串池是保存在栈上。这里无“new”语句,str == "no" 为false,下面的语句不会执行,故只产生一个对象。(如果这三语句前面有语句产生"yes"在字符串池,则一对象也不会产生)。
回复 使用道具 举报
6楼7楼正解
回复 使用道具 举报
李杨 黑马帝 2012-1-31 02:51:45
15#
public String()
Initializes a newly created String object so that it represents an empty character sequence. Note that use of this constructor is unnecessary since Strings are immutable.

String
public String(String original)
Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.

Parameters:
original - A String

一般来说的话,还是直接String str = "strings";因为字符串在字符串池中是不可变的,就是字符串池中维护着字符串,当你多次使用同一个字符串的时候是直接到字符串池中来拿的,并不会占用多余的空间。用String的构造方法也可以,但是正如刚才强调的字符串池中创建了的字符串是不可变的,所以没有什么必要用new来构造。除非你需要显示的用你的字符串。
回复 使用道具 举报
王康 黑马帝 2012-1-31 09:52:01
16#
String str=new String("yes");
创建了两个对象
常量池里边:"yes"
栈内存里边有个str

String str = "yes"   
if (str == "no")
str += "ok"
只创建了一个对象"yes"
String str="yes" 与 String str=new String("yes");的创建方法是不一样的含义。我不同意7楼的说法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马