面试_java_String,StringBuffer, StringBuilder

83 阅读1分钟
  • String是字符串常量,而StringBuffer和StringBuilder是字符串变量
  • SringBuilder 线程不安全 , StringBuffer线程安全
  • 他们的运行速度不同 :SringBuilder > StringBuffer > String



解释

1. 关于常量与变量(字符串长度是否可变)

看源码即可,String类中使用了final修饰的长度不可变的字符数组。



2. 关于线程安全

StringBuffer,从名字就猜到用到了缓冲区,如果缓冲区内的某个字符串被多个线程同时使用时,也就是多个线程同时操作,这样会有出现错误操作的概率,为了保证线程的安全性,进行加锁,这样会使同一时间只有一个线程获得权限,其他线程必须等待该线程结束并释放锁才能获得权限,这样线程非常安全。

具体的实现:源代码中StringBuffer的很多方法都被关键字synchronized 修饰了



3. 关于运行速度

由于String是不可变的,所以对于String字符串的编辑,都是在副本上进行的,故String最慢。

StringBuffer与SringBuilder 相比,前者为了线程安全,是加了锁的,加锁是会带来性能上的损耗的,

故用SringBuilder 比 StringBuffer 要快。





使用策略

1、基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。

2、不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则