为什么要引入StingBuffer?
String 是一个不可变的字符序列,这不能满足我们的需求,而字符串缓冲区StringBuffer是一个可变的字符序列。
String和StringBuffer的区别?
1、可变性: String是一个不可变的字符序列,而StringBuffer是一个可变的字符序列。
2、内存中:String在定义时会在内存中常量池中开辟空间,比较耗费内存;StringBuffer(字符串缓冲区)会在使用完毕后释放内存。
StringBuffer中的构造方法:
构造方法摘要 | |
---|---|
StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。 |
|
StringBuffer(CharSequence seq) public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。 |
|
StringBuffer(int capacity) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。 |
|
StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。 |
StringBuffer的获取功能:
int |
capacity() 返回当前容量。 (如果超过容量,系统自动分配(存储字符串的时候,英文的)) |
int |
length() 返回长度(字符数)。 |
获取功能和构造方法的例子:
public class Demo { public static void main(String[] args) { StringBuffer sb =new StringBuffer();//创建一个无参构造的对象sb System.out.println("sb:"+sb+".");//没有输出地址值,因为重写了toString String s = new String("Helloworld"); // StringBuffer ssb = "helloworld";//字符串缓冲区没有这样的写法 StringBuffer sb0 = new StringBuffer("helloworld");//构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。 StringBuffer sb1 = new StringBuffer(s);//构造一个字符串缓冲区,并将其初始化为String类型的对象s,即"Helloworld" System.out.println(sb0); System.out.println(sb1); StringBuffer sb2 = new StringBuffer(20);//容量变为50 System.out.println("length():"+sb2.length()+",无参默认capacity():"+sb.capacity()+",初始化为20的capacity():"+sb2.capacity()); StringBuffer sb3 = new StringBuffer(sb0);//参数应是CharSequence 类型的 System.out.println(sb0); } }
StringBuffer的添加功能
StringBuffer |
append(boolean b) 将 boolean 参数的字符串表示形式追加到序列。 |
StringBuffer |
append(char c) 将 char 参数的字符串表示形式追加到此序列。 |
StringBuffer |
append(char[] str) 将 char 数组参数的字符串表示形式追加到此序列。 |
StringBuffer |
append(char[] str, int offset, int len) 将 char 数组参数的子数组的字符串表示形式追加到此序列。 |
StringBuffer |
append(CharSequence s) 将指定的 CharSequence 追加到该序列。 |
StringBuffer |
append(CharSequence s, int start, int end) 将指定 CharSequence 的子序列追加到此序列。 |
StringBuffer |
append(double d) 将 double 参数的字符串表示形式追加到此序列。 |
StringBuffer |
append(float f) 将 float 参数的字符串表示形式追加到此序列。 |
StringBuffer |
append(int i) 将 int 参数的字符串表示形式追加到此序列。 |
StringBuffer |
append(long lng) 将 long 参数的字符串表示形式追加到此序列。 |
StringBuffer |
append(Object obj) 追加 Object 参数的字符串表示形式。 |
StringBuffer |
append(String str) 将指定的字符串追加到此字符序列。 |
StringBuffer |
append(StringBuffer sb) 将指定的 StringBuffer 追加到此序列中。 |
StringBuffer |
appendCodePoint(int codePoint) 将 codePoint 参数的字符串表示形式追加到此序列。 |
StringBuffer类中的append方法貌似可以追加所有类型的数据!
指定位置添加
StringBuffer |
insert(int offset, boolean b) 将 boolean 参数的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int offset, char c) 将 char 参数的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int offset, char[] str) 将 char 数组参数的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int index, char[] str, int offset, int len) 将数组参数 str 的子数组的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int dstOffset, CharSequence s) 将指定 CharSequence 插入此序列中。 |
StringBuffer |
insert(int dstOffset, CharSequence s, int start, int end) 将指定 CharSequence 的子序列插入此序列中。 |
StringBuffer |
insert(int offset, double d) 将 double 参数的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int offset, float f) 将 float 参数的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int offset, long l) 将 long 参数的字符串表示形式插入此序列中。 |
StringBuffer |
insert(int offset, Object obj) 将 Object 参数的字符串表示形式插入此字符序列中。 |
StringBuffer |
insert(int offset, String str) 将字符串插入此字符序列中。 |
和append方法一样,insert方法也可插入几乎所有类型!返回字符串缓冲区本身。
删除功能
StringBuffer |
delete(int start, int end) 移除此序列的子字符串中的字符。 |
StringBuffer |
deleteCharAt(int index) 移除此序列指定位置的 char 。 |
一个是移除一个指定始尾的字符串,一个是移除一个指定位置的char,都返回StringBuffer本身。
反转功能
StringBuffer |
reverse() 将此字符序列用其反转形式取代。 |
就现在的观察来看,具有字符串反转方法的只有StringBuffer,String、Character、Integer等类中都没有reverse()这个方法。所以如果需要反转功能,就必须得先变成StringBuffer类,然后才能调用反转方法。
截取功能
String |
substring(int start) 返回一个新的 String ,它包含此字符序列当前所包含的字符子序列。 |
String |
substring(int start, int end) 返回一个新的 String ,它包含此序列当前所包含的字符子序列。 |
截取功能同String。
替换功能
|
|||
StringBuffer |
replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
格式不同于String,这个我们直接在形式参数里输入替代的值,被替代部分是用start--end这个区间锁定的。
StringBuffer,String,StringBuilder的区别?
StringBuffer和StringBuilder都是一个可变的字符序列,提供一个缓冲区.(两者都看做容器)
StringBuffer:线程安全的,同步的,执行效率低
StringBuilder:线程不安全的,不同步的,执行效率高,并且单线程中优先采用StringBuilder
StringBuffer 执行效率虽然低,但是由于String类型,并且他可变的字符序列,提供了缓冲区
StringBuffer:线程安全的,同步的,执行效率低
StringBuilder:线程不安全的,不同步的,执行效率高,并且单线程中优先采用StringBuilder
StringBuffer 执行效率虽然低,但是由于String类型,并且他可变的字符序列,提供了缓冲区