今天来复习下java基础中,String StringBuffer和StringBuilder三者的区别,这也是面试的常考点之一,话不多说,直接上干货!
String
String最常用的字符串,在java中String属于对象,同时由于String类是final修饰的,所以String的值是无法改变的。看到这里肯定有疑问 比如以下代码
String a = "abd";
System.out.println(a);
a="c12";
System.out.println(a);
运行结果后,发现控制台a的值的确改变了
那么String的值无法改变,这又是怎么回事呢?
要理解这个,首先就得明白String是引用类型。第一句 String a = “abd”,此时在堆内存中已经创造了“abd”这个对象,下一句a=“c12”,其实是在堆内存中继续创造了“c12”这个对象,a的值之所以会发生改变,是因为a的指向从 “abd”变成了“c12”。因此值看起来是改变了,其实是没有改变的,如下图:
字符串频繁的指向“断开-重写连接”会大大降低性能,同时因为开拓了更多的空间,也会对内存造成威胁,因此对于要经常修改内容的情况,建议使用**:StringBuilder、StringBuffer**
StringBuffer
StringBuffer对象代表的是一个内容可变的字符串。因此,当StringBuffer被创建后,通过提供的 append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的内容
StringBuffer a = new StringBuffer("123");
System.out.println(a);
a.append("23");
System.out.println(a);
输出结果如下图:
那么StringBuffer在内存空间中又是怎样的呢?
如图。我们可以看到,StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中调用了append方法增加了内容,因此值发生了改变
StringBuffer类中在实现方法上增加了 synchronized关键字 如下图
这个关键字相当于给方法添加了一个锁,所以从这里来看,StringBuffer的线程是安全的。而StringBuilder类在实现方法上并无 synchronized关键字 ,因此它的线程是不安全的。
StringBuilder
StringBuffer类也代表可变字符串对象 ,它与StringBuffer基本功能基本相似
总结:
综上所述,String StringBuffer StringBuilder的区别大致分为以下两类
- String的值不可变,StringBuffer 和StringBuildr的值可变
- 运行速度 StringBuilder>StringBuffer>String (StringBuffer有锁,所以性能会降低)
- StringBuffer线程是安全的,适合多线程;StringBuilder线程是不安全的,适合单线程
- 如果不需要频繁的修改值,用String即可