文章目录
一、StringBuffer 类和 StringBuilder 类
StringBuffer 类简介:
我们在日常开发中字符串可谓是随处可见,我们需要将字符串进行各种拼接,更改等操作,以此来获得我们所需要的字符串。但是字符串本身是不可改变的,所有在进行相关操作时,其实都会在原本字符串的基础之上重新创建字符串对象,这无疑会给内存造成更大的压力。而使用StringBuffer便可以很好的解决这个问题。
还有一个类和 StringBuffer 的功能相同,这便是StringBuilder 类。StringBuilder类了解一些即可,通常都使用StringBuffer 来操作字符串
1、StringBuffer 类的构造方法与获取方法
- StringBuffer的构造方法:
- public StringBuffer():无参构造方法
- public StringBuffer(int capacity):指定字符串对象在缓存区的容量
- public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
- StringBuffer 的获取方法
- public int capacity():获取字符串对象的容量。(如果不自定义设置字符串缓存区容量,初始化默认容量是便是 16)。
- public int length():返回字符串长度。
Demo代码示例:
public class StringBufferDemo {
public static void main(String[] args) {
// public StringBuffer():无参构造方法
StringBuffer sb = new StringBuffer();
System.out.println("sb:" + sb);
//capacity(),获取字符串对象的容量
System.out.println("sb.capacity():" + sb.capacity());
System.out.println("sb.length():" + sb.length());
System.out.println("==============================================");
// public StringBuffer(int capacity):指定容量的字符串缓冲区对象
StringBuffer sb2 = new StringBuffer(50);
System.out.println("sb2:" + sb2);
System.out.println("sb2.capacity():" + sb2.capacity());
System.out.println("sb2.length():" + sb2.length());
System.out.println("==============================================");
// public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
StringBuffer sb3 = new StringBuffer("hello");
System.out.println("sb3:" + sb3);
System.out.println("sb3.capacity():" + sb3.capacity());
System.out.println("sb3.length():" + sb3.length());
}
}
运行结果:
2、StringBuffer 类的添加方法
- 添加功能
- public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
- public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
Demo代码示例:
public class StringBufferDemo {
public static void main(String[] args) {
// 创建字符串缓冲区对象
StringBuffer sb = new StringBuffer();
// 添加数据
sb.append("hello");
sb.append(true);
sb.append(12);
sb.append(34.56);
// 上面的添加数据我们可以用链式编程开表示。你会发现结果是相同的
//sb.append("hello").append(true).append(12).append(34.56);
System.out.println("sb:" + sb);
//在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
sb.insert(5, "world");
System.out.println("sb:" + sb);
}
}
运行结果:
3、StringBuffer 类的删除方法
- public StringBuffer deleteCharAt(int index):删除指定位置的字符,并以String的形式返回缓存区的字符串对象本身
- public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并以String的形式返回缓存区的字符串对象本身
注:在使用字符串删除方法之前,在字符串缓存区中必须得有字符串的存在(和数组下标类似,在执行删除方法时,找不到指定下标的字符或者指定下标范围的字符串,便会报错。)
Demo代码示例:
public class StringBufferDemo {
public static void main(String[] args) {
// 创建字符串缓冲区对象
StringBuffer sb = new StringBuffer();
// 先在字符串缓存区中添加一些数据
sb.append("A");//下标:0
sb.append("B");//下标:1
sb.append("C");//下标:2
sb.append("D");//下标:3
sb.append("E");//下标:4
sb.append("F");//下标:5
sb.append("G");//下标:6
System.out.println("sb1:" + sb); //打印结果:sb1:ABCDEFG
// 删除指定下标的字符,并返还字符串本身
sb.deleteCharAt(1);
System.out.println("sb2:" + sb); //打印结果:sb2:ACDEFG
// 我们要删除world这个字符串,肿么办?
sb.delete(3, 5);
System.out.println("sb3:" + sb); //打印结果:sb3:ACDG
// 需求:我要删除所有的数据
sb.delete(0, sb.length());
System.out.println("sb4:" + sb); //打印结果:sb4:
}
}
4、StringBuffer 类的替换方法
- public StringBuffer replace(int start,int end,String str):根据下标去指定字符串范围,将该范围的字符串替换成所需的字符串。start 代表下标初始范围,end 代表下标结束范围,str 所指定的字符串会将 start 和 end 指定范围的的字符串进行替换。
Demo代码示例:
public class StringBufferDemo {
public static void main(String[] args) {
// 创建字符串缓冲区对象
StringBuffer sb = new StringBuffer();
// 先在字符串缓存区中添加一些数据
sb.append("A");//下标:0
sb.append("B");//下标:1
sb.append("C");//下标:2
sb.append("D");//下标:3
sb.append("E");//下标:4
sb.append("F");//下标:5
sb.append("G");//下标:6
System.out.println("sb1:" + sb); //打印结果:sb1:ABCDEFG
// 需求:我要把world这个数据替换为"洪荒之力"
sb.replace(1, 4, "bcd");
System.out.println("sb2:" + sb);
}
}
5、StringBuffer 类的反转功能
- public StringBuffer reverse()
Demo代码示例:
public class StringBufferDemo {
public static void main(String[] args) {
// 创建字符串缓冲区对象
StringBuffer sb = new StringBuffer();
// 先在字符串缓存区中添加一些数据
sb.append("A");//下标:0
sb.append("B");//下标:1
sb.append("C");//下标:2
sb.append("D");//下标:3
sb.append("E");//下标:4
sb.append("F");//下标:5
sb.append("G");//下标:6
System.out.println("sb1:" + sb); //打印结果:sb1:ABCDEFG
// 两极反转!!!
sb.reverse();
System.out.println("sb2:" + sb);//sb2:GFEDBCA
}
}
6、StringBuffer 类的截取功能
- public String substring(int start):设置指定结束下标,默认从0下标开始截取,将指定下标往后的字符串保留,删除从 0 至结束下标范围的字符串。
- public String substring(int start,int end):start 代表开始下标范围,end 代表结束下标范围。只保留指定范围的字符串,其他下标范围字符全部清空。
Demo代码示例:
public class StringBufferDemo {
public static void main(String[] args) {
// 创建字符串缓冲区对象
StringBuffer sb1 = new StringBuffer();
// 在字符串缓存区中添加一些字符串
sb1.append("A");//下标:0
sb1.append("B");//下标:1
sb1.append("C");//下标:2
sb1.append("D");//下标:3
sb1.append("E");//下标:4
sb1.append("F");//下标:5
sb1.append("G");//下标:6
System.out.println("sb1:" + sb1);//sb1:ABCDEFG
//设置指定结束下标,默认从0下标开始截取,将指定下标往后的字符串保留,删除从 0 至结束下标范围的字符串。
String str1 = sb1.substring(1);
System.out.println("str1:" + str1);//str1:BCDEFG
System.out.println("===========================");
StringBuffer sb2 = new StringBuffer();
// 在字符串缓存区中添加一些字符串
sb2.append("A");//下标:0
sb2.append("B");//下标:1
sb2.append("C");//下标:2
sb2.append("D");//下标:3
sb2.append("E");//下标:4
sb2.append("F");//下标:5
sb2.append("G");//下标:6
System.out.println("sb2:" + sb2);//sb1:ABCDEFG
//start 代表开始下标范围,end 代表结束下标范围。只保留指定范围的字符串,其他下标范围字符全部清空。
String str2 = sb1.substring(1,4);
System.out.println("str2:" + str2);//str2:BCD
}
}
运行结果:
7、面试常问的问题
- String 和 StringBuffer 之间的相互转换
public class StringBufferTest {
public static void main(String[] args) {
// String 转换 StringBuffer
String s = "hello";
// 注意:不能把字符串的值直接赋值给StringBuffer
// StringBuffer sb = "hello";
// StringBuffer sb = s;
// 方式1:通过构造方法
StringBuffer sb = new StringBuffer(s);
// 方式2:通过append()方法
StringBuffer sb2 = new StringBuffer();
sb2.append(s);
System.out.println("sb:" + sb);//sb:hello
System.out.println("sb2:" + sb2);//sb2:hello
// StringBuffer转换 String
StringBuffer buffer = new StringBuffer("java");
// String(StringBuffer buffer)
// 方式1:通过构造方法
String str = new String(buffer);
// 方式2:通过toString()方法
String str2 = buffer.toString();
System.out.println("str:" + str);//str:java
System.out.println("str2:" + str2);//str2:java
}
}
- 2、String和StringBuff和StringBuilder区别?
- String:不可变序列
- StringBuffer:可变序列,多线程,安全
- StringBuilder:可变序列,单线程,不安全
- 3、StringBuffer和数组的区别?
- 都是容器,可以用来存数据但是数组只能存一种数据,但是StringBuffer可以存很多种类型数据,不过最终结果都是字符串数据