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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈承 黑马帝   /  2011-7-30 12:41  /  2401 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String ss = "a"+"b"+"c"+"d";

这样定义 字符串,内存中创建了几个 对象呢?

String s=new String("a")+new String("b")+new String("c")+new String("d");
跟这个是不一样呢?
[ 本帖最后由 陈承 于 2011-07-30  12:44 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 问得不错。

查看全部评分

8 个回复

倒序浏览
创建一个字符串对象"abcd",返回一个栈内存的地址,赋值为引用ss,这个对象被添加到String Pool中。
更详细的知识解答,请看http://bbs.itheima.com/thread-377-1-1.html
String的关键知识点
String是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。
String Pool(字符串池)——内存栈——即你上面说的缓冲池

String s = “aaa”;(采用字面值方式赋值)
1) 查找String Pool中是否存在“aaa”这个对象,如果不存在,则在String Pool中创建一个“aaa”对象,然后将String Pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2) 如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,赋给s引用。

String s = new String(“aaa”);       ——堆内存
1) 首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。
2) 如果没有,则首先在String Pool中创建一个“aaa“对象,然后再在堆中(heap)创建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个”aaa“对象。
[ 本帖最后由 覃俊瑞 于 2011-07-30  13:43 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 看看那个链接就会明白的。

查看全部评分

回复 使用道具 举报

回复 楼主 的帖子

String ss = "a"+"b"+"c"+"d";
在内存中表现的形式是:
String ss = new StringBuffer("a").append("b").append("c").append("d").tostring()
回复 使用道具 举报
黑马网友  发表于 2011-7-30 13:52:15
板凳

String,StringBuffer,StringBuilder

[quote]public final class StringBuilderextends Objectimplements Serializable, CharSequence一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容为 "start" 的字符串的生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含 "startle",而 z.insert(4, "le") 将更改字符串生成器,使之包含 "starlet"。

通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。

将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
[/quote]
有人说,底层是StringBuilder实现的。[url]http://hi.baidu.com/rxt_gogle/blog/item/8496d314811ad8e9c3ce795b.html[/url]
答案不同,想知道更多请看下面的文章:
请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧。[url]http://www.iteye.com/topic/774673[/url]
理解java String:[url]http://www.iteye.com/topic/43102[/url]
主题:【总结】String in Java:[url]http://www.iteye.com/topic/522167[/url] -----------这个不错,从底层解说。
回复 使用道具 举报
黑马网友  发表于 2011-7-30 14:26:09
报纸
String ss = "a"+"b"+"c"+"d"; 这个就创建了1个对象,和String s=new String("a")+new String("b")+new String("c")+new String("d"); 不一样的.
回复 使用道具 举报
黑马网友  发表于 2011-7-30 16:03:09
地板
追问:[code=java]String s=new String("a")+new String("b")+new String("c")+new String("d"); [/code]创建了几个对象?:)
回复 使用道具 举报
黑马网友  发表于 2011-7-31 10:01:16
7#
String s=new String("a")+new String("b")+new String("c")+new String("d");
难道是创建5个对象?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 真的是5个? 再想想

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-31 10:46:59
8#
[code]System.out.println(s==ss);
                System.out.println(s.equals(ss));[/code]一定不要使用过==运算符来检测两个字符串是否相等!==只能够确定两个字符串是否存放在同一位置上。
回复 使用道具 举报
黑马网友  发表于 2011-7-31 10:48:33
9#

回复 地板 的帖子

String s=new String("a")+new String("b")+new String("c")+new String("d");

创建了一个对象 对吧。。。最后都归给S了  所以其余的不算了,都被回收机制取代了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马