JAVASE 小白学习笔记 (12-3)Java中的常用类--StringBuffer类、StringBuilder类

1.StringBuffer类概述

在Java中我们如果对字符串进行拼接操作,每次拼接都能构建一个新的String对象,这样操作既费时有浪费时间,StringBuffer类就能解决这个问题。

  • StringBuffer(字符串缓冲区)是线程安全的可变字符序列,一个类似于String的字符串缓冲区。
public class MyTest {
    
    
    public static void main(String[] args) {
    
    
        //通过加号来进行字符串的拼接
      String s1="kobe";
      String s2="是著名的篮球运动员";
      String s3=s1+s2;
      System.out.println(s3);
        System.out.println("==========");
      //通过StringBuffer类可以进行字符串的拼接
        StringBuffer sb = new StringBuffer();
        sb.append("kobe");
        sb.append("是著名的篮球运动员");
        System.out.println(sb);
    }

2.StringBuffer类的方法

2.1 StringBuffer类的构造方法

StringBuffer类的构造方法 含义
public StringBuffer() 无参构造方法
public StringBuffer(int capacity) 指定容量的字符串缓冲区对象
public StringBuffer(String str) 指定字符串内容的字符串缓冲区对象
public class MyTest2 {
    
    
    public static void main(String[] args) {
    
    
        //StringBuffer():构造一个其中不带字符的字符串缓冲区,初始容量为16个字符
        StringBuffer sb = new StringBuffer();
        int capacity = sb.capacity();
        System.out.println(capacity);   //16

        //public StringBuffer(int capacity):指定容量的字符串缓冲区对象
        StringBuffer buffer = new StringBuffer(25);
        int capacity1 = buffer.capacity();
        System.out.println(capacity1);   //25

        //注意:往容器中追加内容,一旦超过容量,就会进行自动扩容处理
        buffer.append("lalalalalalalalalalalalalalalalalalalalalalal");
        System.out.println(buffer);

        //public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
        String s="科比是一名著名的篮球运动员";
        StringBuffer sb1 = new StringBuffer(s);
        System.out.println(sb1);
    }
}

2.2 StringBuffer类的获取长度与容量的方法

在这里注意介绍的是StringBuffer类中的两个容易混淆的方法:

StringBuffer的方法 含义
public int capacity() 返回当前容量
public int length() 返回长度(字符数)
public class MyTest3 {
    
    
    public static void main(String[] args) {
    
    
        StringBuffer sb = new StringBuffer();
        sb.append("hello");
        //length()获取长度
        int length = sb.length();
        System.out.println(length);    //5
        //capacity()获取容量
        int capacity = sb.capacity();
        System.out.println(capacity);   //16

    }
}

可以这样理解capacity()方法与length()方法,例如一个水杯的容量为500ml,实际上你接了200ml的水。这时你可以将capacity()方法视为这个水杯的总容量,而length()方法指的是你接的水量。而与此实例唯一不同的是,StringBufffer这个容器,当你添加的字符数超过容量时,会进行自动扩容的现象。


2.3 StringBuffer的添加功能

StringBuffer的添加功能 含义
public StringBuffer append(String str) 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str) 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public class MyTest4 {
    
    
    public static void main(String[] args) {
    
    
        StringBuffer sb = new StringBuffer();
        //public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
        StringBuffer sb2 = sb.append(100);
        //添加后返回的是容器本身,就可以使用链式编程进行
        StringBuffer sb3 = sb.append("hello").append(123).append(true).append(3.225);
        //StringBuffer重写了toString()方法,把存放在容器中的数据转换器为字符串返回
        String s = sb3.toString();
        System.out.println(s);
    }
};
public class MyTest5 {
    
    
    public static void main(String[] args) {
    
    
        StringBuffer sb = new StringBuffer();
        sb.append("我爱你");
        //public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
        sb.insert(0,123);
        System.out.println(sb);    //123我爱你

        //可以采取链式编程在指定的位置上进行追加
        sb.insert(0,"abc").insert(3,"lpom");
        System.out.println(sb);  //abclpom123我爱你
    }
}

2.4 StringBuffer的删除功能

StringBuffer的删除功能 含义
public StringBuffer deleteCharAt(int index) 删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end) 删除从指定位置开始指定位置结束的内容,并返回本身
public class MyTest6 {
    
    
    public static void main(String[] args) {
    
    
        StringBuffer sb = new StringBuffer();
        sb.append("科比是一名著名的篮球运动员");
        //public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
        sb.deleteCharAt(3);
        System.out.println(sb);  //科比是名著名的篮球运动员

        //public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
        sb.delete(3,7);  //删除从指定开始位置到指定定结束位置,含头不含尾
        System.out.println(sb);  //科比是篮球运动员

    }
}

2.5 StringBuffer的替换与反转功能

StringBuffer的替换与反转方法 含义
public StringBuffer replace(int start,int end,String str): 从start开始到end用str替换
public StringBuffer reverse() 字符串反转
public class MyTest7 {
    
    
    public static void main(String[] args) {
    
    
        StringBuffer sb = new StringBuffer();
        sb.append("大漠孤烟直,长河落日圆");
        //public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
        sb.replace(0,5,"宁为百夫长");
        System.out.println(sb);    //"宁为百夫长,长河落日圆"

        //public StringBuffer reverse():字符串反转
        //反转容器中的内容,注意返回的还是容器本身
        sb.reverse();
        System.out.println(sb);//"圆日落河长,长夫百为宁"
    }
}

2.6 StringBuffer查找字符串功能

项目 Value
int indexOf (String str) 从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
int indexOf (String str,int fromIndex) 从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
int lastIndexOf (String str) 从后往前查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
int lastIndexOf (String str,int fromIndex) 从后往前, 从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
public class MyTest8 {
    
    
    public static void main(String[] args) {
    
    
        StringBuffer buffer = new StringBuffer("asffghksk");
        // int indexOf (String str):从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
        int i = buffer.indexOf("s");
        System.out.println(i);     //1
        int i1 = buffer.indexOf("m");
        System.out.println(i1);    //-1

        //int indexOf (String str,int fromIndex):从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
        int i2= buffer.indexOf("f", 3);
        System.out.println(i2);   //3


        // int lastIndexOf (String str): 从后往前查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
        int i3 = buffer.lastIndexOf("ff");
        System.out.println(i3);     //2

        //int lastIndexOf (String str,int fromIndex):从后往前按从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
        int i4 = buffer.lastIndexOf("ff", 1);
        System.out.println(i4);
    }
}

2.7 StringBuffer截取功能

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

注意:返回值类型不再是StringBuffer本身,而是字符串

public class MyTest9 {
    
    
    public static void main(String[] args) {
    
    
        StringBuffer sb = new StringBuffer("科比是一名著名的运动员");
        //public String substring(int start):从指定位置截取到末尾
        // 返回值类型不再是StringBuffer本身
        String s = sb.substring(0);
        System.out.println(s);   //"科比是一名著名的运动员"
        //public String substring(int start,int end):截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
        String s1= sb.substring(0, 2);
        System.out.println(s1);  //"科比"

    }
}

2.8 StringBuffer与String之间的相互转换

ring类型转换为StringBuffer类型的方式
1.通过构造方法
2.通过append()方法
3.通过insert()方法
public class MyTest10 {
    
    
    public static void main(String[] args) {
    
    
        //将String类型转换为StringBuffer类型
        //1.通过构造方法进行转换
        StringBuffer sb = new StringBuffer("hello");
        //2.通过StringBuffer类的append()方法进行转换
        StringBuffer sb1 = new StringBuffer();
        sb1.append("helloworld");
        //通过StringBuffer类的insert()方法进行转换
        StringBuffer sb2 = new StringBuffer();
        sb2.insert(0,"hellojava");
    }
}
StringBuffer类型转换为 String类型
1.使用toString()方法进行转换
2.使用substring()方法进行转换
3.使用构造方法进行转换
public class MyTest11 {
    
    
    public static void main(String[] args) {
    
    
        //将StringBuffer转换为String
        StringBuffer sb = new StringBuffer();
        sb.append("helloworld");
        //1.通过toString方法进行转换
        String s = sb.toString();
        System.out.println(s);
        //2.通过substring方法进行转换
        String s1 = sb.substring(0);
        System.out.println(s1);
        //3.通过构造方法进行转换
        String s2 = new String(sb);
        System.out.println(s2);
    }
}

2.9 StringBuffer的案例习题

  • 1.把数组转成字符串, 需求:把数组中的数据按照指定个格式拼接成一个字符串。 举例:int[] arr = {1,2,3}; 输出结果: "[1, 2, 3]"用StringBuffer的功能实现
public class MyTest12 {
    
    
    public static void main(String[] args) {
    
    
        /*把数组转成字符串, 需求:把数组中的数据按照指定个格式拼接成一个字符串。
          举例:int[] arr = {1,2,3}; 输出结果: "[1, 2, 3]"用StringBuffer的功能实现
         */
        int []arr={
    
    1,2,3};
        String s="[";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < arr.length; i++) {
    
    
            if(i==sb.length()-1){
    
    
               sb.append(s).append(arr[i]).append("]");
            }
            else{
    
    
                sb.append(arr[i]);
            }
        }
        System.out.println(Arrays.toString(arr));     //"[1, 2, 3]"
    }
}
  • 2.把字符串反转。举例:键盘录入"abc" ,输出结果:“cba” ,用StringBuffer的功能实现
import java.util.Scanner;
public class MyTest13 {
    
    
    public static void main(String[] args) {
    
    
        //把字符串反转。举例:键盘录入"abc" ,输出结果:“cba” ,用StringBuffer的功能实现
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();
        StringBuffer sb = new StringBuffer(s);
        sb.reverse();
        System.out.println(sb.toString());
    }
}

输出的结果为:
在这里插入图片描述


3.StringBuffer和StringBuilder的区别

  • StringBuffer:线程安全的长度可变字符容器,线程安全,效率低。
  • StringBuilder:线程不安全的长度可变字符容器,(单线程使用时比StringBuffer的效率更快)线程不安全,效率高。
    在这里插入图片描述

在这里插入图片描述


4. StringBuffer与StringBuilder的传参问题形式参数问题

  • 引用数据类型作为参数传递,形参的改变会影响实参
  • 基本数据类型作为参数传递,形参的改变不影响实参
  • 注意:字符串是常量,在参数传递时属于值传递(字符串虽说是引用数据类型,但它作为参数传递时属于值传递,与基本数据类型传参原则保持一致)
public class MyTest14 {
    
    
    public static void main(String[] args) {
    
    
        /*1.String作为参数传递 String虽然是引用类型,但是它是一个常量,
          所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递,String类型输入值传递
          2.StringBuffer作为参数传递,为引用数据类型传递,行参的改变会影响实参
         */
        String str="abc";
        test(str);
        System.out.println(str);  //abc

        StringBuilder sb = new StringBuilder("科比是一名篮球运动员");
        test(sb);
        System.out.println(sb.toString()); //科比是一名篮球运动员,他投篮很飘逸
    }

    private static void test(StringBuilder sb) {
    
    
        sb.append(",他投篮很飘逸");

    }

    private static void test(String str) {
    
    
        str+="efg";
        System.out.println(str);  //abcefg
    }
}

5.StringJoiner的介绍(JDK1.8后)

  • StringJoiner是用来构建一个字符序列由一个分隔符分隔,可以从一个提供前缀和结束与提供的后缀。
StringJoiner的构造方法 含义
StringJoiner(CharSequence delimiter) 构建了一个字符容器,指定分隔符
StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) 构建了一个字符容器,指定分隔符,前缀,后缀
StringJoiner的其他方法介绍 含义
StringJoiner add(CharSequence newElement) 增加了一份给 CharSequence值的 StringJoiner价值的下一个元素
int length() 返回该 StringJoiner的 String表示长度
String toString() 把容器中的数据以字符串返回
import java.util.StringJoiner;
public class MyTest15 {
    
    
    public static void main(String[] args) {
    
    
        StringJoiner sj = new StringJoiner(",");
        sj.add("aaa").add("bbb").add("ccc");
        System.out.println(sj.toString());    //"aaabbbccc"
        System.out.println("=============");
        StringJoiner sj1 = new StringJoiner(",", "[", "]");
        sj1.add("aaa").add("bbb").add("ccc");
        System.out.println(sj1);      //"[aaa,bbb,ccc]"
    }
}

案例:把数组中的数据按照指定格式拼接成一个字符串,举例:int []arr={1,2,3};输出结果为:"[1,2,3]",用StringJoiner进行实现

import java.util.StringJoiner;
public class MyTest16 {
    
    
    public static void main(String[] args) {
    
    
          /*把数组中的数据按照指定格式拼接成一个字符串,举例:int []arr={1,2,3};
          输出结果为:"[1,2,3]",用StringJoiner进行实现*/
          int []arr={
    
    1,2,3};
          StringJoiner stringJoiner = new StringJoiner(",","[","]");
        for (int i = 0; i < arr.length; i++) {
    
    
            stringJoiner.add(arr[i]+"");

        }
        System.out.println(stringJoiner.toString());
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41537102/article/details/111826220