【JAVA基础】13 StringBuffer类

1. StringBuffer类的概述

  • StringBuffer类概述

    • 线程安全的可变字符序列。

    • 类似String的字符串缓冲区,但不能修改。
    • 在任意时间点上都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

  • StringBuffer和String的区别

    • String是一个不可变的字符序列

      • StringBuffer是一个可变的字符序列

        • StringBuffer不能像String用“+”与任意类型数据进行拼接
        • 但有append,insert,delete等方法改变序列的长度和内容

 

2. StringBuffer类的构造方法

  • StringBuffer的构造方法:

    • public StringBuffer():  无参构造方法

    • public StringBuffer(int capacity):  指定容量的字符串缓冲区对象

    • public StringBuffer(String str):  指定字符串内容的字符串缓冲区对象

  • StringBuffer的方法:

    • public int capacity():返回当前容量。 理论值(不掌握)

    • public int length(): 返回长度(字符数)。 实际值

  • 案例演示

    • 构造方法和长度方法的使用

    • package com.heima.stringbuffer;
      
      public class Demo1_StringBuffer {
      
          /**
          StringBuffer() 
                    构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。 
          StringBuffer(CharSequence seq) 
                public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。 
          StringBuffer(int capacity) 
                    构造一个不带字符,但具有指定初始容量的字符串缓冲区。 
          StringBuffer(String str) 
                    构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。 
      
           */
          public static void main(String[] args) {
              StringBuffer sb = new StringBuffer();
              System.out.println(sb.length());  // 输出0
              System.out.println(sb.capacity()); // 输出16
              
              StringBuffer sb2 = new StringBuffer(10);
              System.out.println(sb2.length());  // 输出0
              System.out.println(sb2.capacity()); // 输出10
              
              StringBuffer sb3 = new StringBuffer("heima");
              System.out.println(sb3.length());  // 输出5
              System.out.println(sb3.capacity()); // 输出21,字符串的length() + 初始容量16
              
          }
      
      }
      View Code

3. StringBuffer的添加功能

  • StringBuffer的添加功能

    • public StringBuffer append(String str):

      • 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身

      • append是一个重载的方法,可以添加多种数据类型,如:
        • boolean b
        • char c
        • char[] str
        • char[] str,int offset,int len
        • CharSequence s
        • CharSequence s,int start, int end
        • double d
        • float f
        • int i
        • long lng
        • Object obj
        • String str
        • StringBuffer sb
      • StringBuffer是字符串缓冲区,当new的时候是在堆内存创建了一个对象,底层是一个长度为16的字符数组。
      • 当调用添加的方法时,不会再重新创建对象,在不断向原缓冲区添加字符
    • public StringBuffer insert(int offset,String str):

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

    • 代码示例
      • package com.heima.stringbuffer;
        
        public class Demo2_StringBuffer {
        
            /**
            StringBuffer的添加功能
        
                public StringBuffer append(String str):
                
                    可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
                
                public StringBuffer insert(int offset,String str):
                
                    在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
             */
            public static void main(String[] args) {
                method1_append();
                
                method2_insert();
            
                
            }
        
            public static void method2_insert() {
                StringBuffer sb = new StringBuffer("01234");
                sb.insert(3, "heima"); // 在指定位置添加元素,如果没有指定位置的索引就会报索引越界异常
                System.out.println(sb);
            }
        
            public static void method1_append() {
                StringBuffer sb = new StringBuffer();
                StringBuffer sb2 = sb.append(true);
                StringBuffer sb3 = sb.append("heima");
                StringBuffer sb4 = sb.append(100);
                
                System.out.println(sb.toString());  // StringBuffer类中重写了toString方法,显示的是对象的属性值
                System.out.println(sb2.toString());
                System.out.println(sb3.toString());
                System.out.println(sb4.toString());
            }
        
        }
        View Code

4. StringBuffer的删除功能

  • StringBuffer的删除功能

    • public StringBuffer deleteCharAt(int index):

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

    • public StringBuffer delete(int start,int end):

      • 删除从指定位置开始指定位置结束的内容,并返回本身

package com.heima.stringbuffer;

public class Demo3_StringBuffer {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        //sb.deleteCharAt(5);  // 当缓冲区中这个索引上没有元素的时候,就会报索引越界异常
        sb.append("heima");
        sb.deleteCharAt(3);  // 根据索引位置删除对应的字符
        System.out.println(sb);
        
        sb.delete(0,2);
        System.out.println(sb); // 删除索引0,1上的对应的值
        
        sb.delete(0,sb.length()); // 清空缓冲区
        
        sb = new StringBuffer();  // 不要用这种方式清空缓冲区,原来的会变成垃圾,浪费内存
        System.out.println(sb);
    }
}
View Code

5. StringBuffer的替换和反转功能

  • StringBuffer的替换功能

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

      • 从start开始到end用str替换

  • StringBuffer的反转功能

    • public StringBuffer reverse():

      • 字符串反转

package com.heima.stringbuffer;

public class Demo4_StringBuffer {

    /**
     StringBuffer的替换功能

        public StringBuffer replace(int start,int end,String str):
    
        从start开始到end用str替换
    
    StringBuffer的反转功能
    
        public StringBuffer reverse():


     */
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("heima");
        sb.replace(0, 2, "ba");
        System.out.println(sb);
        
        sb.reverse();
        System.out.println(sb);
        
    }

}
View Code

6. StringBuffer的截取功能及注意事项

  • StringBuffer的截取功能

    • public String substring(int start):

      • 从指定位置截取到末尾

    • public String substring(int start,int end):

      • 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置

  • 注意事项

    • 注意:返回值类型不再是StringBuffer本身

package com.heima.stringbuffer;

public class Demo5_StringBuffer {

    /**
    StringBuffer的截取功能

        public String substring(int start):
        
            从指定位置截取到末尾
        
        public String substring(int start,int end):
        
            截取从指定位置开始到结束位置,包括开始位置,不包括结束位置

    注意事项

        注意:返回值类型不再是StringBuffer本身
     */
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("我爱家人");
        String sub = sb.substring(2);
        System.out.println(sub);
        System.out.println(sb);
        
        String sub2 = sb.substring(1,2);
        System.out.println(sub2);
    }

}
View Code

7. StringBuffer和String的相互转换

  • String -- StringBuffer

    • 通过构造方法

    • 通过append()方法

  • StringBuffer -- String

    • 通过构造方法

    • 通过toString()方法

    • 通过subString(0,length);

package com.heima.stringbuffer;

public class Demo6_StringBuffer {

    /**
     String -- StringBuffer

        通过构造方法
        
        通过append()方法
        
    StringBuffer -- String
        
        通过构造方法
        
        通过toString()方法
        
        通过subString(0,length);

     */
    public static void main(String[] args) {
        stringToStringBuffer();
        stringBufferToString();
    }

    public static void stringBufferToString() {
        StringBuffer sb = new StringBuffer("heima");
        String s1 = new String(sb);
        System.out.println(s1);
        
        String s2 = sb.toString();
        System.out.println(s2);
        
        String s3 = sb.substring(0, sb.length());
        System.out.println(s3);
    }

    public static void stringToStringBuffer() {
        // 通过构造方法,将字符串转换为StringBuffer对象
        StringBuffer sb = new StringBuffer("heima");
                
        // 通过append方法,将字符串转换为StringBuffer对象
        StringBuffer sb2 = new StringBuffer();
        sb2.append("heima");
        System.out.println(sb2);
        
    }

}
View Code

8. 把数组转成字符串

  • 案例演示

    • 需求:把数组中的数据按照指定个格式拼接成一个字符串

    • 举例: int[] arr = {1,2,3}; 输出结果: "[1, 2, 3]"

      • package com.heima.test;
        
        public class Test1 {
        
            /**
             需求:把数组中的数据按照指定个格式拼接成一个字符串
        
            举例: int[] arr = {1,2,3}; 输出结果: "[1, 2, 3]"
             */
            public static void main(String[] args) {
                int[] arr = {1,2,3};
                System.out.println(array2String(arr));
                
            }
            
            public static String array2String(int[] arr) {
                StringBuffer sb = new StringBuffer();
                sb.append("[");
                for(int i = 0; i < arr.length; i++) {
                    if(i == arr.length -1) {
                        sb.append(arr[i]).append("]");
                    } else {
                        sb.append(arr[i] + ",");
                    }
                }
            
                return sb.toString();
            }
        
        }
        用StringBuffer实现

 

9. 字符串反转

  • 案例演示

  • 需求:把字符串反转

  • 举例:键盘录入"abc" 输出结果:"cba"

  • package com.heima.test;
    
    import java.util.Scanner;
    
    public class Test2 {
    
        /**
        需求:把字符串反转
        
        举例:键盘录入"abc" 输出结果:"cba"
         */
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String line = sc.nextLine();
            
            StringBuffer sb = new StringBuffer(line);
            sb.reverse();
            System.out.println(sb);
        }
        
        
    }
    View Code

 

10. StringBuffer和StringBuilder的区别

  • StringBuilder的概述

    • 一个可变的字符序列。

    • 此类提供一个与StringBuffer兼容的API,但不保证同步。

    • 该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)
    • 如果可能,建议优先使用该类,因为在大多数实现中,它比StringBuffer要快。
  • 面试题

    • String,StringBuffer,StringBuilder的区别

      • String是一个不可变的字符序列
      • StringBuffer,StringBuilder是可变的字符序列
      • StringBuffer,StringBuilder的区别

        • StringBuffer是jdk1.0版本的,是线程安全的(同步的),效率低

        • StringBuilder是jdk1.5版本的,是线程不安全的(不同步的),效率高

 

11. String和StringBuffer分别作为参数传递

  • 形式参数问题

    • String作为参数传递

    • StringBuffer作为参数传递

  • 案例演示

    • String和StringBuffer分别作为参数传递问题

    • package com.heima.stringbuffer;
      
      public class Demo7_StringBuffer {
      
          /**
          形式参数问题:
              String作为参数传递
              StringBuffer作为参数传递
          基本数据类型的值传递,不改变其值;
          引用数据类型的值传递,改变其值。
           */
          public static void main(String[] args) {
              String s = "heima";
              System.out.println(s); // 输出heima
              change(s);
              System.out.println(s); // 输出heima
              
              StringBuffer sb = new StringBuffer();
              sb.append("heima");
              System.out.println(sb); // 输出heima
              change(sb);
              System.out.println(sb); // 输出heimaitcast
          }
      
          public static void change(String s) {
              s += "itcast";
          }
          
          public static void change(StringBuffer sb) {
              sb.append("itcast");
          }
      
      }
      View Code

 

原文地址:https://www.cnblogs.com/zoe233/p/12840911.html