Java StringBuffer类

1.是一个不可被继承(final )的类。是一个容器

字符缓冲区就像一个String ,但是可以修改。在任何时间点,它可以包含一些特定的字符序列,但是可以通过某些方法调用来修改序列的长度和内容

在StringBuffer 中的方法 append(添加到末尾)   insert(插入数据到指定的位置 )

2.实际上他就是一个数据容器(数组也是一个数据容器)

数组的特点:有一定的长度,数据的类型与数组定义的类型是一致的。最穷的容器,属性只有:长度,角标

StringBuffer() 的特点:长度是可以修改的,可以是任何类型的数据,注意:是将任意数据都转成字符串进行存储。所有的数据都会变成一个字符串

3.比较富有的容器:本身就提供了对容器里数据操作的各种方法。比如增删改查

4.字符串缓冲区的内部其实是由数组来存储的

数组本身是不可变的,在StringBuffer() 中可变数组长度的原理:当一个数组存满后,再新创建一个数组,长度是原数组的两倍,再把原数组的数据复制到新数组中,这就实现了数组长度的可变。

5.与数组最大的不同:数组可以单独操作每一个元素,每一个元素都是独立的。但是在字符缓冲区中,所有的存储元素都会被转化成字符串,而且最后拼成一个大的字符串(这其实也是他的局限性)

StringBuffer()    的使用:构造函数    ///  增   删   改     查

构造函数:

    • Constructor and Description
      StringBuffer()

      构造一个没有字符的字符串缓冲区,初始容量为16个字符。

      StringBuffer(CharSequence seq)

      构造一个包含与指定的相同字符的字符串缓冲区 CharSequence

      StringBuffer(int capacity)

      构造一个没有字符的字符串缓冲区和指定的初始容量。

      StringBuffer(String str)

      构造一个初始化为指定字符串内容的字符串缓冲区。

1.append(): 追加,在末尾添加

2.insert() : 插入,insert(offset,b);偏移量,插入的数据。数据是插入在偏移量之前

3.删除:delete(begain,end);删头不删尾            deleteCharAt(int x) ;删除指定位置的字符

其他的一些方法是和string 中的方法类似的。

讲一个:

    • StringBuffer replace(int start, int end, String str)

      用指定的String中的字符替换此序列的子字符串中的 String

含头不含尾

      • 子串开始于指定start延伸到字符索引end - 1 ,或如果没有这样的字符存在的序列的结束。 第一子串中的字符被去除,然后指定String被插入在start 。 (如果需要,此序列将被延长以容纳指定的字符串。)

关于String 的相关原理:

字符串在创建时用的就是字符缓冲区,字符串将数据整理完后toString(),数据就变成一个字符串了

String str= "a"+"b"+5;
        //底层的代码
        str= new StringBuffer().append("a").append("b").append("5").toString();
  • Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过StringBuilder (或StringBuffer )类及其append方法实现的。 字符串转换是通过方法来实现toString ,由下式定义Object和继承由在Java中的所有类。

练习:

将一个数组转化为字符串,输出的格式:[12,36,56,98]

//代码

package String;
/*
将一个数组转化为字符串,输出的格式:[12,36,56,98]
 */
public class StringBufferDeno {
    public static void main(String[] args){
        int[] nums = {12,36,56,98};
        String str1 = toString1(nums);//调用方法
        String str2= toString2(nums);//调用方法二
        System.out.println("str1 = "+str1);
        System.out.println("str2 = "+str2);
    }
    //方法一:使用字符串连接符号‘+’
    private static String toString1(int[] nums){
        String str="[";
        for(int i=0;i<nums.length;i++){
            if(i!=nums.length-1){
                str+=nums[i]+",";
            }
            else{
                str+=nums[i]+"]";
            }
        }
        return str;
    }
    //方法二:在字符缓冲区中进行,更加节省空间
    /*
    使用StringBuffer  字符缓冲区的情景:不知数量的不同类型的数据需要存储,并且最后都转化为字符串的形式
     */
    private static String  toString2(int[]  nums){
        StringBuffer  str= new StringBuffer("[");
        for(int i=0;i<nums.length;i++){
            if(i!=nums.length-1){
                str.append(nums[i]+",");
            }
            else{
                str.append(nums[i]+"]");
            }
        }
        return str.toString();
    }
}

总结 缓冲区的应用:无论什么类型的数据 ,多少数都不重要,只要最终存储变成字符串就可以使用StringBuffer 这个容器

!!StringBuilder()   和   StringBuffer() 的区别:

StringBuffer():是同步的,多线程访问安全

StringBuilder():是非同步的,单线程访问效率更高

StringBuffer() :是线程安全的。每个方法大都是同步的,多线程并发执行的时候是完全安全的,但是当单线程执行时,效率就会很低,因此在JDK1.5版本以后就出现了 StringBuilder(),但是在StringBuilder() 中的函数是不具备同步性的,因此用于缓冲区被单线程访问(这种情况十分普遍),此时 效率就会高很多,在使用中如果可以就尽量优先使用该类,因为在大多数时候都比StringBuffer() 要快。因此StringBuild() 被设计作为哦StringBuffer()  的一个简易替换

猜你喜欢

转载自blog.csdn.net/Stitch__/article/details/82078507