Java中StringBuffer

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);
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值