StringBuffer类比String类更高效地存储字符串还是更高效的追加字符串

爱分享的代码君 2011-01-17 02:52:39
在网上找String和StringBuffer区别,发现很多人都说StringBuffer类比String类更高效地存储字符串,但随后又是通过做字符串的追加来说明
我个人认为,存储数据应该是分配内存空间,再把数据存入空间中,表现在代码中应该是给变量赋值,比如 int x = 10;是把一个数据10存储在变量x对应的内存中。
按这样理解话,用String类来存储数据应该是 String x = "abc";StringBuffer类来存储数据应该是StringBuffer x = new StringBuffer("abc");这两种存储方式应该没有效率的高低吧。
在进行字符串追加的时候确实有效率问题,我就不明白,为什么网上的都是说StringBuffer类比String类更高效地存储字符串而不是说更高效的追加字符串呢
纠结中,谁能帮我解惑,谢谢
...全文
497 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cookieweb 2011-01-20
  • 打赏
  • 举报
回复
我也来回一下,我是这样理解的。
如果
String a="stringtest";
String b="addString";
String nStr=a+b;
内存中就产生了a ,b ,nStr三个对象。
StringBuffered sb=new StringBuffered();
sb.appand("stringtest");
sb.appand("addString");
这时内存中只有一个sb对象。他内存占stringtestaddString这么多,而String操作完后内存中有stringtest,addString,stringtestaddString这样String明显的占更多内存,所以效率就很明显了
nuoboxgx 2011-01-19
  • 打赏
  • 举报
回复
这个帖子
属于老生常谈

鉴定完毕
zuxianghuang 2011-01-19
  • 打赏
  • 举报
回复
是追加
bambinoxu 2011-01-19
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
我觉得它说的意思就是追加,就是拼接字符串更高效一下。不过,StringBuilder的效率,比StringBuffer还要高哦,只是StringBulder是非线程安全的。
ousyuryu 2011-01-19
  • 打赏
  • 举报
回复
String具有不变性,对于String你处理后变成新的String

StringBuffer自身是可以改变的

考虑性能有点儿多余了吧


String str1 = "abc";
StringBuffer sb1 = new StringBuffer("abc");
str1.concat("def");
sb1.append("def");
System.out.println("str1=" + str1);
System.out.println("sb1=" + sb1.toString());


结果应该是
str1=abc
sb1=abcdef


dengsf 2011-01-19
  • 打赏
  • 举报
回复
实在不行就看源码吧,别死扣书和老师。

String是不可变的对象,有修改行为的操作都生成新的实例返回。可以将它看成和int、long这些基本类型一样拥有值语义。

StringBuffer、StringBuilder则可对本对象做修改,目的是提高频繁操作的效率。
至于存储效率不是这两个类的目的。实际上,这些类一般会预留多一些的无用空间,以便在频繁操作时减少重分配内存的次数。比如说,原长度是8,append后预计长度是17,则可能会直接分配到32字节,之后append时如不超过32字节就不需重分配内存并复制。类似,Vector、ArrayList等以连续空间存储可变个元素的都用到这些策略。从这点上,存储效率不大可能比String高。
JasonChow0 2011-01-19
  • 打赏
  • 举报
回复
我们都知道字符串其实就是一个char型的数组。而String实现内部是一个不可变的 final char[] 长度等于字符串的长度,字符串对象一旦产生就不可以修改,java的操作符+在连接字符串时被重写,每2个字符串用+号连接一次都会产生一个新的长度等于连接字符串长度之和final char[]为内部实现的新的对象,同样不可修改。每次用+连接都会这样的操作,可想而知如果大量使用+性能消耗就会很大。
而StringBuffer实现的是一个一个可变的 char[] 默认的构造方法是长度为16的数组,如果当前StringBuffer通过append方法加入一个字符串,会先将其加入到char[]数组当中,只用当长度超过了
char[]的长度才会先产生一个新的长度更长的char[]将旧的char[] 数据先复制到新的char[] 中再将字符串放入其中,这样一对比就可以看出来,在进行大量字符串连接的时候 StringBuffer有性能上面的优势。
当然在一定数量级内部2者区别不大,为了表现你对2者的了解,如果刚进公司还是用StringBuffer吧 -_-。
lanjingling539 2011-01-18
  • 打赏
  • 举报
回复
要解决这些问题就必须了解对于String 和StringBuffer的一些区别:
1.Sting是一个不变的对象,一但被创建时就不能在修改它的分配的内存大小,对于已经创建的Sting类的对象进行修改后要保存到一个重新创建的String类对象中去,
2.String类是一个被final修饰的类,是不能被继承的;
3。StringBuffer类是一个可变得对象,当对它进行修改后,不会像String类那样要重新去创建一个对象;
4.StringBuffer类是不能通过一个赋值号给它进行赋值的;
5。在字符串连接中StringBuffer要比String类的效率更高一些,因为String类是不可变的每次对StringBuffer类进行修改时都要进行创建新的对象,原来的对象就没用了,要被垃圾回收掉;这会影响操作效率;
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lanjingling539 的回复:]
要解决这些问题就必须了解对于String 和StringBuffer的一些区别:
1.Sting是一个不变的对象,一但被创建时就不能在修改它的分配的内存大小,对于已经创建的Sting类的对象进行修改后要保存到一个重新创建的String类对象中去,
2.String类是一个被final修饰的类,是不能被继承的;
3。StringBuffer类是一个可变得对象,当对它进行修改后,不会像Strin……
[/Quote]
那也就是说追加效率是StringBuffer的高,存储的效率是一样的咯
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 union2004 的回复:]
引用 7 楼 ouyangqing 的回复:

引用 5 楼 ml_dark 的回复:
一般情况下,各位开发的应用是不用考虑这2者之间的内存消耗以及速率问题的

因为昨天考试出了这道么一道选择题:其中两个选项,一个是stringbuffer比String更高效的追加字符串,一个是stringbuffer比String更高效的存储字符串,
我选的是追加字符串,但老师的标准答案是存储字符串……
[/Quote]

理由呢
  • 打赏
  • 举报
回复
难道就没有人有明确的答案吗
union2004 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ouyangqing 的回复:]

引用 5 楼 ml_dark 的回复:
一般情况下,各位开发的应用是不用考虑这2者之间的内存消耗以及速率问题的

因为昨天考试出了这道么一道选择题:其中两个选项,一个是stringbuffer比String更高效的追加字符串,一个是stringbuffer比String更高效的存储字符串,
我选的是追加字符串,但老师的标准答案是存储字符串,我现在就想搞明白,我的答案到底是对还是错
[/Quote]
你们老师讲错了吧!
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ml_dark 的回复:]
一般情况下,各位开发的应用是不用考虑这2者之间的内存消耗以及速率问题的
[/Quote]
因为昨天考试出了这道么一道选择题:其中两个选项,一个是stringbuffer比String更高效的追加字符串,一个是stringbuffer比String更高效的存储字符串,
我选的是追加字符串,但老师的标准答案是存储字符串,我现在就想搞明白,我的答案到底是对还是错
Gingk0 2011-01-17
  • 打赏
  • 举报
回复
如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高
ml_dark 2011-01-17
  • 打赏
  • 举报
回复
一般情况下,各位开发的应用是不用考虑这2者之间的内存消耗以及速率问题的
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 javaxiaochouyu 的回复:]
在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。这样一来 stringbuffer的效率就比string高。
而做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。
[/Quote]
那就是说存储效率还是String类的高咯
Jeelon 2011-01-17
  • 打赏
  • 举报
回复
在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。这样一来 stringbuffer的效率就比string高。
而做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。
jsut_yi 2011-01-17
  • 打赏
  • 举报
回复
这说的就是追加的时候效率问题吧,光说储存应该没有太大的区别。说的就是追加的时候。
zn85600301 2011-01-17
  • 打赏
  • 举报
回复
用 String 来拼接字符串会浪费很多中间对象的内存
课程目标:学习Java语言中字符串相关的知识、字符编码常识和正则表达式的使用,并完成案例前导课程:《Java工程师必学系列课程》前4部课程内容:本课程是《Java工程师必学系列课程》的第5部分,主要讲解Java语言中字符串相关知识、字符编码常识和正则表达式的使用。本课程涉及的主要内容可以分为四部分:一、StringStringBufferStringBuilder类基本常识、基本原理和使用技巧二、字符编码常识三、Java语言正则表达式的详细语法和使用技巧四、实战案例课程说明:在开发Java程序的过程中,最常用的类莫过于字符串相关的类。可以毫不夸张的说,任何一个Java程序,都离不开对字符串保存和处理。很多学员对字符串的理解只是处于比较粗浅的阶段。殊不知,如果对字符串处理的不好,会影响到软件的运行效率。本课程专门讲解字符串相关的知识,将从字符串存储方式、底层的运行方式等各方面深入讲解其中的原理和技巧。此外,对字符串进行高级的处理,又要用到正则表达式的相关知识。正则表达式广泛应用于各种与字符串处理相关的场合。它是一套独立的语言系统,经过几十年的完善和发展,现在已经非常的强大,并且形成了国际标准。各种高级编程语言,都实现了自己的表达式引擎。本课程详细的讲解了Java语言中正则表达式的语法和使用技巧。掌握了正则表达式,对编程水平的提高有非常大的帮助!同时,本课程在最后一部分,安排了非常精彩的、完整的实战案例,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握字符串处理及正则表达式相关的系统知识,并能提高实际的编码水平。环境配置要求:学习本课程需安装JDK1.8或高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或高版本的开发工具。    因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

62,615

社区成员

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

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