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的追加方法.
代码示例
- public class book {
-
- public static void main(String[] args)
- {
- StringBuffer a=new StringBuffer("我把教程看完了,");
- a.append("我能看懂mod制作教程了!!");
- a.append("我来给楼主评分~");
- System.out.println(a);
- }
- }
复制代码 输出结果
我把教程看完了,我能看懂mod制作教程了!!我来给楼主评分~
StringBuffer 插入
代码示例
- public class book {
-
- public static void main(String[] args)
- {
- StringBuffer a=new StringBuffer("我把教程看完了,我来给楼主评分~");
- a.insert(8,"我能看懂mod制作教程了!!");
- System.out.println(a);
- }
- }
复制代码
输出结果和上面是一样的,有人能总结出上面的各个量的含义吗?
变量名.insert(int,添加的字符)
int是在第某位前面添加,值得注意的是,和前面的一样,是从0开始数位。
StringBuffer颠倒
代码示例
- public class book {
-
- public static void main(String[] args)
- {
- StringBuffer a=new StringBuffer("~分评主楼给来我!!了程教作制dom懂看能我,了完看程教把我");
- a.reverse();
- System.out.println(a);
- }
- }
复制代码 把字符顺序颠倒,输出和之前的一样。
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快的多。
测试代码:
- public class MainTest {
- public static void main(String[] args) {
- long l=System.currentTimeMillis();
- StringBuffer stringBuffer = new StringBuffer();
- for (int i=0;i<1000000;i++){
- stringBuffer.append(i);
- }
- System.out.println("buffer.append:"+(System.currentTimeMillis()-l) + "ms");
- l=System.currentTimeMillis();
- stringBuffer.toString();
- System.out.println("buffer.toString:"+(System.currentTimeMillis()-l) + "ms");
- l=System.currentTimeMillis();
- StringBuilder stringBuilder = new StringBuilder();
- for (int i=0;i<1000000;i++){
- stringBuilder.append(i);
- }
- System.out.println("builder.append:"+(System.currentTimeMillis()-l) + "ms");
- l=System.currentTimeMillis();
- stringBuilder.toString();
- System.out.println("builder.toString:"+(System.currentTimeMillis()-l) + "ms");
- }
- }
复制代码 测试结果:
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