String(线程不安全)是字符串常量,StringBuilder和StringBuffer均是字符串变量.
String是final修饰的,意味着它是不可以更改的,当我们创建一个不改变的字符串时,我们通常是用String来表示,因为String在创建 字符串时,JVM会把这样的创建方式:String test="s1" + "test" + "work"当成一个字符串常量来进行处理,例如test="s1testwork",这是因为java虚拟机特殊的处理机制,所以我们使用它来创建常量字符串.同样因为String的这些特性,每次对这个对象改变的时候都会发生创建新对象的情况,这样会导致虚拟机中产生过多的无用对象,导致系统变慢.所以当我们创建字符串变量时,就会想到使用StringBuffer和StringBuilder这两个字符串变量.
所以当是单线程的时候,我们最好还是使用StringBuilder,以为它没用同步这个思想,所以相对效率高些,这个方法在JDK1.5加入的时候,就是StringBuffer的单线程版.
举例说明多线程安全问题:
例如我们使用ArrayList添加数据,我们会进行两步:1.将数据添加到下标为size的,2.增大size的值.当我们在单线程的时候时候,size=0的位置我们添加一个数据,然后将size值增加为1.但是如果在多线程(此处为双线程)的情况下,两个线程同时操作这个事情,我们可能在size=0的位置添加了一个数据,但是size增加1的操作却是操作了两次,这样会导致我们size=0位置有一个,但是size大小却增加了两次.产生脏数据.这就是线程不安全了.