Java String的使用续 -- StringBuilder类和StringBuffer
文章目录
- 字符串的不可变性
- StringBuilder和StringBuffer
- 函数使用
字符串的不可变性
- 字符串不可变是因为有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) {//获取当前时间//Stringlong start = System.currentTimeMillis();String s = "";for (int i = 0; i < 10000; i++) {s += i;}//循环结束的时间long end = System.currentTimeMillis();//相减就得到了,这个创建临时变量循环的时间System.out.println("String的时间:"+(end - start));//StringBuilderlong 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));//StringBufferlong 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是采用了同步处理的,是线程安全的