String、StringBuilder、StringBuffer

StringBuilder:

public final class StringBuilder extends AbstractStringBuilder implements Serializable, CharSequence{}

  StringBuilder是一个可变的字符序列。这个类与StringBuffer兼容,但是不保证同步。这个类可以作为StringBuffer的代替,被设计用于单线程使用的字符串缓冲区。建议优先使用StringBuilder,因为在大多数实现中它将更快。

  StringBuilder上的主要操作是#append和#insert方法,它们被重载以便接受任何类型的数据。可以有效地将给定的数据转换为字符串,然后将该字符串的字符append或insert到字符串生成器中。#append方法总是在生成器的末尾添加这些字符;insert方法在指定位置添加这些字符。

  例如,如果sb指的是当前内容为“start”的StringBuilder对象,那么调用方法sb.append(“le”)将使字符串生成器内容为“startle”,而z.insert(4,“le”)将更改字符串生成器内容为“starlet”。通常,如果sb是StringBuilder的实例,那么sb.append(x)和sb.insert(sb.length,x)有相同的效果。

  每个字符串生成器都有容量。只要字符串生成器中包含的字符序列的长度不超过容量,就没有必要分配新的内部缓冲区。如果内部缓冲区溢出,则自动生成较大的缓冲区。默认构造器public StringBuilder() 的初始化容量是16(java 1.8),你可以使用public StringBuilder(int capacity)构造器实例化对象并指定初始化容量。

  StringBuilder的实例对于多线程使用是不安全的。如果需要保证同步,那么建议使用StringBuffer。

StringBuffer:

public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence{}

  StringBuffer是一个可变的、线程安全的字符序列。一个string buffer类似于一个String,但是它是可以被修改的。它包含一些特定的字符序列,但是序列的长度和内容可以通过调用某些方法改变。

  在多线程情况下使用StringBuffer是安全的。方法是同步的,以便任何特定实例上的所有操作都表现得好像它们以某种串行顺序发生一样,该顺序与每个所涉及的单个线程的方法调用顺序一致。

  从发布JDK 5开始,这个类补充了一个等效类StringBuilder,该类设计用于单个线程。通常应该优先使用StringBuilder这个类,因为它支持所有相同的操作,因为它更快,但是它不执行同步。

  每当出现涉及源序列-source sequences(例如从源序列append或insert)的操作时,该类只在执行操作的字符串缓冲区(string buffer)上进行同步,而不在源上进行同步。请注意,虽然StringBuffer被设计为能够安全地从多个线程并发使用,但如果构造函数或追加、插入操作传递了一个跨线程共享的源序列,则调用代码必须确保该操作具有源序列操作的持续时间。

String:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence{}

  Strings是常量;它们的值在创建之后不能更改。String buffers支持可变字符串。因为String对象是不可变的,所以它们可以被共享。例如:

  String str = "abc";
  等价于
  char data[] = {'a', 'b', 'c'};
  String str = new String(data);

 

posted @ 2018-12-04 18:38  maxudong  阅读(156)  评论(0编辑  收藏  举报