Minecraft(我的世界)中文论坛

标题: JAVA语言零基础学习 扩展篇 StringBuffer和StringBuilder

作者: 简单    时间: 2013-7-15 16:21
标题: JAVA语言零基础学习 扩展篇 StringBuffer和StringBuilder
本帖最后由 海螺螺 于 2020-1-25 16:08 编辑

索引贴:http://www.mcbbs.net/thread-138969-1-1.html

这个也是之前讲字符串的时候没讲的一个
首先,我们要知道的是它和String一样,都是一个类,但不同的是String是一个静态类,可以直接赋值,但StringBuffer必须使用new关键字实例化.
如何去做如果你认真看完了主杆篇就不会有任何问题了,我这里只重点说一下关于StringBuffer的几个方法.
StringBuffer的追加
  我们在String里讲过一个追加方法concat,这里将讲解一个StringBuffer的追加方法.
代码示例

  1. public class book {
  2.         
  3.         public static void main(String[] args)
  4.         {
  5.           StringBuffer a=new StringBuffer("我把教程看完了,");
  6.           a.append("我能看懂mod制作教程了!!");
  7.           a.append("我来给楼主评分~");
  8.           System.out.println(a);
  9.          }
  10. }
复制代码
输出结果
我把教程看完了,我能看懂mod制作教程了!!我来给楼主评分~


StringBuffer 插入
代码示例
  1. public class book {
  2.         
  3.         public static void main(String[] args)
  4.         {
  5.           StringBuffer a=new StringBuffer("我把教程看完了,我来给楼主评分~");
  6.           a.insert(8,"我能看懂mod制作教程了!!");
  7.           System.out.println(a);
  8.          }
  9. }
复制代码

输出结果和上面是一样的,有人能总结出上面的各个量的含义吗?
变量名.insert(int,添加的字符)
int是在第某位前面添加,值得注意的是,和前面的一样,是从0开始数位。

StringBuffer颠倒
代码示例
  1. public class book {
  2.         
  3.         public static void main(String[] args)
  4.         {
  5.           StringBuffer a=new StringBuffer("~分评主楼给来我!!了程教作制dom懂看能我,了完看程教把我");
  6.           a.reverse();
  7.           System.out.println(a);
  8.          }
  9. }
复制代码
把字符顺序颠倒,输出和之前的一样。
StringBuilder


在该类的API中,是这么说的:
This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.

由此我们可以知道,该类是兼容StringBuffer的api的,但是该类并不是线程安全的。所以,我们不应该有线程安全要求的情况下使用它,但是在其他情况下,我们都应该使用StringBuilder,因为它比StringBuffer快的多。

测试代码:
  1. public class MainTest {
  2.     public static void main(String[] args) {
  3.         long l=System.currentTimeMillis();
  4.         StringBuffer stringBuffer = new StringBuffer();
  5.         for (int i=0;i<1000000;i++){
  6.             stringBuffer.append(i);
  7.         }
  8.         System.out.println("buffer.append:"+(System.currentTimeMillis()-l) + "ms");

  9.         l=System.currentTimeMillis();
  10.         stringBuffer.toString();
  11.         System.out.println("buffer.toString:"+(System.currentTimeMillis()-l) + "ms");


  12.         l=System.currentTimeMillis();
  13.         StringBuilder stringBuilder = new StringBuilder();
  14.         for (int i=0;i<1000000;i++){
  15.             stringBuilder.append(i);
  16.         }
  17.         System.out.println("builder.append:"+(System.currentTimeMillis()-l) + "ms");

  18.         l=System.currentTimeMillis();
  19.         stringBuilder.toString();
  20.         System.out.println("builder.toString:"+(System.currentTimeMillis()-l) + "ms");


  21.     }
  22. }
复制代码
测试结果:

buffer.append:82ms
buffer.toString:9ms
builder.append:36ms
builder.toString:3ms

以上是我本机上的测试结果。

扩展:

示例代码中,对于字符串的拼接直接使用了加号,其实对于部分情况,字符串只是简单拼接,完全可以使用+即可,编译器会根据上下文代码自动优化成StringBuild.append.toString()。大家可以猜测下上述代码也会自动优化吗?




作者: 断了的弦513    时间: 2013-7-15 16:25
额  这不就是普通的java程序么    好像还是用jdk的  
作者: 简单    时间: 2013-7-15 16:26
断了的弦513 发表于 2013-7-15 16:25
额  这不就是普通的java程序么    好像还是用jdk的

饿。。。有什么问题吗?=。=
作者: 西楚世界    时间: 2013-7-15 16:28
顶起,还不错················
作者: 383964923    时间: 2013-7-15 16:31
这个好简单
作者: 简单    时间: 2013-7-15 16:37
383964923 发表于 2013-7-15 16:31
这个好简单

其实都不难=。=
作者: 383964923    时间: 2013-7-15 16:56
简单 发表于 2013-7-15 16:37
其实都不难=。=

不过可以让初学的人少走很多弯路  蛮不错的 顶起
作者: 简单    时间: 2013-7-15 16:58
383964923 发表于 2013-7-15 16:56
不过可以让初学的人少走很多弯路  蛮不错的 顶起

表示当初自学java=。=各种看不懂。。。。
作者: wqrmcbbs    时间: 2013-8-12 23:25
顶顶顶顶顶
作者: qihuansheji    时间: 2013-10-4 18:35
00000000000000000000000000000
作者: xiashangyu    时间: 2013-10-27 11:16
赞个!!!
作者: 1123fff    时间: 2013-11-15 01:44
回复查看隐藏教程

顺便顶下楼主···
作者: 梦幻龙族Ⅱ    时间: 2014-1-1 16:24
.解理易容,好很的写
作者: Cyanogen    时间: 2014-1-9 23:20
再次回复看隐藏内容
作者: 1124186912    时间: 2014-1-12 19:25
.....又要.......
作者: ByZYM    时间: 2014-1-13 18:43
我记得是StringBuilder?
作者: zhukai    时间: 2014-1-16 19:55
qihuansheji 发表于 2013-10-4 18:35
00000000000000000000000000000

举报不谢
作者: CODE!CODE!    时间: 2014-2-8 09:33
Java看上去比Lua容易。。。。
作者: ◎◎◎◎◎◎    时间: 2014-2-12 18:19
赞一个!!
作者: mingmars    时间: 2014-2-17 11:51
i 不错.可以复习一下这些.用得太少了.
作者: 医生    时间: 2014-2-17 13:02
很好很强大

作者: SJcat    时间: 2014-2-23 18:39
顶个吧顶个吧顶个吧
作者: aliu2000    时间: 2014-2-23 19:28
呵呵。。居然还隐藏
作者: 猫鱼    时间: 2014-2-25 14:27
我把教程看完了,我能看懂mod制作教程了!!我来给楼主评分~
作者: 940258230    时间: 2014-3-26 12:10
..................
作者: 1759760728    时间: 2014-4-8 21:11
灰常好!\(^o^)/~
作者: zoco    时间: 2014-4-8 22:04
Wow good job
作者: mikuand    时间: 2014-4-11 18:49
感谢分享

作者: mikuand    时间: 2014-4-11 18:50
努力学习
作者: xw0y    时间: 2014-5-13 23:01
隐藏内容= =
作者: zx121418zx    时间: 2014-5-16 18:36
回复是一个困难的决定 不过大触膜拜

作者: zx121418zx    时间: 2014-5-16 18:36
回复是一个困难的决定 不过大触膜拜

作者: 1640727878    时间: 2014-6-8 20:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: Bryan33    时间: 2014-7-19 20:11
a.insert(8,"我能看懂mod制作教程了!!");

是在StringBuffer a的第9个字符里插入我能看懂mod制作教程了!!
作者: pdl    时间: 2014-7-19 20:44
好好看 Thinking in Java 吧
作者: Jim_game    时间: 2014-7-21 20:33
好简单.............
作者: tsqdhh2    时间: 2014-7-22 00:27
继续学习
作者: zzymax    时间: 2014-7-25 17:21
看看,字数不够了啊啊啊啊啊啊啊啊啊
作者: wang960909    时间: 2014-7-30 23:01
我要看教程啦,
作者: q549365815    时间: 2014-8-18 23:27
不怎么懂............
作者: a1358996505    时间: 2014-11-1 09:08
谢谢我给你金币吗
作者: ZSYQWEZ    时间: 2014-11-8 23:50
继续看答案的说~
作者: 天鹅    时间: 2014-12-4 20:21
java渣的福音!
作者: 1234567654321    时间: 2015-1-22 20:31
额他们的实现机制一样吗
作者: cheesewoo    时间: 2015-1-29 08:25
dddd111个人创热电厂他
作者: 丶杀老师    时间: 2015-3-8 11:49
看看。。。。。。。。。。。。。。。。
作者: Joe_C    时间: 2015-3-28 21:11
吊吊吊
作者: nemesiszero    时间: 2015-5-2 11:48
Java新跳坑的来看教程了。。。。(差点打成娇喘了...)
作者: tli1998    时间: 2015-5-6 10:57
恩回复支持下~
作者: chillax    时间: 2015-6-13 23:38
水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水
作者: 桃渊林    时间: 2015-6-20 14:08
嗯,猜一猜
1.我把教程看完了,我能看懂mod制作教程了!!我来给楼主评分~
这个代码表示从字符的第八位插入

作者: yhrcyt    时间: 2015-7-5 16:26
回复,可见,……
作者: 1933757130    时间: 2015-7-14 16:35
LZ 能把?.*后面的*属性大全发一下吗,虽然LZ可能不知道我在说什么...我VB用惯了,java的属性很难记得住{:10_493:}
作者: 暗凌    时间: 2015-7-26 19:43
学习学习
作者: yhjj    时间: 2015-8-11 22:15
233333333333333333
作者: 字符菌    时间: 2015-11-17 12:12
不能....
作者: lishao_Gcj    时间: 2015-12-10 21:45
学到东西了
作者: glldc    时间: 2015-12-12 21:11
干嘛隐藏
作者: ws1918827377    时间: 2016-1-30 12:05
的确看的懂了
作者: hueosf    时间: 2016-2-15 11:43
{:10_492:}顶一下,自己学还有很多不懂啊
作者: PermissionDog    时间: 2016-3-19 14:55
好方,每次一到关键的地方就要回复@_@
作者: 旅人E    时间: 2016-4-26 14:33
少走弯路[gold_ore]
作者: GLizxc2    时间: 2016-6-12 22:36
我把教程看完了
作者: chenzetian    时间: 2016-6-20 01:06
前排围观
作者: ningwang    时间: 2016-6-21 21:23
Nice!!!!!!!!!!
作者: hhh_dada_01    时间: 2016-6-21 21:39
我只是来看看隐藏内容,顺便顶一下
作者: 奶油大大    时间: 2016-6-26 02:26
777777777777777777777
作者: taopei    时间: 2016-7-16 15:27
12345678910
作者: asksay    时间: 2016-8-1 19:37
ddd~~~~~~~~~~
作者: 恠丶    时间: 2016-8-12 19:24
教程都要回复。。说声谢谢把
作者: Wisdom_魔洪    时间: 2016-8-15 16:31
这个扩展篇不怎么难- -
作者: 983055238    时间: 2016-8-16 02:37
额!!!!!!!!!!!!!!!!!!!!!
作者: 864597452    时间: 2016-8-31 09:16

回复查看隐藏教程

顺便顶下楼主···
作者: The-PJ    时间: 2016-8-31 12:35
比咱这个小白好多了,起码你现在写的东西都够我慢慢啃了~ 忽然想给各位大神来一组卡牌!嗯,现在就去构思一下。
作者: andylizi    时间: 2016-9-1 18:44
本帖最后由 andylizi 于 2016-9-1 18:54 编辑

StringBuffer在非多线程环境/局部变量中是非常不推荐使用的因为它是线程安全的。所有方法带了同步关键字,效率可能还不如直接 + 操作符呢。在局部变量(这是最常用的情况)或大部分不需要线程安全的环境(例如bukkit中除了带async的操作)中完全可以使用功能与对外接口一模一样的StringBuilder类代替。

另外请问您能不能解释一下这跟concat与 + 有什么区别,为什么要使用。

等等?13年?是哪个家伙把这个坟挖上来的。。。
作者: Frost_MJF    时间: 2016-9-1 21:27
好深奥啊
作者: guan123246895    时间: 2016-9-1 21:59
{:10_492:}
作者: guan123246895    时间: 2016-9-1 22:00
{:10_499:}
作者: guan123246895    时间: 2016-9-1 22:00
{:10_505:}
作者: az860325    时间: 2016-9-2 03:28
教学文就是要先顶一个再说!
作者: 1257375501    时间: 2016-9-2 14:14
就是在,号后面追加
作者: Arobcher    时间: 2016-9-3 10:26
赞!!!!!!!!!!!
作者: 1371002466    时间: 2016-9-19 18:02
saada 213sdadsf
作者: qq9758325    时间: 2016-9-21 19:22
感谢楼主
作者: 鸭蛋只吃黄    时间: 2016-9-23 18:02
楼主的最句后一话实证明力了中的文序顺文字对没有阅读什么响影
作者: xuelang123    时间: 2016-10-1 13:54
又看懂了一个楼主太帅b了
作者: can_nia    时间: 2016-10-2 10:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: 世界边境    时间: 2016-10-24 21:11
感谢楼主!!
作者: suxi520    时间: 2016-11-21 10:26
学习学习每日一些
作者: 孩纸@加醋    时间: 2017-1-2 10:38
小白不敢回答问题,害怕
作者: 石镐    时间: 2017-1-22 08:00
好……看上去挺厉害
作者: 帅比小樊    时间: 2017-2-11 19:43
结果是什么,期待啊!!
作者: 几乎覆盖    时间: 2017-2-14 21:33
顶顶顶,我这个初学者能看懂些
作者: HAHAML    时间: 2017-2-19 13:53
感谢lz的教程、
作者: 502mc    时间: 2017-2-25 21:43
总结出来了
作者: 15932439295    时间: 2017-3-4 00:29
不能
作者: Java_command    时间: 2017-3-5 02:42
等一下……
System.out.println();可以直接输出StringBuffer吗?
我记得一般都要System.out.println(a.toString());
的吧……
作者: zhuzhu505281    时间: 2017-3-5 13:34
谢谢扣字~很棒的教程

作者: nIloy    时间: 2017-3-8 17:51
还要回复
作者: OP1115    时间: 2017-3-12 15:59
6666666666666666666666666