String和StringBuffer

String类与StringBuffer

在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对象用其反转形式取代
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//反转
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()方==法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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。