1、StringBuffer对象的初始化
StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。
例如:
StringBuffer s = new StringBuffer();
这样初始化出的StringBuffer对象是一个空的对象,就是我犯的错误。
如果需要创建带有内容的StringBuffer对象,则可以使用:
StringBuffer s = new StringBuffer(“abc”);
这样初始化出的StringBuffer对象的内容就是字符串”abc”。
需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:
StringBuffer s = “abc”; //赋值类型不匹配
StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转
StringBuffer对象和String对象之间的互转的代码如下:
String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer
String s1 = sb1.toString(); //StringBuffer转换为String
2、StringBuffer的常用方法
StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
a、append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
则对象sb的值将变成”abctrue”。
使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,用StringBuffer对象来做sql语句拼接的话会节省很多的内存,例如:
StringBuffer sb = new StringBuffer();
String user = “test”;
String pwd = “123”;
sb.append(“select * from userInfo where username=“)
.append(user)
.append(“ and pwd=”)
.append(pwd);
这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。
b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。
还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。
c、insert方法
public StringBuffer insert(int offset, boolean b)
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
d、reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
e、setCharAt方法
public void setCharAt(int index, char ch)
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
则对象sb的值将变成”aDc”。
f、trimToSize方法
public void trimToSize()
该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。
StringBuffer的基本使用示例:
package com.igeek02;
/*
* StringBuffer:底层维护了一个字符数组
* 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区
* 可以通过某些方法调用可以改变该序列的长度和内容。
* StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。
*
*
* String:不可变的字符串缓冲区,字符串是常量,一旦定义不能更改
* StringBuffer 可变的字符串缓冲区 JDK1.0 线程安全的(java使用使用同步机制保证线程安全),效率低
* StringBuilder 可变的字符串缓冲区 JDK1.5 线程不安全的,效率高
*
* 构造方法:
* StringBuffer()
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
StringBuffer基本上所有的方法都是操作对象本身
方法
StringBuffer append(int i)
将 int 参数的字符串表示形式追加到此序列。
StringBuffer append(char[] str, int offset, int len)
将 char 数组参数的子数组的字符串表示形式追加到此序列。
StringBuffer append(Object obj)
追加 Object 参数的字符串表示形式。
StringBuffer append(String str)
将指定的字符串追加到此字符序列。
StringBuffer append(StringBuffer sb)
将指定的 StringBuffer 追加到此序列中。
StringBuffer insert(int offset, boolean b)
将 boolean 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, Object obj)
将 Object 参数的字符串表示形式插入此字符序列中。
StringBuffer insert(int offset, String str)
将字符串插入此字符序列中。
获取
int capacity() 返回当前容量。
char charAt(int index) 返回此序列中指定索引处的 char 值。
int length() 返回长度(字符数)。
int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
int lastIndexOf(String str, int fromIndex)
返回最后一次出现的指定子字符串在此字符串中的索引。
删除
StringBuffer delete(int start, int end)
移除此序列的子字符串中的字符。
StringBuffer deleteCharAt(int index)
移除此序列指定位置的 char。
void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch。
void setLength(int newLength)
设置字符序列的长度。
void trimToSize()
尝试减少用于字符序列的存储空间。
void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
StringBuffer容量扩展
添加元素之后,容量不够,需要扩容,(在原有容量(capacity)的基础上乘以2,再加上2)
原有容量扩展一倍
如果扩展一被之后还不够存储,那么容量直接扩展到等于当前所需的最小容量
* */
public class Demo1 {
public static void main(String[] args) {
/*
* 删除
StringBuffer delete(int start, int end)
移除此序列的子字符串中的字符。
StringBuffer deleteCharAt(int index)
移除此序列指定位置的 char。
void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch。
void setLength(int newLength)
设置字符序列的长度。
* */
StringBuffer sb = new StringBuffer("igeekhome");
//sb.delete(1, 3);//[1,3)
sb.delete(0, 5);
System.out.println(sb);//home
sb.deleteCharAt(1);
System.out.println(sb);
sb.setCharAt(0, ‘k‘);
System.out.println(sb);
/*
* 其他
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst。
StringBuffer replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符。
StringBuffer reverse()
将此字符序列用其反转形式取代。
String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。
String toString()
返回此序列中数据的字符串表示形式。
* */
sb = new StringBuffer("igeekhome");
sb.replace(0, 5, "China");
System.out.println(sb);//Chinahome
sb.reverse();
System.out.println(sb);
sb = new StringBuffer("igeekhome");
String s = sb.substring(2);
System.out.println(s);
System.out.println(sb);//igeekhome substring截取子串,并返回新的字符串
s = sb.substring(0, 5);//[0,5)
System.out.println(s);
String s1 = sb.toString();//StringBuffer --> String
System.out.println(s1);
}
public static void m2() {
StringBuffer s = new StringBuffer();
System.out.println("容量:" + s.capacity());//16 :
System.out.println("长度:" + s.length());//0
s.append("igeek");
System.out.println("容量:" + s.capacity());//16 :包含5个字符
System.out.println("长度:" + s.length());//5
s.append("igeekigeek");//15个字符 ,容量16
s.append("igeekigeekigeekigeek");
//s.append("igeekigeekigeek");
System.out.println("容量:" + s.capacity());//
System.out.println("长度:" + s.length());//20
}
public static void m1() {
StringBuffer s = new StringBuffer();//空字符串
System.out.println(s);
s.append(12);
System.out.println(s);
s.append(new char[] {‘h‘,‘a‘,‘h‘,‘a‘}, 0, 2);
System.out.println(s);
s.append(new Demo1());//对象toString方法的返回值拼接到StringBuffer对象上
System.out.println(s);
s.append("igeek");
s.append(new StringBuffer("哈哈"));
System.out.println(s);
System.out.println(s.append(true).append(3.14));
/*System.out.println("---");
String s1 = "haha";
s1.concat("hehe");
System.out.println(s1);*/
s = new StringBuffer("igeek");
s.insert(1, "哈哈");
System.out.println(s);
s.insert(0, new Demo1());
System.out.println(s);
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "0";
}
}
StringBuffer的添加功能
public StringBuffer append(String str):
* 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str):
* 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
举例说明:
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = sb.append("I");
StringBuffer sb2 = sb.append("love");
StringBuffer sb3 = sb.append("you");
System.out.println(sb1);
System.out.println(sb2);
System.out.println(sb3);
结果都是输出"Iloveyou",说明sb1,sb2,sb3这三个引用都是指向同一个对象,也就说明了这个append方法是返回字符串缓冲区本身的,同理insert也是。
这里我们可以直接使用三次sb.append();打印sb结果也是一样的。
StringBuffer的删除功能
public StringBuffer deleteCharAt(int index):
* 删除指定位置的字符,并返回字符串缓冲区本身
public StringBuffer delete(int start,int end):
* 删除从指定位置开始指定位置结束的内容,并返回字符串缓冲区本身
举例说明:
StringBuffer sb = new StringBuffer();
sb.append("Iloveyou");
sb.deleteCharAt(1);
System.out.println(sb);
sb.delete(3,7);
System.out.println(sb);
输出结果分别为Ioveyou,Iov。首先执行sb.deleteCharAt(1),删除了love的"l",然后变成了"Ioveyou";再执行sb.delete(3,7),把v后面的全部删了,所以最终结果为Iov。这里我们看到我们是直接使用外汇返佣sb.方法,这是因为每次返回都是本身,所以我们不返回也行,有一个引用就行。
StringBuffer的替换和反转功能
A:StringBuffer的替换功能
public StringBuffer replace(int start,int end,String str):
* 从start开始到end用str替换 也是返回字符串缓冲区本身
B:StringBuffer的反转功能
public StringBuffer reverse():
* 字符串反转 也是返回字符串缓冲区本身
StringBuffer sb = new StringBuffer();
sb.append("Iloveyou");
sb.replace(1, 5, "miss");
System.out.println(sb);
sb.reverse();
System.out.println(sb);
输出结果分别为Imissyou uoyssimI,这里就不解释了,同样每次都是返回字符串缓冲区本身。
StringBuffer的截取功能
public String substring(int start):
* 从指定位置截取到末尾
public String substring(int start,int end):
* 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
注意事项
* 注意:返回值类型不再是StringBuffer本身,而是String,该过程创建了String对象
举例说明,以substring(int start)为例:
StringBuffer sb = new StringBuffer("Iloveyou");
String s = sb.substring(1);
System.out.println(s);
输出结果为loveyou,这里返回值类型是String类,所以必须要创建一个字符串对象。
注:String类如果进行如此操作的话(比如拼接,截取字符串,大小写转化,trim方法),每次都要创建新的String对象
————————————————
原文链接:https://blog.csdn.net/qq_15204179/article/details/81905918
原文:https://www.cnblogs.com/benming/p/11758233.html