在Java中,由于String类是final类型的,所以使用String定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。
StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,因此并不会产生新的StringBuffer对象。
String类常用方法
StringBuffer append(char c) | 添加字符到StringBuffer对象中末尾 |
---|---|
StringBuffer insert(int offset,String str) | 在StringBuffer对象中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 移除StringBuffer对象中指定位置的字符 |
StringBuffer delete(int start,int end) | 删除StringBuffer对象中指定范围的字符或字符串 |
StringBuffer replace(int start,int end,String s) | 将StringBuffer对象中指定范围的字符或字符串用新的字符串s进行替换 |
void setCharAt(int index, char ch) | 修改指定位置index处的字符 |
String toString() | 返回StringBuffer缓冲区中的字符串对象 |
StringBuffer reverse() | 将此StringBuffer对象用其反转形式取代 |
//反转
private static void reverse() {
StringBuffer stringBuffer = new StringBuffer("fsdfasfasd");
System.out.println(stringBuffer);
//将StringBuffer的字符串内容反转
stringBuffer.reverse();
System.out.println(stringBuffer);
}
//删除
private static void delete() {
StringBuffer stringBuffer = new StringBuffer("fdsofjasdsfd");
//删除StringBuffer对象中的指定开始和结束的字符串 指定位置为前包后不包 [2,5)
stringBuffer.delete(2,5);
System.out.println(stringBuffer);
//删除StringBuffer对象中指定位置的字符
stringBuffer.deleteCharAt(4);
System.out.println(stringBuffer);
//清空缓冲区
stringBuffer.delete(0,stringBuffer.length());
System.out.println("清空" + stringBuffer);
}
//修改
private static void update() {
StringBuffer stringBuffer = new StringBuffer("Hello world");
//将指定位置字符替换
stringBuffer.setCharAt(4,'c');
System.out.println(stringBuffer);
//将指定开始和结束的字符串替换
stringBuffer.replace(3,6,"asdfg");
System.out.println(stringBuffer);
}
//添加
private static void add() {
StringBuffer stringBuffer = new StringBuffer();
//添加字符串到stringBuffer末尾
stringBuffer.append("ABC");
System.out.println(stringBuffer);
//在StringBuffer指定位置插入字符串
stringBuffer.insert(2,"fdsf");
System.out.println(stringBuffer);
}
String类和StringBuffer类的对比分析:
- String类定义的字符串是常量,一旦创建后,内容和长度都无法改变。StringBuffer表示字符容器,其内容和长度是可以改变的。
- String类重写了Object类的equals()方法,而StringBuffer类没有重写Object类的equals()方法。
private static void test01() {
//StringBuffer没有重写equals()方法
String a = new String("abc");
String b = new String("abc");
System.out.println(a.equals(b)); //true
StringBuffer c = new StringBuffer("abc");
StringBuffer d = new StringBuffer("abc");
System.out.println(c.equals(d)); //false
// + 在String和StringBuffer中的区别
String str1 = new String("a");
String str2 = new String("b");
System.out.println(str1 + str2); //ab
StringBuffer strb1 = new StringBuffer("a");
StringBuffer strb2 = new StringBuffer("b");
//strb1 + strb2 ❌ StringBuffer不能使用 + 连接符
System.out.println(a == b); //false
System.out.println(c == d); //false
}
StringBuilder
除了StringBuffer的使用,在JDK1.5之后提供了一个StringBuilder类,同样可以对字符串进行操作。
**主要区别:**二者不同的是StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。通常情况下,如果创建一个内容可变的字符串对象优先考虑StringBuilder。