老生常谈问题:String、StringBuffer、StringBuilder区别
它们的相同点是都用来封装字符串;都实现了CharSequence接口。
区别 | 执行速度 | 线程安全 | 使用场景 | 是否实现equals、 hashCode方法 |
初始化方式 |
---|---|---|---|---|---|
String | 最差 | 线程安全 | 少量字符串操作 | 实现了,new String("java").equals(new String("java"))的结果为true; | 构造器:String s = new String(); 直接赋值:String s = "hello"; |
StringBuffer | 其次 | 线程安全 | 多线程环境下的大量操作 | 没有,new StringBuffer("java").equals(new StringBuffer("java"))的结果为false | 构造器 StringBuffer sb = new StringBuffer("hello"); |
StringBuilder | 最快 | 线程不安全 | 单线程环境下的大量操作 | 没有,new StringBuilder("java").equals(new StringBuilder("java"))的结果为false | 构造器 StringBuilder sb = new StringBuilder("hello"); |
- String:String类由final关键字修饰的,是一个不可变类,创建String对象后,该对象的字符串是不可改变的,直到这个对象被销毁,如果进行字符串拼接、截取等操作都会产生新的String对象(根据反编译结果, = s1+s2 实际操作是s3= new StringBuilder().append(s1).append(s2).toString();)。
- StringBuffer:StringBuffer继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,是可变类。线程安全是因为源码中它所有的方法都加了
synchronized
关键字修饰,从而保证了线程安全,但同时因为由锁的开销也降低了效率; 扩容:默认初始容量16个字符 - StringBuilder:StringBuilder也是继承自AbstractStringBuilder类,也是可变类