几个对象跟帖!请关注,并指点!

l_dongdong 2009-06-22 11:44:47
StringBuffer a = "";

a+="this"


一共创建了几个对象


关于这样的问题怎么做呢
怎么理解呢

请各位给我指点迷津

我以前发过这样个帖子,呵呵,我把更新信息又新发了一个帖子,不然各位可能就不继续关注了,请谅解!!!
更新如下

我问我朋友的问题如下
跟上个帖子的问题基本一样,只不过多了几个问题。



一、String a = "";
a+="this"; //这里"this"是我随便写的一个字符串。
问题1、
那么这个是创建了几个对象呢 ,
(这样String可以吗,是不是要改成StringBuffer)
问题2、
a+="this"; 如果改为 a = a +"this"那么创建的对象数目有改变吗
问题3、
怎么来理解创建几个对象的问题呢?这个怎么跟池,堆这些东西关联起来呢








产生了几个对象的问题纯粹是一个用来考试的问题。
String a = "";
a+="this";
至少产生了3个对象:“”,“this”,和由相加产生的“this”。你可以用如下程序来验证:
String s1="";
String s2="hello";
s1 += "hello";
System.out.println(s2=="hello"); //结果为true
System.out.println(s1=="hello"); //结果不false
至于把a+="this"; 改成a = a + "this";不会产生任何不同,你可以对照一下:
修改前的字节码:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String
2: astore_1
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6; //String hello
16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: return
修改后的字节码:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String
2: astore_1
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6; //String hello
16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: return
没有变化。
从字节码中可以看到,在0、14、和19这三个地方创建了3个String对象。前两个是直接用ldc从字符串池中加载的,第三个是toString创建的。
你大致可以认为常量是从池中加载的,不是常量的(往往可以看到new)是从堆中创建的。
其实不管哪种形式,都另外创建了一个java/lang/StringBuilder对象,在3那个地方,所以实际对象是4个。但是估计出题的人未必知道是4个,他肯定觉得3个是正确答案。
至于在C++中,string a="";a+="this";只会创建一个对象a。而写成string a="";a=a+"this";会创建两个对象,一个是a,一个是用来保存a+"this"这个结果的临时对象。

我的一个做了N年开发的朋友给了我上面的答案,请各位看下并帮忙指点理解。
...全文
31 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzy0577 2009-06-23
  • 打赏
  • 举报
回复
我刚好看到了StringBuffer的东西,我把那个网页的内容都复制过来,相信你看了下面这个就应该懂了

处理文本值是程序员的日常工作,通常用标准的Java String类来完成与文本有关的需求。它对于很多小任务确实很适用,但是如果处理的是大型任务,它会大量消耗系统资源。由于这个原因,JDK引入了StringBuffer类以提供一条处理字符串的有效路径。让我们来看看怎样用这个类来提升性能。

为什么不用标准的String?

Java String对象是常量字符串。一旦被初始化和付值,它的值和所分配的内存就被固定了。如果硬要改变它的值,将会产生一个包含新值的新String对象。这就是String对象会消耗掉很多资源的原因。下面的代码创建了一个String对象并使用串联(+)符号来为它添加更多字符:

String sample1=new String(“Builder.com”);

sample1+=”is”;

sample1+=”the place”;

sample1+=”to be.”;

系统最终会创建四个String对象来完成上面的替换。其中第一个的文本是Builder.com。然后每次添加文本时都会创建一个新的对象。

这种方法的问题在于为了这么一个简单的过程而消耗了太多的资源。在这个例子中其影响也许很小(指给出了很少的代码),但是在一个拥有多得多操作的大型应用程序中这样做就会使性能下降。StringBuffer类所要解决的正是这个问题。

用StringBuffer处理字符串
StringBuffer类被设计用与创建和操作动态字符串信息。为该对象分配的内存会自动扩展以容纳新增的文本。有三种方法来创建一个新的StringBuffer对象:使用初始化字符串、设定大小以及使用默认构造函数:

StringBuffer sb=new StringBuffer();

StringBuffer sb=new StringBuffer(30);

StringBuffer sb=new StringBuffer(“Builder.com”);

第一行创建了不包含任何文本的对象,默认的容量是16个字符。类的第二个实例也不包含文本,容量是30个字符,最后一行创建了一个拥有初始化值的对象。StringBuffer类位于java.lang基础包中,因此要使用它的话不需要特殊的引入语句。
一旦创建了StringBuffer类的对象,就可以使用StringBuffer类的大量方法和属性。最显著的方法是append,它将文本添加到当前StringBuffer对象内容的结尾。下面的代码示例了append方法的语法:

StringBuffer sb=new StringBuffer();

sb.append(“B”);

sb.append(“u”);

sb.append(“i”);

sb.append(“l”);

sb.append(“d”);

sb.append(“e”);

sb.append(“r”);

sb.append(“.com”);

System.out.println(sb.toString());

这些代码创建了Builder.com字符串并将它送往标准输出,但是只创建了一个对象。如果使用String对象就需要八个以上的对象。注意代码利用了StringBuffer类的toString方法。这个方法将其内容转换成一个可以被用于输出的字符串对象。它允许操作对应的文本用于输出或数据存储。

append方法有十种重载形式,允许将各种类型的数据添加到对象的末尾。StringBuffer类还提供了处理对象内部数据的方法。
StringBuffer的容量

可以使用capacity和length方法来设定对象内的字符数。capacity方法返回为对象分配的字符数(内存)。如果超过了容量,它会自动扩展以符合需求。length方法返回对象目前存储的字符数。可以通过setLength方法来增加其长度。另外,对象的容量可以通过ensureCapacity方法来扩展。它建立了对象的最小容量,因此如果超出则不会有任何问题。下面的代码用到了这些方法:

StringBuffer sb=new StringBuffer();

sb.ensureCapacity(40);

sb.append(“Builder.com is awesome!”);
Systrm.out.println(sb.toString());

sb.setLength(11);

Systrm.out.println(sb.toString());

代码设置了字符串的容量并为其付值。length属性被重新设置了,因此文本被截断了。输入结果如下:

Builder.com is awesome!

Builder.com

操作字符串
还有更多的方法来处理存储在StringBuffer对象内的字符串。以下列举了几个例子:

CharAt返回字符串中的单个字符。
SetCharAt为字符串中的单个字符付值或进行替换。
GetChars返回字符串的一个子字符串。
Insert在字符串指定位置插入值。它有多个重载版本以容纳各种数据类型。
Substring返回字符串的一个子集。
Reverse倒置StringBuffer的内容。
所有的方法对于操作值来说都是很有用的,但是reverse方法最酷了——它使你只用一个调用就轻松地倒置了一个字符串。下面的代码和数出结果作了示范:

StringBuffer sb=new StringBuffer();

sb.ensureCapacity(100);

sb.append(“Builder.com!”);

System.out.println(sb.toString());

sb.reverse();

Systrm.out.println(sb.toString());

输出:
Builder.com!

!moc.redliuB

StringBuffer的优势
字符串的使用贯穿于决大多数应用程序,不管是作为用户界面的标识或在后台处理从数据库取回的值。通常,这些值并不符合要求,需要处理。你可以使用String类,但是它并不是设计成处理动态值的。而StringBuffer类正好填补了这个需求并使得系统资源的利用更加有效。
学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。也感谢一线工人 提供了这个机会。希望大家有什么好的想法和建议都直接跟帖说出来。毕竟只有交流才能够碰撞出火花来 ^_^。 。“卖弄”也好,“吹嘘”也罢,我只是想认真的写写我这一路走来历经的总总,把其中值得注意,以及经 验的地方写出来,权当是我对自己的一个总结吧。而作为看官的你,如果看到了我的错误,还一定指正 , 这样对我以及其它读者都有帮助,而至于你如果从中能够收获到些许,那便是我最大的欣慰了。姑妄言之 , 姑妄听之。如果有啥好的想法和建议一定要说出来。ϑ几年前,和众多初学者一样,我接触到了单片机,立 刻被其神奇的功能所吸引,从此不能自拔。很多个日夜就这样陪伴着它度过了。期间也遇到过非常多的问 题,也一度被这些问题所困惑……等到回过头来,看到自己曾经走过的路,唏嘘不已。经常混迹于论坛里 , 也看到了很多初学者发的求助帖子,看到他们走在自己曾走过的弯路上,忽然想到了自己的那段日子,心 里竟然莫名的冲动,凡此总总,我总是尽自己所能去回帖。很多时候,都想写一点什么东西出来,希望对 广大的初学者有一点点帮助。但总是不知从何处写起。今天借一线工人的台,唱一唱我的戏 一路学习过来的过程中,帮助最大之一无疑来自于网络了。很多时候,通过网络,我们都可以获取到所 需要的学习资料。但是,随着我们学习的深入,我们会慢慢发现,网络提供的东西是有限度的,好像大部 分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想更进一步提高时,却发现能够获取到 的资料越来越少,相信各位也会有同感,铺天盖地的单片机资料中大部分不是流水灯就是 LED,液晶,而 且也只是仅仅作功能性的演示。于是有些人选择了放弃,或者是转移到其他兴趣上面去了,而只有少部分 人选择了继续摸索下去,结合市面上的书籍,然后在网络上锲而不舍的搜集资料,再从牛人的只言片语中 去体会,不断动手实践,慢慢的,也摸索出来了自己的一条路子。当然这个过程必然是艰辛的,而他学会 了之后也不会在网络上轻易分享自己的学习成果。如此恶性循环下去,也就不难理解为什么初级的学习资 料满天飞,而深入一点的学习资料却很少的原因了。相较于其他领域,单片机技术的封锁更加容易。尽管 已经问世了很多年了,有价值的资料还是相当的欠缺,大部分的资料都是止于入门阶段或者是简单的演示 实验。但是在实际工程应用中却是另外一回事。有能力的高手无暇或者是不愿公开自己的学习经验。 很多时候,我也很困惑,看到国外爱好者毫不保留的在网络上发布自己的作品,我忽然感觉到一丝丝的 悲哀。也许,我们真的该转变一下思路了,帮助别人,其实也是在帮助自己。啰啰嗦嗦的说了这么多,相 信大家能够明白说的是什么意思。在接下来的一段日子里,我将会结合电子工程师之家举办的主题周活动 写一点自己的想法。尽可能从实用的角度去讲述。希望能够帮助更多的初学者更上一层楼。而关于这个主 题周的最大主题我想了这样的一个名字“从单片机初学者迈向单片机工程师”。名字挺大挺响亮,给我的压 力也挺大的,但我会努力,争取使这样的一系列文章能够带给大家一点帮助,而不是看后大跌眼镜。这样 的一系列文章主要的对象是初学者,以及想从初学者更进一步提高的读者。而至于老手,以及那些牛 XX 的人,希望能够给我们这些初学者更多的一些指点哈~@_@~

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧