String、StringBuilder、StringBuffer
类 | String | SitrngBuffer | StringBuilder |
---|---|---|---|
描述 | String是常量值是不可变的,导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间,因为String类有final关键字 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 | 可变类,与StringBuffer用法相同,但是线程不安全,所以速度更快 |
线程安全 | 安全 | 不安全 | |
不可变 | 可变 | 可变 |
因为StringBuffer与StringBuilder的基本用法相同本文只介绍一种
String类概述:是一个不可变的字符串
StringBuilder类概述:是一个可变的字符串。
StringBuilder类构造方法
* StringBuilder(String str) 将不可变字符串转可变字符串
StringBuilder类成员方法
* StringBuilder append(数据类型 变量名) 追加内容
* String toString(); 将可变字符串转为不可变字符串
String和StringBuilder的选择
* 如果需要执行拼接操作,使用StringBuilder
* 如果不需要执行拼接操作,则使用String
示例代码
public class StringBuilderDemo01 {
public static void main(String[] args){
// StringBuilder类基本使用
test01();
// String和StringBuilder字符串拼接性能测试
test02();
}
// String和StringBuilder字符串拼接性能测试
public static void test02(){
long start = System.currentTimeMillis();
String str = "abc";
for (int i = 0; i < 10000 ; i++) {
str+=i;
}
System.out.println(System.currentTimeMillis() - start); // 183
start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("abc");
for (int i = 0; i < 10000 ; i++) {
sb.append(i);
}
System.out.println(System.currentTimeMillis() - start); // 3
}
// StringBuilder类基本使用
public static void test01(){
// 字符串
String str = new String("abc");
// 执行字符串拼接
str += "def";
str += "xxx";
str += 123;
System.out.println(str);
// 如果需要做大量的字符串拼接操作,则强烈推荐使用StringBuilder
StringBuilder sb = new StringBuilder("abc");
// 执行字符串拼接操作
// 链式编程:如果一个方法的返回值类型仍然是一个引用数据类型,则可以继承调用该类型的方法。
sb.append("def").append("xxx").append(123);
System.out.println(sb.toString());
}
}