美文网首页Android开发程序员Java
【Java常识】7.0 StringBuffer的使用

【Java常识】7.0 StringBuffer的使用

作者: bobokaka | 来源:发表于2019-12-31 22:22 被阅读0次
    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

    相关文章

      网友评论

        本文标题:【Java常识】7.0 StringBuffer的使用

        本文链接:https://www.haomeiwen.com/subject/ohtjoctx.html