String、StringBuilder、StringBuffer的区别

来源:互联网 发布:小米电视怎么样 知乎 编辑:程序博客网 时间:2024/06/08 07:28

  三者的区别,简单来讲:

String: 字符串常量
StringBuffer: 字符串变量(线程安全)
StringBuilder: 字符串变量(非线程安全

1.String类型

  从概念上讲,Java字符串就是Unicode字符串序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String
  String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响。
  而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用
  一定不要用==运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上。

String greeting="Hello";if(greeting=="Hello"){    /*有可能为true**/}if(greeting.substring(0,3)=="Hel"){    /*有可能为false**/}/*所以对于空字符串的检测尽量使用equals()方法来比较**//*有时要检查一个字符串既不是null也不为空串,这时要使用以下条件:**/if(str != null && !str.equals(""))

  在大部分情况下 StringBuffer > String

2.StringBuffer

  Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
  StringBuffer 上的主要操作是 appendinsert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符
  例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append(“le”) 会使字符串缓冲区包含“startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之包含“starlet”。
  在大部分情况下 StringBuilder > StringBuffer

3.StringBuilde

  java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同
查看更多文章,请访问www.wangchuangshi.com
在此附上String API 以及StringBuilder API(StringBuffer API 与其基本相同)

String API
- 1.char charAt (int index)
返回给定位置的代码单元。除非对底层的代码单元感兴趣,否则不需要调用这个方法。
- 2.int codePointAt(int index) 5.0
返回从给定位置开始的码点。
- 3.int compareTo(String other)
按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。
- 4.boolean equals(Object other)
如果字符串与other相等,返回true。
- 5.boolean equalsIgnoreCase(String other)
如果字符串与other相等(忽略大小写),返回true。
- 6.boolean startsWith(String prefix)
- 7.boolean endsWith(String suffix);
如果字符串以suffix开头或结尾,则返回true。
- 8.int indexOf(String str)
- 9.int indexOf(String str,int fromIndex)
- 10.int indexOf(int cp)
- 11.int indexOf(int cp,int fromIndex)
返回与字符串str或代码点cp匹配的第一个子串的开始位置。这个位置从索引0或fromIndex开始计算。如果在原始串中不存在str,返回-1。
- **12.int length()
返回字符串的长度**
- 13.String replace(CharSequence oldString,CharSequence new String)
返回一个新字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuffer对象作为CharSeqence参数。
- 14.String substring(int beginIndex)
- 15.String substring(int beginIndex,int endIndex)
返回一个新字符串。这个字符串用包含原始字符串中从beginIdex到串尾或endIndex-1的所有代码单元。
- 16.String toLowerCase()
- 17.String toUpperCase()
- 18.trim()
返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。
- 19.String join(CharSequence delimiter,CharSequence…elements) 8
返回一个新字符串,用给定的定界符连接所有元素。

以下是StringBuilder API

StringBuilder API
- **1.StringBuilder()
构造一个空的字符串构建器。**
- 2.int length()
返回构建器或缓冲器中的代码单元数量。
- **3.StringBuilder append(String str)
追加一个字符串并返回this。**
- 4.StringBuilder append(char c)
追加一个代码单元并返回this。
- 5.StringBuilder appendCodePoint(int cp)
追加一个代码点,并将其转换为一个或两个代码单元并返回this
- 6.void setCharAt(int i,char c)
将第i个代码单元设置为c。
- 7.StringBuilder inset(int offset,String str)
在offset位置插入一个字符串并返回this。
- 8.StringBuilder delete(int startIndex,int endIndex)
删除偏移量从startIndex到-endIndex-1的代码单元并返回this。
- **9.String toString()
返回一个与构建器或缓冲器内容相同的字符串。**