对于一些面试的笔试题,很多公司对于员工的基础知识非常的重视,经常会在笔试题上问出这样的问题。
所以关于这三个类在字符串处理中的位置和优缺点进行了总结和归纳:
1.三者在执行速度方面的比较:StringBuilder>StringBuffer>String
2.String<(StringBuffer,StringBuilder)原因
String 字符串常量
StringBuffer 字符创变量
StringBuilder 字符创变量
从定义上来看,String是“字符串常量”,就是不可改变的对象,这里利用一段代码来解释:
String a="1234";
a=a+1;
System.out.println(a);//12341
这里显示的已经改变了字符串a的数据,但是这个其实不叫对象的改变,JVM是这样解析这段代码的:首先创建对象a,赋予一个1234,然后在创建一个新的对象a再次来执行第二段代码a=a+1,也就说明我们之前对象a并没有变化,所以我们说String类型是不可改变的对象,由于这种机制,每当用String操作字符串的时候,实际上就是在不断的创建新的对象,而原来的对象就会变成垃圾被GC回收掉,可以想象这样的执行效率会有多低。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可以改变的对象,每当我们用他们对字符串操作的时候,实际上就是在对一个对象进行操作,这样就不用像String这样每次都去新创建一个对象了,所以执行效率要快很多;
3.一个特殊的例子
String str="My name is "+"a";
StringBuffer buffer=new StringBuffer("My name is").append(" ").append("a");
System.out.println(str);//这里的str对象是重新有建立的新的对象
System.out.println(buffer);//而buffer则是原来的对象进行改变的
其实在这里的代码中你是看不到这两个对象在执行效率上有什么区别的,但是我们要从细节,从代码的执行过程中分析,实际上代码执行的过程是这样的:
String str="My name is"+“a”
这里是有三个对象的
Str1
Str2="My name is"
Str3="a"
Str1=Str2+Str3
在这里要建立三个对象所以执行的效率要慢
4.StringBuilder与StringBuffer
StringBuilder是非线程安全
StringBuffer是线程安全
当我们在字符串缓存去被多个线程使用的时候,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然
大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议使用StringBuilder而不用StringBuffer就是因为速度的原因
对于三者使用的总结:
1.如果要操作少量的数据 用String
2.单线程操作字符串缓冲区下操作大量的数据 StringBuilder
3.多线程操作字符串缓冲区下操作大量的数据 StringBuffer