String:内容不可更改
String字符串对象的内容不可更改,更改是一种假象,实际更改的是堆内存的指向。
例如:String str = "Hello"; str+" word!";
首先系统会在栈内存中开辟一个栈空间存储"str",然后在堆内存中开辟一个堆空间存储"Hello",栈内存空间中的"str"指向堆内存空间的"Hello"。到" str+"word!"; "时,系统会再开辟两个堆内存空间,一个存放" word!",另一个存放"Hello word!",然后栈内存空间中的"str"指向堆内存空间的"Hello word!",之后"Hello"与" word!"所占的堆内存空间会因为没有被引用而被系统回收。所以,用String变量拼接字符串的时候与其他两种字符串操作对象相比,较为耗内存空间。
StringBuffer:内容可以更改
StringBuffer是String缓冲区的意思,其本身也是操作字符串,但是它与String不同,StringBuffer可以更改指向的堆内存空间存储的内容,所以它较String省内存,但是速度较String稍慢。StringBuffer是一个操作类,所以必须通过实例化进行操作,不然会报空指针异常错误,而String变量可以直接赋值初始化。
StringBuilder:单线程建议优先考虑该类,速度比StringBuffer快
StringBuilder是一个可变的字符序列,该类被设计作为StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。因为在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。单线程建议优先考虑该类,速度比StringBuffer快。
需要注意的是String类和StringBuffer都是被final关键字修饰的。对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。