Java语言中String 、StringBuffer 、StringBuilder的区别

来源:互联网 发布:自考计算机本科 知乎 编辑:程序博客网 时间:2024/06/09 22:55

String 、StringBuffer 、StringBuilder的区别


一:通过官方API Java SE 开发人员文档得到的定义

String的定义

public final class String extends Object implements Serializable, Comparable<String>,CharSequence
The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class. Strings are constant; their values cannot be changed after they are created. (String 类表示字符串。Java程序中的所有字符串,如“ABC”,是实现这个类的实例。字符串是常量,在创建后,它们的值是不能改变的。)

StringBuffer 的定义:

public final class StringBuffer extends Object implements Serializable, CharSequence
A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified. At any point in time it contains some particular sequence of characters, but the length and content of the sequence can be changed through certain method calls.(一个线程安全的,字符的可变序列。StringBuffer
就像一个字符串,但可以修改。在任何时候,它包含一些特定的字符序列,但序列的长度和内容可以通过某些方法调用来改变。)

 StringBuilder 的定义:

public final class StringBuilder extends Object implements Serializable, CharSequence
A mutable sequence of characters. 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,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。)


二:共同点

⑴ String,StringBuffer,StringBuilder 都是Java标准库提供的类,可以储存和操作字符串。

⑵ String,StringBuffer,StringBuilder 都实现了Serializable接口和CharSequence接口。


三:不同点

⑴ String类的数值是不可变的。StringBuffer类和StringBuilder类的数值是可变的。
⑵ String类实现了Comparable<String>类,StringBuffer类和StringBuilder类没有实现Comparable<String>接口。
⑶ String类重写了父类中equals的方法,StringBuffer类和StringBuilder类没有重写了父类中equals的方法。

                String str = new String("123");String str2 = new String("123");System.out.println(str.equals(str2));//实际上比较的是数值,执行的结果为true

StringBuffer stringBuffer =new StringBuffer("abc");StringBuffer stringBuffer2 =new StringBuffer("abc");System.out.println(stringBuffer.equals(stringBuffer2));//实际上比较的是对象,执行的结果为false

StringBuilder stringBuilder =new StringBuilder("xyz");StringBuilder stringBuilder2 =new StringBuilder("xyz");System.out.println(stringBuilder.equals(stringBuilder2));//实际上比较的是对象,执行的结果为false

⑷ String类重写了父类中hashCode的方法,StringBuffer类和StringBuilder类没有重写了父类中hashCode的方法。这样会导致将StringBuffer类或StringBuilder类的对象存储进入集合类(Collection类)时会出现意料之外的问题。          

                ------------------集合List 的情况------------------

                List<StringBuffer> lists = new ArrayList<StringBuffer>();StringBuffer stringBuffer =new StringBuffer("abc");lists.add(stringBuffer);stringBuffer.append("xyz");lists.add(stringBuffer);System.out.println(lists);//执行后的打印结果,[abcxyz, abcxyz]//留一个思考:为什么执行后的打印结果不是:[abc][abcxyz]

               ------------------集合Set 的情况------------------

                Set<StringBuilder> set = new HashSet<StringBuilder>();StringBuilder stringBuilder =new StringBuilder("abc");set.add(stringBuilder);stringBuilder.append("xyz");set.add(stringBuilder);System.out.println(set);//执行后的打印结果:[abcxyz]//留一个思考:为什么执行后的打印结果不是:[abc][abcxyz]

⑸运行速度的比较:String类速度最慢(效率最低),StringBuffer类速度略快(效率略快),StringBuilder类速度最快(效率最快)。

               ------------------String类执行速度的情况------------------

        static long startTime;static long endTime;public static void main(String[] args) {startTime=System.currentTimeMillis();String str= new String();for (int i = 0; i < 20000; i++) {str+=i;}endTime=System.currentTimeMillis();System.out.println(endTime-startTime);//执行时间:1891ms}

             ------------------StringBuffer类执行速度的情况------------------

static long startTime;static long endTime;public static void main(String[] args) {startTime=System.currentTimeMillis();StringBuffer stringBuffer= new StringBuffer();for (int i = 0; i < 20000; i++) {stringBuffer.append(i);}endTime=System.currentTimeMillis();System.out.println(endTime-startTime);//执行时间:19ms}

             ------------------StringBuilder类执行速度的情况------------------

        static long startTime;static long endTime;public static void main(String[] args) {startTime=System.currentTimeMillis();StringBuilder stringBuilder= new StringBuilder();for (int i = 0; i < 20000; i++) {stringBuilder.append(i);}endTime=System.currentTimeMillis();System.out.println(endTime-startTime);//执行时间:17ms}

⑹线程安全的比较:

String类:具有不可改变的特性,线程安全。
StringBuffer类: 内部的方法用了synchronized修饰,线程安全。
StringBuilder类:内部的方法没有用synchronized修饰,线程不安全。

⑺使用原则:

操作少量或不变的数据,用String。
单线程操作大量数据,用StringBuilder。
多线程操作大量数据,用StringBuffer。




1 0
原创粉丝点击