Java中String,StringBuild,StringBuffer三者的区别
在面试学习中有遇到过有提问,String,StringBuild,StringBuffer的区别,从网上搜索了一下资料有所了解之后在这里整理总结了一下,便于大家观看,加强自己在学子知识点钟的记忆,如有误或者可以补充的,还请大家多多指教和补充:
1,首先说说运行速度,或者执行速度,三者的速度快慢大概为:StringBuild>StringBuffer> String .
String 最常见,但最慢的原因:
String是字符串的常量,StringBuild和StringBuffer是字符串变量,String一旦创建就不可更改,新的String其实是新的常量,String只能被创建不能被修改,StringBuild和StringBuffer是可更改的,下面以代为为例:
1 String str="abc"; 2 Sys.out.println(str); 3 str=str+"de"; 4 sys.out.println(str);
运行这段代码会先输出abc,在输出abcde,看起来这个str对象的值被改变了,其实是假象,第二个是创建了新的对象,两个对象不一样, 在jvm中代码是这样处理的,首先创建一个String对象str并把abc赋值给str,然后在第三行代码中,jvm其实又创建了一个新的对象也叫str,并把原来的str的值赋值和“de”赋值给新的str,而原来的str会被垃圾回收机制(GC)给回收掉了,所以str并没有被修改,也就是String一旦被创建后就不可更改,所以,Java中对String对象进行的操作实际上是一个不断地创建新的对象并且将旧的对象回收的过程,所以实行速度很慢。
而StringBuild和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不惊醒创建和回收操作,所以速度要比String快很多。
另外有时候我们会这样对字符串进行赋值
1 String str="abc"+"de"; 2 Stringbuilder stringBuilder=new StringBuilder().append("abc")+append("de"); 3 Sys.out.println(str); 4 Sys.out.println(stringBuilder);
这样输出结果同样是“abcde”和“abcde”,但是String的速度比StringBuild的执行速度快得多,因为第一行中的操作和String str="abcde";是完全一样,第一行只是一次创建对象并赋值, 而第二行是一次创建并且多次更改值,而如果写成下面这种形式
1 String str1="abc"; 2 String str2="de"; 3 String str=str1+str2; 4 Sys.out.println(str);
那么jvm就像上面所说的那样,不断的创建对象,回收对象来进行这个操作了,速度就会很慢。
2,再来说线程安全
在线程上,StringBuilder是线程不安全的,StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuild的方法没有关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作时多线程,那么就要用StringBuffer,但是在单线程的情况下,还是建议适用速度比较快的StringBuild。
3,总结一下
String:适用于少量的字符串操作的情况,即创建复制后,修改的比较少的情况
StringBuffer:适用于单线程下字符串缓冲区进行大量操作的情况
StringBuilder:适用于多线程下字符串缓冲区进行大量操作的情况