java-StringBuilder
StringBuilder类的理解
- 一个可变的字符序列。此类提供一个与 StringBuffer兼容的APl,但不保证同步( String Builder不是线程安全)。该类被设计用作 String Buffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 String Buffer要快
- 在 StringBuilder上的主要操作是 append和 insert方法,可重载这些方法,以接受任意类型的数据。
- StringBuffer的直接父类是 Abstract String Builder
- String Buffer实现了 Serializable,即 String Buffer的对象可以串行化
- 在父类中 AbstractString Builder有属性char[]value,不是 final。该 value数组存放字符串内容,引出存放在堆中
- StringBuffer是一个fina类,不能被继承
- 因为 StringBuffer字符内容是存在 char[]value,所有在变化(增加/删除)不用每次都更换地址(即不是每次创建新对象),所以效率高于 String
StringBuffer、StringBuilder和String的比较
- String Builder和 String Buffer非常类似,均代表可变的字符序列,而且方法
也一样 - String:不可变字符序列效率低但是复用率高。
- String Buffer:可变字符序列、效率较高(增删)、线程安全看源码
- String Builder:可变字符序列、效率最高、线程不安全
- String使用注意说明
- string s=“a”;//创建了一个字符串
- s+=“b”;//实际上原来的"a"字符串对象已经丟弃了,现在又产生了一个字符串s+“b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能=>结论:如果我们对 String做大量修改,不要使用 String
StringBuffer、StringBuilder和String的选择
- 使用的原则
- 如果字符串存在大量的修改操作,一般使用 String Buffer或 String Builder
- 如果字符串存在大量的修改操作,并在单线程的情况使用 String Builder
- 如果字符串存在大量的修改操作,并在多线程的情况使用 String Buffer
- 如果我们字符串很少修改,被多个对象引用,使用tng,比如配置信息等