String
- String只能赋值一次,每一次内容发生改变都会生成一个新的对象,然后原有对象引用新的对象,所以说String本身是不可以改变的。每一次生成新的对象都会对系统性能产生影响,会降低java虚拟机的工作效率。
StringBuffer和StringBuilder
-
这两个都有toString()方法,可以返回字符序列的字符串表现形式
-
初始化时可以通过字符串作为参数,指定初始化的字符序列内容
-
这两个每次操作都是对自身对象的操作,并不会生成新的对象,其所占空间会随着字符内容的增加而扩充,做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。
-
不同点是:
-
StringBuffer的方法都使用了“synchronize”关键字修饰,即线程安全;
-
StringBuilder不具备这样特点,没有线程安全机制,所以运行效率会比StringBuffer高。
API
- StringBuffer和StringBuilder两者的API完全一致,只是为了提高效率而放弃了线程安全机制。
- append()
将参数转换为字符串,将所得字符串中的字符追加到此序列中
字符串大量拼接时用String的“+”效率低,可以使用StringBuilder调用append()方法,效率高。
在这里插入代码片
- setCharAt(int index,Char ch)
将给定索引处的字符修改为ch- insert(int offset,String str)
将字符串插入到指定索引处,顺延- reverse()
将字符串反序输出- delete(int start,int end)
从start索引处开始,一直到end-1(包头不包尾)处,移除这些字符。如果end-1超出索引范围,则一直到序列尾部。- 这两者还有类似String的方法
length()
charAt()
indexOf()
lastIndexOf()
substring()
replace()
关于大量字符串拼接的效率验证
public static void main(String[] args) {
String str = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i <= 10000; i++) {
str += i;
}
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
System.out.println(time);
StringBuilder sb = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i <= 50000; i++) {
sb.append(i);
}
endTime = System.currentTimeMillis();
time = endTime - startTime;
System.out.println(time);
}
- 拼接使用时间如下:
三者的总结:
类型 | String | StringBuffer | StringBuilder |
---|---|---|---|
对象类型 | 字符串常量 | 字符串变量 | 字符串变量 |
线程安全性 | 不安全 | 安全 | 不安全 |
执行效率 | 低 | 中 | 高 |
适用场景 | 操作少 数据少 | 多线程 操作多 数据多 | 单线程 操作多 数据多 |