任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类。
StringBuffer 和 StringBuilder 大部分功能是相同的
在String中,用“+”号来进行字符串拼接
有这么一串代码
String str = "hello" ;
for(int x = 0; x < 1000; x++) {
str += x ;
}
System.out.println(str);
由于字符串是不可变对象的,所以我们应该了解,每次+=操作,相当于创建了一个新的字符串对象。
那么旧的对象就是垃圾,因此就会产生了大量的临时对象,效率比较低下。
这里我们就可以借助StringBuffer
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("sing");
sb.append(" ").append("rap");
fun(sb);
System.out.println(sb);
}
public static void fun(StringBuffer sb){
sb.append("\n").append("dance basketball");
}
}
String 和 StringBuffer 最大的区别在于:String的内容无法修改而StringBuffer的内容可以修改。频繁修改字符串的话考虑使用StringBuffer。
注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
- 利用StringBuffer的构造方法或append()方法。
- StringBuffer变为String:调用toString()方法。
StringBuffer还有一些其他方法
字符串反转:
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("sing dance");
System.out.println(sb.reverse());
}
}
ecnad gnis
删除指定范围的数据
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("sing dance");
System.out.println(sb.delete(2,6));
}
}
siance
插入数据
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("sing dance");
System.out.println(sb.insert(10,"rap baskettball"));
//10在这里指的是偏移量,最大为sb.length,否则就会抛字符串下标越界异常。
}
}
sing dancerap baskettball
面试题:请解释String、StringBuffer、StringBuilder的区别:
- String的内容不可修改,StringBuffer和StringBuilder的内容可以修改
- StringBuffer和StringBuilder大部分功能是相似的。
- StringBuffer采用同步处理,属于线程安全操作,StringBuilder采用未同步处理,属于线程不安全操作
同步第一个重要的意思:互斥(反义词就是不同步)
同步第二个重要的意思:输入输出场景上,尤其是网络编程中,这次操作的结果是调用者自己关注(同步),还是由被调用者执行完毕后通知调用者