一.性质上与String的区别
StringBuilder和StringBuffer为可变字符串。
二.StringBuilder和StringBuffer的区别
StringBuilder线程不安全,效率高 一般使用他
StringBuffer 线程安全 效率低
三.StringBuilder和StringBuffer的创建
通过StringBuffer方法操作字符串时,字符串对象不变。
创建一个新的StringBffuer对象必须用new方法,不能直接引用字符串常量
StringBuffer sbf =new StringBuffer(); //创建一个对象 无初始值
StringBuffer sbf2 =new StringBuffer(32); //创建一个对象 初始容量为32个字符
StringBuffer s1 = new StringBuffer("abc");//创建一个对象 初始值是“abc”
System.out.println(Integer.toHexString(s1.hashCode()));
System.out.println(s1);
s1.setCharAt(2, 'M');
System.out.println(Integer.toHexString(s1.hashCode()));
System.out.println(s1);
四.StringBuffer(StringBuilder)常用方法——与String相似的
StringBuilder str1 = new StringBuilder("abcdefgdef");
//String中此方法参数可以为char或String类型,StringBuilder和StringBuffer只能为String
int a = str1.indexOf("def");
int b = str1.lastIndexOf("def", 3);
String str1 = str1.substring(2);
String str2 = str1.substring(2, 5);
int c = str1.length();
char d = str1.charAt(4);
五.StringBuffer(StringBuilder)常用方法——独特的
StringBuilder s = new StringBuilder();
//用StringBuilder和for循环输出26个字母
for(int i=0;i<26;i++) {
s.append((char)('a'+i)); //在字符串后添加新的字符
}
s.reverse(); //将字符串s倒序
s.setCharAt(5, '好'); //将5索引字符替换为“好
s.insert(2, "这个"); //在指定索引位置插入某一个字符 字符串;
s.insert(2, "这个").insert(7, "方法的").insert(13,'使').insert(15,'用'); //链式调用 核心就是 insert方法调用了 return this,把自己返回了
s.delete(25, 32).delete(25, 28);//删除某一区间 也可以链式调用
s.replace(0, 3, "新字符串"); //将[0,3)区间的字符串替换 (对象不变)
s.deleteCharAt(4); //删除指定所以的字符
//应用
StringBuffer Asbf = new StringBuffer("古诗春晓");
Asbf.delete(0, 2);
System.out.println(Asbf);
Asbf.insert(1, "眠不觉");
System.out.println(Asbf);
Asbf.append(",处处闻啼鸟。");
System.out.println(Asbf);
tip:append(), delete(),insert()都可以链式调用
六.Stringbuilder StringBuffer String之间的转换
String a = "String";
//将String转为StringBuiler和StringBuffer
StringBuilder sbd = new StringBuilder(a);
StringBuffer sbf = new StringBuffer(a);
//将StringBuilder和StringBuffer转为String
sbd.toString();
sbf.toString();
//将StringBuilder 转为 StringBuffer
StringBuilder sbd2 = new StringBuilder("String");
StringBuffer sbf2 = new StringBuffer(sbd2.toString());
//将StringBuffer 转为 StringBuilder
StringBuilder sbd3 = new StringBuilder(sbf2.toString());
七.Stringbuilder(StringBuffer)操作字符串后对象地址的问题
StringBuffer sbf = new StringBuffer("ABCDEFG");
String d= sbf.substring(0,2);
System.out.println(d.hashCode()); //2081
System.out.println(sbf.hashCode()); //41359092
//使用substring方法截取字符串,结果的对象不同。
StringBuffer e = sbf.replace(0, 2, "字符串");
System.out.println(e.hashCode());//41359092
System.out.println(sbf.hashCode());//41359092
//使用replace,delete,append,insert,setCharAt方法修改字符串,结果的对象相同。