看了网上不少关于StringBuilder和StringBuffer的区别,于是自己也想写一份文章做一下两者之间的总结。
在这之前先来说说String(字符串常量) 它是引用类型 值不可变的(被final修饰,不可被继承),也就是说String对象一旦创建之后就不允许更改,每对String做一次修改,它都会返回一个新的String对象,实际上是又创新了一个新的对象。
final意义:最终的,不可改变的。
1、修饰变量,为常量,值不可变;
2、修饰对象,值可变,引用不变;
3、修饰方法,方法不可重写;
4、修饰类,无子类,不可以被继承,更不可能被重写。
如下图所示:
先创建一个对象s2,将"hello"存到常量池中,同理,因此s2==s3为true 因为s2/s3这两个变量指向的是同一个对象。
常量池:专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据。如字符串常量,类、方法中的常量。
注: s2==s3比较的是地址 s2.equals(s4)比较的是字符串内容
现在我们切入正题具体说说StringBuilder 和StringBuffer的区别:
StringBuilder和StringBuffer都是继承自AbstractStringBuilder,AbstractStringBuilder都是用字符数组来存储数据的,因此对象可变。
StringBuilder与StringBuffer的区别:
1:两者的方法功能大致相同
2:只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,
而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
3:在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全
而StringBuffer则每次都需要判断锁,效率相对更低.
那么,我们什么时候需要用到String,什么时候用到StringBuilder,String Buffer呢?
这里做出以下总结:
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况