问题:说说你对String、StringBuilder、StringBuffer区别认识?
这三个类之间区别主要在两个方面,即允许速度和现场安全方面。
①、首先说运行速度,或者说执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String;为什么是这样的?
String 最慢的原因:String 为字符串常量,而 StringBuilder 和 StringBuffer 均为字符串变量,即 String 对象一旦 创建之后该对象是不可更改的,但是后两者的对象时变量,是可以更改的,以下面的代码为例:
String str = "abc";
System.out.println(str);
str = str +"de";
System.out.println(str);
运行这段代码会发现先输出的是 “abc” ,然后才输出 “abcde”,好像是 str 这个对象呗更改了,其实这只是一个假的现象罢了,JVM 对于这几行代码是这样处理:
首先,创建一个 String 对象 ,对象的引用 为 str ,str 指向的是 堆中的值 “abc”。
然后,在第三行中,其实JVM 又创建了一个新的对象, 同时对象的引用名也是 str ,只不过第二步是把第一步的值和“de”拼接起来重新赋值给 str,而原来的 str 就会被 JVM 的垃圾回收机制(GC)给回收掉了。
所以,第一步中的str实际上并没有被更改。即 String对象的值创建后是不可更改的。 Java 中对 String 对象进行操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder 和 StringBuffer 的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String 快很多。
如下我们经常的赋值操作:
String str = "abc" + "de";
StringBuilder sb = new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(sb.toString());
这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和
String str="abcde";
是完全一样的,所以会很快。
而如果写成下面这种形式:
String str1="abc";
String str2="de";
String str=str1+str2;
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。
②、线程安全方面
在线程安全上,StringBuilder 是线程不安全的,而 StringBuffer 是线程安全的。
如果一个 StringBuffer 对象在字符串缓冲区被多个线程使用的时候,StringBuffer 中很多方法都是可以 synchronized 关键字的,所以可以保证线程是安全的,但是 StringBuilder 的方法则是没有该关键字的,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用 StringBuffer ,但是在单线程的情况下,还会建议速度比较快的StringBuilder。
③、应用情况
String :适用于少量的字符串操作的情况
StringBuilder:适用于单线程下的字符缓冲区进行大量操作的情况
StringBuffer:使用多线程下载字符缓冲区进行大量的操作情况