zoukankan      html  css  js  c++  java
  • 【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

     

  • 相关阅读:
    循环队列和链队列的实现
    【lightoj-1026】Critical Links(桥)
    顺序栈和链栈的实现
    【51nod-1605】棋盘问题
    【51nod-1596】搬货物
    【海明码】(容易看懂)
    【lightoj-1094】树的直径(DFS)
    【lightoj-1046】Rider(BFS)
    【第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-F】等式(因子个数)
    浅谈Vue个性化dashBoard 布局
  • 原文地址:https://www.cnblogs.com/zoe233/p/12840911.html
Copyright © 2011-2022 走看看