字符串的不可变性
- 字符串不可变是因为有private修饰,只能在类的内部使用不可以在类外使用,因此使用时是不可以修改字符串的
public class test {
public static void main(String[] args) {
String str = "abc";
str += "def";
System.out.println(str);
}
}
StringBuilder和StringBuffer
public class test {
public static void main1(String[] args) {
String str = "abc";
str += "def";
System.out.println(str);
}
public static void main(String[] args) {
String str = "hello";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(str);
stringBuilder.append("abc");
str = stringBuilder.toString();
System.out.println(str);
}
}
- StringBuilder的速度明显快于String,因为每次String都会进行创建一个StringBuild对象,使用StringBuild进行append,再toString赋值给String,这样每次都创建对象和销毁对象是非常消耗时间的
- 每次String进行拼接会产生新的对象
- StringBuilder和StringBuffer每次拼接不会产生新的对象
public class Test {
public static void main(String[] args) {
//获取当前时间
//String
long start = System.currentTimeMillis();
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
//循环结束的时间
long end = System.currentTimeMillis();
//相减就得到了,这个创建临时变量循环的时间
System.out.println("String的时间:"+(end - start));
//StringBuilder
long start1 = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder("");
for (int i = 0; i < 10000; i++) {
stringBuilder.append(i);//拼接
}
long end1 = System.currentTimeMillis();
System.out.println("StringBuilder的时间:"+(end1-start1));
//StringBuffer
long start2 = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer("");
for (int i = 0; i <10000 ; i++) {
stringBuffer.append(i);
}
long end2 = System.currentTimeMillis();
System.out.println("StringBuffer的时间:"+(end2-start2));
}
}
- javap -c TestDemo,查看汇编
- StringBuilder和StringBuffer的区别,StringBuffer是线程安全的,它所有的函数都是synchronized修饰的,表示线程安全的
- 线程安全是什么意思呢?
也就是说每次只能有一个人去执行,这是锁住的,执行完会开锁,那么每次开锁和关锁是要消耗时间的,那么StringBuffer是比StringBuilder是要慢的
函数使用
- StringBuilder和StringBuffer也有String没有的方法
2. reverse(),对字符串进行逆置
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("hello");
stringBuilder.reverse();
System.out.println(stringBuilder);
}
- 区别
String的内容是不可以修改的,每次拼接都会产生一个新的对象(StringBuilder),StringBuilder和StringBuffer的内容是可以修改,每次对当前对象进行修改
String,StringBuilder,StringBuffer函数是相似的
StringBuilder是未采用同步处理的,是线程不安全的,StringBuffer是采用了同步处理的,是线程安全的