String和StringBuffer、StringBuilder的区别

原创 2017年01月03日 22:54:53
基本数据类型包括byteintcharlongfloatdoublebooleanshort

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。
为了提高效率节省空间,我们应该用StringBuffer类 。

JAVA平台提供了两个类:String和StringBuffer
它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一StringBuffer sbf = new StringBuffer();
for(int i=0;i<100;i++) {
sbf.append(i);
}代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。

String str = new String();  
for(int i=0;i<100;i++) {
    str = str + i;
}

String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

在讲两者区别时,应把循环的次数搞成10000,然后用endTime-beginTime来比较两者执行的时间差异,最后还要讲讲StringBuilder与StringBuffer的区别。(区别如下)
StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容,可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。(从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。)
StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。(如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。但将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 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) 具有相同的效果。只要发生有关源序列(如在源序列中追加或插入)的操作,该类就只在执行此操作的字符串缓冲区上而不是在源上实现同步。

版权声明:回头看走过的路,片片落叶旋过眼前。

String,StringBuffer,StringBuilder 三者之间的区别是什么?

1.String 字符串产量 2.StringBuffer 字符串变量(线程安全) 3.StringBuilder 字符串变量 (非线程安全) 1.String类型,是java内的对象,...
  • qq_30278639
  • qq_30278639
  • 2016年05月10日 14:09
  • 854

Java基础之String、StringBuffer与StringBuilder的区别及应用场景

1 String、StringBuffer与StringBuilder (1)String 字符串常量; /** Strings are constant; their values cann...
  • chenliguan
  • chenliguan
  • 2016年07月14日 18:35
  • 6253

String、Stringbuffer与Stringbuilder的区别

1、在执行速度上:Stringbuilder->Stringbuffer->String 2、String是字符串常量       Stringbuffer是字符串变量       String...
  • u011247942
  • u011247942
  • 2017年06月22日 15:03
  • 211

Java中String、StringBuffer、StringBuilder简述及区别

容我喝杯82年的Java压压惊~~~如有欢迎指正。 1.String:由多个字符组成的一串数据,相当与...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016年05月10日 23:35
  • 1366

C#:string、stringBuffer、stringBuilder的区别

最近对这几个傻傻分不清楚,在网上搜集了一些资料,现在总结一下。 string是基本类型,第一条语句,实际上是创建一个名为s1的string类型的对象,系统为s1分配足够的内存来保存s1中的数据。第二条...
  • qq_28187979
  • qq_28187979
  • 2017年08月03日 09:59
  • 1246

面试题之:String,StringBuffer与StringBuilder的区别?

String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)  简要的说, String 类型和 StringBuffer 类...
  • u014381710
  • u014381710
  • 2015年08月24日 23:23
  • 429

StringBuffer 与 StringBuilder 区别与联系及源码分析

StringBuffer和StringBuilder的共同点: 1、都是用于操作字符串,使用这两个而不使用String的原因是因为String是Final类型,当对字符串操作较多时采用Str...
  • u010854517
  • u010854517
  • 2017年03月08日 10:07
  • 229

java面试题String,StringBuilder,StringBuffer

String StringBuffer StringBuilder面试题
  • dfdsggdgg
  • dfdsggdgg
  • 2016年05月09日 22:39
  • 2749

String StringBuilder StringBuffer三者的特点与及速度阐述

String StringBuilder StringBuffer第1点 String是一个字符串常量,所以他是不可变的。第2点 StringBuilder线程不安全,但是速度最快。第3点 S...
  • u012429294
  • u012429294
  • 2017年03月11日 20:16
  • 256

Java中String、StringBuilder和StringBuffer的简单区别

String、StringBuilder和StringBuffer的简单区别如下: String:不可变的对象,对String对象进行改变的时候等同于生成了一个新的String对象,然后将引用指向...
  • ClementAD
  • ClementAD
  • 2015年01月17日 14:40
  • 1118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:String和StringBuffer、StringBuilder的区别
举报原因:
原因补充:

(最多只允许输入30个字)