A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangyinhui 中级黑马   /  2013-4-2 21:52  /  2944 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangyinhui 于 2013-4-4 17:38 编辑

请问StringBuilder和StringBuffer与String的区别分别是什么啊?

7 个回复

倒序浏览
视频上面应该有它们的区别..
回复 使用道具 举报
String是不可变的,StringBuffer是可变的;StringBuffer是线程安全的,StringBuilder是非线程安全的。
因为String是不可变的(通过ide的debugger可以发现其属性大都为final类型),因此每次对其操作改变其变量值,其实是生成一个新的对象,然后将变量引用指向新对象;因此速度慢。

StringBuffer不同,对其操作即直接操作对象指向的引用,不产生新对象,速度很快;它是线程安全的,在维护多线程的同步等也会消耗一点性能。

StringBuilder,用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
回复 使用道具 举报
你在jdk文档中可以看到,String是一个final类,不可变。StringBuilder和StringBuffer则可以动态改变字符串。StringBuilder不是线程安全的,不用进行安全检查,所以执行效率较高,StringBuffer 则需要进行安全检查,在单线程中,仍然有安全检查,所以就是多余的执行,效率也就下降了。
回复 使用道具 举报
请问StringBuilder和StringBuffer与String的区别分别是什么啊?

StringBiulder与StringBuffer的区别其实就是一个是同步的,一个是不同步的,说简单的就是一个是安全的,一个是不安全的
至于安全与不安全就在于多线程的时候,当使用多线程的时候,StringBuilder因为是同步的,所以就安全些,而StringBuffer不是多线程的
所以就不太安全,建议多线程的时候使用StringBuilder安全,而单线程的时候使用StringBuffer,效率高。

而String与二者的区别在于前两者存储的字符是可变的,而String  new出来的字符是不可变的,有句是这么说的,字符串最大的特点就在于
一旦被初始化就不能被改变。

比如这样,
StringBuffer sb = new StringBuffer();
StringBuilder sb2 = new StringBuilder();                 
String str = "dafeqe";
sb.apend("dafdaf");
sb.apend("dafeefdaf");

sb2.apend("dafeefdaf");
sb2.apend("dafeefdaf");

str = "dafeqfedafeef";

这里的sb与sb2其实是一个对象,而str其实是两个对象了。

其实StringBufffer与StringBuilder还是容器,基本上什么东西都可以往里面存储。也就是缓冲区。




回复 使用道具 举报
我给你看下API上的解释,清清楚楚明明白白
String
  1. public final class String  extends Object  implements Serializable, Comparable<String>, CharSequence
  2. String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
  3. 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
  4.      String str = "abc";
  5. 等效于:
  6.      char data[] = {'a', 'b', 'c'};
  7.      String str = new String(data);
复制代码
StringBuffer
  1. public final class StringBuffer
  2. extends Object
  3. implements Serializable, CharSequence

  4. 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
  5. 可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
  6. StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
复制代码
StringBuilder
  1. public final class StringBuilder
  2. extends Object
  3. implements Serializable, CharSequence
  4. 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
  5. 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。
复制代码
回复 使用道具 举报


String其实是final类型,在内存中创建不能改变这样比较占用内存,所以就建立一个字符串缓冲区(容器)来放置字符串,通过字符串缓冲区提供方的方法就可以对字符串进行增删查改,而StringBuilder和StringBuffer就是这样的字符串缓冲区。
StringBuffer: 是线程同步的(就是有锁),返回类型是StringBuffer
StringBuilder:是线程不同步的,其实他是StringBuffer的简易替代。
他两个的使用情况:
如果操作是多线程的为了保证字符串的不错乱要用StringBuffer,既是线程同步。由于每次执行都要进行同步(锁)判断 所以效率比较低。
如果操作是单线程的建议用StringBuilder,因为他不执行同步所以效率比较高。
回复 使用道具 举报
Yaphets 中级黑马 2013-12-26 00:58:13
8#
唐永康 发表于 2013-4-2 22:48
StringBiulder与StringBuffer的区别其实就是一个是同步的,一个是不同步的,说简单的就是一个是安全的,一 ...

你说反了吧,StringBilder是非线程安全的,StringBuffer是线程安全的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马