Android开发程序员Java

【Java常识】7.0 StringBuffer的使用

2019-12-31  本文已影响0人  bobokaka
1.0 String和StringBuffer的区别

String在申明后是一个不可变的字符串序列,StringBuffer是可以变的字符序列(通过某些方法)。
StringBuffer是一个类似于String的字符串缓冲区,但是不能像String那样用“+”号去修改,但是可以通过某些方法实现。

2.0 API文档对StringBuffer的描述为:线程安全的可变字符序列。

实际原理不做解释,理解万岁,打比方只有3句话。

2.1 打比方说,上厕所,厕所有门,门上有锁,锁门落锁,我们自然认为上厕所是安全的。
2.2 如果这个厕所是无门无锁,那我们认为这个厕所是不安全的。
2.3 当然,安全的话效率会比较低。
3.0 StringBuffer默认16个字符。
package edp.com.learn1;

public class Demo_StringBuffer {
    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer();
        System.out.println(sBuffer.length());  //容器中的字符个数,实际值。
        System.out.println(sBuffer.capacity());//容器的初始容量,理论值。
        
        StringBuffer sBuffer2 = new StringBuffer(10);
        System.out.println(sBuffer2.length()); 
        System.out.println(sBuffer2.capacity());
        
        StringBuffer sBuffer3 = new StringBuffer("test");
        System.out.println(sBuffer3.length()); 
        System.out.println(sBuffer3.capacity()); //字符串的length+初始容量。
    }
}

执行结果如下:


image.png
4.0 append方法和insert方法

public Stringbuffer append(String str)

往StringBuffer中添加字符。可以吧任意数据类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。

public Stringbuffer insert(int offset ,String str)

在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身。

4.1 StringBuffer是字符串缓冲区。当new的时候是在堆内存创建一个对象,底层是一个长度为16的字符数组。当调用添加的方法时,不会再重新创建对象,不断向原缓冲区添加字符。

代码示范如下:

package edp.com.learn1;

public class Demo_StringBuffer {
    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer();
        System.out.println("刚开始啥也没有,不信你看:");
        System.out.println(sBuffer);
        
        StringBuffer sBuffer2 = sBuffer.append(true);
        System.out.println(sBuffer2);
        
        StringBuffer sBuffer3 = sBuffer.append("test");
        System.out.println(sBuffer3);
        
        StringBuffer sBuffer4 = sBuffer.append(100);
        System.out.println(sBuffer4);
        
        System.out.println("整体输出:");
        System.out.println(sBuffer);  //此处sBuffer相当于sBuffer.toString
        System.out.println(sBuffer2);
        System.out.println(sBuffer3);
        System.out.println(sBuffer4);
    }
}

执行结果如下:


image.png
4.2 insert方法报错bug。
package edp.com.learn1;

public class Demo_StringBuffer {
    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer();
        sBuffer.insert(3, "test");
    }
}

执行结果如下:


image.png

可以发现在指定位置添加元素,如果没有指定位置的索引,就会报错:索引越界异常。
在默认的StringBuffer 中,没有第一个和第二个位置,自然就没办法在第三个位置插入“test”所以报错。
如下代码运行时则没有问题:

package edp.com.learn1;

public class Demo_StringBuffer {
    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer("1234");
        sBuffer.insert(3, "test");
        System.out.println(sBuffer);
    }
}

运行结果如下:


image.png
5.0 StringBuffer的删除功能

public StringBuffer deleteCharAt(int index):

删除指定位置的字符并返回本身。

public StringBuffer delete(int start,int end):

删除从指定位置开始指定位置结束的内容,并返回本身。
代码示范:

package edp.com.learn1;

public class Demo_StringBuffer {
    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer();
        sBuffer.append("learnTest");//当缓冲区中这个索引上没有元素的时候会报索引越界异常。
        System.out.println(sBuffer);//根据索引删除掉索引位置上对应的字符。
        sBuffer.deleteCharAt(5);
        System.out.println(sBuffer);
        
        StringBuffer sBuffer2 = new StringBuffer();
        sBuffer2.append("learnTest");
        sBuffer2.delete(2,4);
        System.out.println(sBuffer2);
        
        sBuffer2.delete(0, sBuffer2.length());//清空缓冲区
        System.out.println("内容为:"+sBuffer2);
    }
}

运行结果:


image.png
6.0 StringBuffer的替换和反转功能

public StringBuffer replace(int start,int end,String str):

从start开始到end用str替换

public StringBuffer reverse():

字符串反转。
代码示范:

package edp.com.learn1;

public class Demo_StringBuffer {

    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer("heisede");//黑色的
        sBuffer.replace(0, 3, "bai");
        System.out.println(sBuffer);
        sBuffer.reverse();
        System.out.println(sBuffer);
        
        StringBuffer sBuffer2 = new StringBuffer("落霞与孤鹜齐飞,秋水共长天一色。");
        sBuffer2.reverse();
        System.out.println(sBuffer2);
    }
}

执行结果:


image.png
7.0 StringBuffer的截取功能

public String subString)(int start):

从指定位置截取到末尾。

public String subString(int start,int end):

截取从指定位置开始到结束位置,包括开始位置,不包括结束位置。
示范代码:

package edp.com.learn1;

public class Demo_StringBuffer {

    public static void main(String[] args) {
        StringBuffer sBuffer = new StringBuffer("woaizhongguo");//我爱中国
        String string = sBuffer.substring(4);
        System.out.println(string);
        System.out.println(sBuffer);
        
        String string2 = sBuffer.substring(2,4);
        System.out.println(string2);
    }
}

执行结果:


image.png
8.0 StringBuffer和String的相互转换

String——StringBuffer:

1.通过构造方法
2.通过append()方法

StringBuffer——String:

1.通过构造方法
2.通过toString()方法
3.通过subString(0,length)方法

示范代码如下:

package edp.com.learn1;

public class Demo_StringBuffer {

    public static void main(String[] args) {
        String string0 = new String("woaiIT");//我爱IT
        //String转StringBuffer
        StringBuffer sBuffer = new StringBuffer(string0);//我爱IT,通过构造方法
        System.out.println(sBuffer);
        StringBuffer sBuffer2 = new StringBuffer();
        sBuffer2.append(string0);//通过append方法
        System.out.println(sBuffer2);
        
        //StringBuffer转String
        StringBuffer sBuffer3 = new StringBuffer("woaizhongguo");//我爱中国
        String string = new String(sBuffer3);//通过构造方法
        String string2 = sBuffer3.toString();//通过toString方法
        String string3 = sBuffer3.substring(2,4);//通过截取字符串转换
        System.out.println(string);
        System.out.println(string2);
        System.out.println(string3);
    }   
}

执行结果:


image.png
9.0 StringBuffer实现数组转换为String

或者说,怎么把数组转化为字符串,就可以通过StringBuffer实现。通过String实现,会不断的产生垃圾,而用StringBuffer对象只有一个。
示范代码如下:

package edp.com.learn1;

public class Demo_StringBuffer {

    public static void main(String[] args) {
        int[] arr= {1,2,3};
        System.out.println(arrayToString(arr));
    }

    private  static String arrayToString(int[] array) {
        StringBuffer sBuffer = new StringBuffer();
        sBuffer.append("[");
        
        for (int i = 0; i < array.length; i++) {  //遍历数组
            if (i ==array.length-1) {
                //这里不要用sBuffer.append(array[i]+",");
                //在连接符号的底层,代码调用还会创造一个新的对象StringBuffer
                //添加进去后还会通过tuString转换出来
                sBuffer.append(array[i]).append("]");
            }else {
                sBuffer.append(array[i]).append(",");
            }
        }
        return sBuffer.toString();
    }
}

执行结果如下:


image.png
10.0 StringBuffer实现字符串反转

看代码:

package edp.com.learn1;

import java.util.Scanner;

public class Demo_StringBuffer {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String lineString = scanner.nextLine();
        System.out.println(revString(lineString));
    }

    public static String revString(String lineString) {
        StringBuffer sBuffer = new StringBuffer(lineString);
        sBuffer.reverse();
        return sBuffer.toString();
    }
}

执行结果:


image.png
image.png
10.0 StringBuffer和StringBuilder的区别

两者的方法都是一样的。

StringBuffer是jdk1.0版本的,线程安全,效率低。
StringBuilder是jdk1.5版本的,线程不安全,效率高。

和String的区别:

String是不可变的字符序列。
StringBuffer和StringBuilder是可变的字符序列。

所以,如果仅仅是使用的话,两者没有什么区别。

11.0 StringBuffer和StringBuilder作为参数传递

回顾一下,基本数据类型的值传递,不改变其值。
引用数据类型的值传递,改变其值。
但是这里有点问题,String类虽然是引用数据类型,但是当做参数传递时和基本数据类型是一样的。
如下例:

package edp.com.learn1;

public class Demo_StringBuffer {

    public static void main(String[] args) {
        String string = "woaiIT";
        System.out.println(string);
        change(string);
        System.out.println(string);
    }

    public static void change(String string) {
        string +="woshuixingganggang";
    }
}

执行结果为:


image.png

可见,并没有被传递之后的操作改变。
对比代码如下:

package edp.com.learn1;

public class Demo_StringBuffer {

    public static void main(String[] args) {
        String string = "woaiIT";
        System.out.println(string);
        change(string);
        System.out.println(string);

        StringBuffer sBuffer = new StringBuffer();
        sBuffer.append("woaiIT");
        System.out.println(sBuffer);
        change(sBuffer);
        System.out.println(sBuffer);
    }

    public static void change(StringBuffer sBuffer) {
        sBuffer.append("woshuixingganggang");
    }

    public static void change(String string) {
        string += "woshuixingganggang";
    }
}

执行结果如下:


image.png

END

上一篇下一篇

猜你喜欢

热点阅读