Java常识7.0 StringBuffer的使用

Posted 梦子mengy7762

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java常识7.0 StringBuffer的使用相关的知识,希望对你有一定的参考价值。

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+初始容量。
    


执行结果如下:

4.0 append方法和insert方法

public Stringbuffer append(String str)

往StringBuffer中添加字符。可以吧任意数据类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。最后,如果你的时间不是很紧张,并且又想快速的初级程序员提高,最重要的是不怕吃苦,建议你可以扩列我伪(同音):首先是:CSMX ,最后是:9880,(连在一起)即可找到我,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~,包括小编自己整理的一份2022最新的程序员提升资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。

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


执行结果如下:

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


执行结果如下:

可以发现在指定位置添加元素,如果没有指定位置的索引,就会报错:索引越界异常。
在默认的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);
    


运行结果如下:

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


运行结果:

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


执行结果:

7.0 StringBuffer的截取功能

public String subString)(int start):

从指定位置截取到末尾。

public String subString(int start,int end):

截取从指定位置开始到结束位置,包括开始位置,不包括结束位置。对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):CGMX9880 【教程/工具/方法/解疑】
示范代码:

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


执行结果:

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


执行结果:

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


执行结果如下:

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


执行结果:

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";
    


执行结果为:

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

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";
    


执行结果如下:

END

以上是关于Java常识7.0 StringBuffer的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java常识7.0 数组实现冒泡排序选择排序和二分查找

Java常识7.0 数组实现冒泡排序选择排序和二分查找

Java api 入门教程 之 JAVA的StringBuffer类

java中字符串的增加,插入及StringBuffer的使用

Java中StringBuffer类append方法的使用

Java 12 - Java StringBuffer和StringBuilder类