面试题:String,StringBuilder和StringBuffer的区别
一、String
1、String是一个长度不可变的字符序列,底层是一个被final修饰的char[]数组。
2、任何对String类型进行改变的操作实际上都是重新生产一个新的String对象,然后将指针指向新的String对象。
举例说明,上代码:
3、对于上段代码我们来分析一下子,首先创建了String对象x,同时开辟一空间存储字符串序列”hello”,然后将对象x指向字符串序列”hello”的存储地址。然后需要再开辟另一空间存储字符串序列”java”,再将两个字符串进行拼接并存储到另一个新开辟的存储空间中,最后将对象x的地址指向拼接后的字符串对应的存储空间的地址,整个过程完成。
4、我们不难发现,这样一个简单的对String对象进行修改的操作需要开辟三次空间变更两次地址,这样不仅效率低,而且大量浪费有限的内存空间。因此,如果你需要频繁的对字符串进行操作的话,看样子String对象这时候就不太中用了。
5、基于上述的使用背景,即如果你需要频繁的对字符串进行操作的话,就需要使用到StringBuilder和StringBuffer了。
二、StringBuilder、StringBuffer
StringBuilder:可变的字符序列 , 线程不安全的,效率高,底层是 char[]数组 存储。
StringBuffer:可变的字符序列 , 线程安全的,效率低,底层是 char[]数组 存储。
StringBuilder和StringBuffer都是可变的字符串序列,可以对其进行多次修改而不创建新的对象。两者的区别在于线程安全性,StringBuffer是线程安全的,而StringBuilder是非线程安全的。在多线程环境下使用StringBuffer可以保证线程安全,但是会降低性能。在单线程环境下使用StringBuilder性能更高。
三、StringBuilder、StringBuffer对象创建及常用方法
1、对象创建
两个类创建的话,直接new对象即可,如果需要想创建指定字符串的对象,那么带参即可。示例如下:
2、常用方法
四、小结
String:不可变长的字符串序列,适用于少量的字符串操作的情况。
StringBuilder:适用于在单线程环境下进行大量的字符串操作,可以获得更好的性能。
StringBuffer:适用于在多线程环境下进行大量的字符串操作,可以保证线程安全,但是会牺牲一定的性能。