黑马程序员技术交流社区
标题:
关于String类,StringBuffer类,StringBuilder的区别
[打印本页]
作者:
nihaoshitou
时间:
2013-5-12 20:17
标题:
关于String类,StringBuffer类,StringBuilder的区别
本帖最后由 nihaoshitou 于 2013-5-15 16:47 编辑
越详细越好,谢谢了!
作者:
xingyuewuqing
时间:
2013-5-12 20:26
ava.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。StringBuffer 上的主要操作是 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) 具有相同的效果。只要发生有关源序列(如在源序列中追加或插入)的操作,该类就只在执行此操作的字符串缓冲区上而不是在源上实现同步。每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 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) 具有相同的效果。 每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
作者:
fjl_fight
时间:
2013-5-12 20:40
本帖最后由 fjl_fight 于 2013-5-12 20:44 编辑
1、StringBuilder 和StringBuffe 首先在用法上差不多
2、StringBuilder是非线程安全(异步)的,效率比 StringBuffer高,如果一个字符变量是在方法里定义(此种情况只有一个线程访问它),不存在线程安全问题,则用之。
3、如果在类中定义的是成员变量,且该实例会在多线程下使用那么用StringBuffer
作者:
小臣
时间:
2013-5-12 20:46
1,对于String来说,相对于其他两者来说是慢很多的,并且产生比较多的垃圾,这是很多好的程序都不想得到的结果。因为产生垃圾之后,GC会在一定的条件情况下出来进行垃圾清理,从而拖慢速度。
2,StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)jdk1.5的新特性
作者:
xiewen
时间:
2013-5-15 00:29
String类是不可变类,就是说:如果String类型的变量的值改变时,就又会生成一个对象。如果一个String变量的值总是改变就会在内存中产生多个对象。
StringBuffere类和StringBuilder都是可变类,也属于容器类。如果一个字符串的值需要改变多次(如字符串拼接)就应该用这两个类中的其中一个,这样就不会在内存中产生多个对象,提高性能。
StringBuffere是JDK1.0开始,是线程安全的,效率低
StringBuilder是jDK1.5开始,线程不安全的,效率高
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2