1. String字符串不可变,要可变就会用到StringBuffer或StringBuilder;
2. StringBuffer支持并发操作,线程安全的,适合多线程中使用;
3. StringBuilder不支持并发操作,线程不安全的,不适合多线程中使用;
4. 不必考虑到线程同步问题,我们应该优先使用StringBuilder;
5. 如果要保证线程安全,自然是StringBuffer;
6.测试:
public class StringTest {
public static String BASEINFO = "Mr.Y";
public static final int COUNT = 2000000;
/**
* 执行一项String赋值测试
*/
public static void doStringTest() {
String str = new String(BASEINFO);
long starttime = System.currentTimeMillis();
for (int i = 0; i < COUNT / 100; i++) {
str = str + "miss";
}
long endtime = System.currentTimeMillis();
System.out.println((endtime - starttime)
+ " millis has costed when used String.");
}
/**
* 执行一项StringBuffer赋值测试
*/
public static void doStringBufferTest() {
StringBuffer sb = new StringBuffer(BASEINFO);
long starttime = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
sb = sb.append("miss");
}
long endtime = System.currentTimeMillis();
System.out.println((endtime - starttime)
+ " millis has costed when used StringBuffer.");
}
/**
* 执行一项StringBuilder赋值测试
*/
public static void doStringBuilderTest() {
StringBuilder sb = new StringBuilder(BASEINFO);
long starttime = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
sb = sb.append("miss");
}
long endtime = System.currentTimeMillis();
System.out.println((endtime - starttime)
+ " millis has costed when used StringBuilder.");
}
/**
* 测试StringBuffer遍历赋值结果
*
* @param mlist
*/
public static void doStringBufferListTest(List<String> mlist) {
StringBuffer sb = new StringBuffer();
long starttime = System.currentTimeMillis();
for (String string : mlist) {
sb.append(string);
}
long endtime = System.currentTimeMillis();
System.out.println(sb.toString() + "buffer cost:"
+ (endtime - starttime) + " millis");
}
/**
* 测试StringBuilder迭代赋值结果
*
* @param mlist
*/
public static void doStringBuilderListTest(List<String> mlist) {
StringBuilder sb = new StringBuilder();
long starttime = System.currentTimeMillis();
for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) {
sb.append(iterator.next());
}
long endtime = System.currentTimeMillis();
System.out.println(sb.toString() + "builder cost:"
+ (endtime - starttime) + " millis");
}
public static void main(String[] args) {
doStringTest();
doStringBufferTest();
doStringBuilderTest();
List<String> list = new ArrayList<String>();
list.add(" I ");
list.add(" like ");
list.add(" BeiJing ");
list.add(" tian ");
list.add(" an ");
list.add(" men ");
list.add(" . ");
doStringBufferListTest(list);
doStringBuilderListTest(list);
}
}
看一下执行结果:
2711 millis has costed when used String.
211 millis has costed when used StringBuffer.
141 millis has costed when used StringBuilder.
I like BeiJing tian an men . buffer cost:1 millis
I like BeiJing tian an men . builder cost:0 millis
构造方法
方法名 | 说明 |
---|---|
StringBuffer() | 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。 |
StringBuffer(CharSequence seq) | public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。 |
StringBuffer(int capacity) | 构造一个不带字符,但具有指定初始容量的字符串缓冲区。 |
StringBuffer(String str) | 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。 |
方法摘要
返回值 | 方法名 | 说明 |
---|---|---|
StringBuffer | append(boolean b) | 将 boolean 参数的字符串表示形式追加到序列 |
StringBuffer | append(char c) | 将 char 参数的字符串表示形式追加到此序列 |
StringBuffer | append(char[] str) | 将 char 数组参数的字符串表示形式追加到此序列 |
StringBuffer | append(char[] str, int offset, int len) | 将 char 数组参数的子数组的字符串表示形式追加到此序列 |
StringBuffer | append(CharSequence s) | 将指定的 CharSequence 追加到该序列 |
StringBuffer | append(CharSequence s, int start, int end) | 将指定 CharSequence 的子序列追加到此序列 |
StringBuffer | append(double d) | 将 double 参数的字符串表示形式追加到此序列 |
StringBuffer | append(float f) | 将 float 参数的字符串表示形式追加到此序列 |
StringBuffer | append(int i) | 将 int 参数的字符串表示形式追加到此序列 |
StringBuffer | append(long lng) | 将 long 参数的字符串表示形式追加到此序列 |
StringBuffer | append(Object obj) | 追加 Object 参数的字符串表示形式 |
StringBuffer | append(String str) | 将指定的字符串追加到此字符序列 |
StringBuffer | append(StringBuffer sb) | 将指定的 StringBuffer 追加到此序列中 |
StringBuffer | appendCodePoint(int codePoint) | 将 codePoint 参数的字符串表示形式追加到此序列 |
int | capacity() | 返回当前容量 |
char | charAt(int index) | 返回此序列中指定索引处的 char 值 |
int | codePointAt(int index) | 返回指定索引处的字符(统一代码点) |
int | codePointBefore(int index) | 返回指定索引前的字符(统一代码点) |
int | codePointCount(int beginIndex, int endIndex) | 返回此序列指定文本范围内的统一代码点 |
StringBuffer | delete(int start, int end) | 移除此序列的子字符串中的字符 |
StringBuffer | deleteCharAt(int index) | 移除此序列指定位置的 char |
void | ensureCapacity(int minimumCapacity) | 确保容量至少等于指定的最小值 |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将字符从此序列复制到目标字符数组 dst |
int | indexOf(String str) | 返回第一次出现的指定子字符串在该字符串中的索引 |
int | indexOf(String str, int fromIndex) | 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引 |
StringBuffer | insert(int offset, boolean b) | 将 boolean 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, char c) | 将 char 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, char[] str) | 将 char 数组参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int index, char[] str, int offset, int len) | 将数组参数 str 的子数组的字符串表示形式插入此序列中 |
StringBuffer | insert(int dstOffset, CharSequence s) | 将指定 CharSequence 插入此序列中 |
StringBuffer | insert(int dstOffset, CharSequence s, int start, int end) | 将指定 CharSequence 的子序列插入此序列中 |
StringBuffer | insert(int offset, double d) | 将 double 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, float f) | 将 float 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, int i) | 将 int 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, long l) | 将 long 参数的字符串表示形式插入此序列中 |
StringBuffer | insert(int offset, Object obj) | 将 Object 参数的字符串表示形式插入此字符序列中 |
StringBuffer | insert(int offset, String str) | 将字符串插入此字符序列中 |
int | lastIndexOf(String str) | 返回最右边出现的指定子字符串在此字符串中的索引 |
int | lastIndexOf(String str, int fromIndex) | 返回最后一次出现的指定子字符串在此字符串中的索引 |
int | length() | 返回长度(字符数) |
int | offsetByCodePoints(int index, int codePointOffset) | 返回此序列中的一个索引,该索引是从给定 index 偏移 codePointOffset 个代码点后得到的 |
StringBuffer | replace(int start, int end, String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符 |
StringBuffer | reverse() | 将此字符序列用其反转形式取代 |
void | setCharAt(int index, char ch) | 将给定索引处的字符设置为 ch |
void | setLength(int newLength) | 设置字符序列的长度 |
CharSequence | subSequence(int start, int end) | 返回一个新的字符序列,该字符序列是此序列的子序列 |
String | substring(int start) | 返回一个新的 String,它包含此字符序列当前所包含的字符子序列 |
String | substring(int start, int end) | 返回一个新的 String,它包含此序列当前所包含的字符子序列 |
String | toString() | 返回此序列中数据的字符串表示形式 |
void | trimToSize() | 尝试减少用于字符序列的存储空间 |