StringBuffer和String的区别
如果对字符串进行拼接,每次拼接,都会创建一个新的String对象(见String类),既耗时,又浪费空间。StringBuffer就可以解决这个问题。
最大的区别就是StringBuffer可变,String不可变;
StringBuffer是线程安全(保证同步)的可变字符串。
StringBuffer sb = new StringBuffer();
syso(sb); //这里输出的并不是地址值,说明StringBuffer类重写了Object的toString()方法。
StringBuffer sb = new StringBuffer();
//创建了一个StringBuffer对象,初始capacity为16,length为0;
StringBuffer sb = new StringBuffer(20);
//创建了一个StringBuffer对象,初始capacity为20,length为0;
StringBuffer sb = new StringBuffer("hahaguai");
//创建了一个StringBuffer对象,初始capacity为hahaguai.length()+16,length为hahaguai.length(); //注意分析其源代码。
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
讲方法之前要知道的
注意,StringBuffer的成员方法的返回值,如果是StringBuffer类型的,那么表示,在原来的StringBuffer对象上进行操作,String类型的表示原来的StringBuffer对象不会改变。
- StringBuffer的apped、insert方法
最经典的问题:
StringBuffer sb = new StringBuffer("hello");
StringBuffer sb1 = sb.append(" world"); //这里,sb.append(" world")之后sb就表示"hello world"的引用,然后将sb赋值给sb1,表示他们两个的地址相同了。
syso(sb); //"hello world"
syso(sb1); //"hello world"
syso(sb == sb1) ; //true
链式编程:
sb.append("!").append(0.148596f).append("El Psy Congroo");
sb.append("!").append(0.148596f).append("El Psy Congroo").insert(1,"---");
// 在索引为1的字符后面插入"---" 。
- StringBuffer的删除方法
public StringBuffer delete(int start,int end)
//前闭后开
StringBuffer sb = new StringBuffer("hahaguai");
sb.delete(1,2);//hhaguai
public StringBuffer deleteCharAt(int index)
//删除索引所在字符
sb.deleteCharAt(2);//hhguai
//删除所有字符
sb.delete(0,sb.length());
- StringBuffer的替换方法
public StringBuffer replace(int start,int end, String str)
StringBuffer sb = new StringBuffer("helloworldjava");
sb.replace(5,10,"节日快乐");
System.out.println(sb); // hello节日快乐java
- StringBuffer的翻转功能
public StringBuffer reverse(StringBuffer sb)
sb.reverse();//avaj乐快日节olleh
- StringBuffer的截取功能
public String substring(int start)
这里的返回值为String,根据经验,返回值为String的,并不是在StringBuffer对象上操作。
所以这里的结果有别于前面的方法。
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb.substring(1)); //ello
System.out.println(sb);//hello 不变!
StringBuffer跟String相互转换
是不能把字符串的值直接赋值给StringBuffer对象的,
StringBuffer sb = "hahaguai"; // 报错。
- String —> StringBuffer
方法一:
String str = "hahaguai";
StringBuffer buffer = new StringBuffer(str); //构造方法StringBuffer(String str)
方法二:
StringBuffer buffer = new StringBuffer();
buffer.append(str);
- BufferString —> String
方法一:
StringBuffer buffer = new StringBuffer("hahaguai");
String str = new String(buffer);//构造方法String str = new String(StringBuffer sb)
方法二:
StringBuffer buffer = new StringBuffer("hahaguai");
String str = buffer.toString(); ///利用StringBuffer重写的toString()方法返回String
字符数组拼接案例,利用StringBuffer实现
之前做拼接的时候,是利用的String实现的,但是String str = "hahaguai";str += arr[x];
的时候每次都会产生多余的字符串常量,占用内存空间,这里用new StringBuffer().append(arr[x])
就能实现,节约内存空间。
public class StringBufferDemo extends Object {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
int[] arr = {1,2,3,5};
stringBuffer.append("【");
for (int i = 0;i<arr.length;i++){
if(i==arr.length-1) {
stringBuffer.append(arr[i]);
}else {
stringBuffer.append(arr[i]).append(", ");
}
}
stringBuffer.append("】");
System.out.println(stringBuffer.toString());
}
}
String、StringBuilder、StringBuffer的面试题
- String是内容不可变的,而后两者都是内容而变的。
- StringBuilder被用来设计成不保证同步的不安全的字符序列。StringBuffer单线程使用的时候很普遍。在单线程编程中,推荐使用这种方法,因为不保证同步的StringBuilder要比保证同步的StringBuffer要快。
- StringBuffer和数组的区别:StringBuffer中可以存放任意类型,但最终都是StringBuffer类型;数组中只能存放同一类型数据。
看程序写结果StringBuffer与String分别作为参数传递
String作为形参传递和基本类型(int等)作为形参传递一样,字符串虽然是引用类型,但是他作为一种特殊的引用类型,与基本类型作为形参传递一样,都不会改变实际值。StringBuffet作为参数,应当作为引用类型来看。
/*
* 形式参数问题
* String作为参数传递
* StringBuffer作为参数传递
*
* 形式参数:
* 基本类型:形式参数的改变不影响实际参数
* 引用类型:形式参数的改变直接影响实际参数
*
* 注意:
* String作为参数传递,效果和基本类型作为参数传递是一样的。
*/
public class StringBufferDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
System.out.println(s1 + "---" + s2);// hello---world
change(s1, s2);
System.out.println(s1 + "---" + s2);// hello---world
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println(sb1 + "---" + sb2);// hello---world
change(sb1, sb2);
System.out.println(sb1 + "---" + sb2);// hello---worldworld
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
}
public static void change(StringBuffer x, StringBuffer y) {
x = y; //只是将y的地址赋值给x,并没有改变sb1 的地址的指向
y.append(x);
}
}