String 字符串常量
StringBuilder 字符串变量
StringBuffer 字符串变量
区别:
第一、由上面就可以知道,String字符串常量是不可变长的,StringBuilder和StringBuffer变量是可变长的
误区:
package com.lanqiao.facetest;
public class TestString {
public static void main(String[] args) {
String s = "abc";
String s1 = "opq";
s = s+"d";
System.out.println(s);
s.concat("4");
s1.toUpperCase();
System.out.println(s);
System.out.println(s1);
}
}
看到了代码可能有些和我一样基础不牢的人以为结果是:
abcd
abcd4
OPQ
其实真正的结果是:
abcd
abcd
opq
也许有人会问,不是说String 不是不可变的常量吗,这道题不合理呀?
答:String的确不可变的(仅拿String s来讨论),这段代码的在JVM中是这样运行的,先是创建了String的一个变量s,然后在创建另一个s变量来接收s+“d”,原来的s变量会被JVM垃圾处理机制(gc)回收掉。所以每次对字符串进行操作时,JVM都会创建一个新的String对象,因此String的运行效率是比较低的。而StringBuilder和StringBuffer是可变长的,对他们操作JVM不会创建新的对象。
第二,运行速度:StringBuilder>StringBuffer>String
为什么String的运行速度最慢呢?原因:上面已经解释了,对String的操作JVM会创建一个新的对象,所以String比较慢
第三、 StringBuilder和stringBuffer
StringBuilder 线程不安全
StringBuffer 线程安全
总结使用:
String一般用在少量数据操作上
StringBuilder 用于单线程大量数据的操作上
StringBuffer 用于多线程的大量数据的操作上