String、StringBuffer和StringBuilder的区别
String
String类是一个不可变类,它的底层是一个final类型的字符数组,所以String的值是不可变的,每次对String的操作都会生成新的String对象,造成内存浪费。
例如
String a = "123"; a = "456"; // 打印出来的a为456 System.out.println(a)
实际上是生成了一个新的string对象并赋值为456,而不是修改原来的a对象。如果原来的a对象没有被再次引用,则会被垃圾回收。
StringBuilder
StringBuilder代表一个字符序列可变的字符串,可以通过append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列,也可以通过toString()方法将其转换成String对象。
改变原字符串对象时是在其原本的内存空间进行操作,未创建新的内存空间。
StringBuffer
StringBuffer对象也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。StringBuffer中的每个方法前都加上了synchronized关键字,相当于给方法加上了一个锁,保证线程安全。