13--常用类和基础API--03

2023-12-13 14:04:30

1、StringBuffer、StringBuilder

因为String对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也比较高。因此,JDK又在java.lang包提供了可变字符序列StringBuffer和StringBuilder类型。

1.1 StringBuffer和StringBuilder的理解

java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。比如:

//情况1:
String s = new String("我喜欢学习"); 
//情况2:
StringBuffer buffer = new StringBuffer("我喜欢学习"); 
buffer.append("数学"); 

继承结构:

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样。

1.2 StringBuilder类的构造方法

方法名

说明

public StringBuilder()

创建一个空白可变字符串对象,不含有任何内容

public StringBuilder(int capacity)

创建一个指定容器的可变字符串对象

public StringBuilder(String str)

根据字符串的内容,来创建可变字符串对象

代码演示

package com.suyv.stringbulider;
/**
 *@Author: 憨憨浩浩
 *@CreateTime: 2023-12-12 13:56
 *@Description: StringBulider的容量(capacity())和长度(length())
 */
public class StringBuilder01 {
    public static void main(String[] args) {
        // StringBuffer()   创建一个字符串容器,初始默认capacity为16
        
        // public StringBuilder();
        // 无参构造
        StringBuilder stringBuilder = new StringBuilder();
        System.out.println(stringBuilder);
        System.out.println(stringBuilder.capacity());       // 16
        System.out.println(stringBuilder.length());         // 0

        // public StringBuilder(int capacity);
        // 有参构造--参数为StringBuilder容量
        StringBuilder stringBuilder1 = new StringBuilder(10);
        System.out.println(stringBuilder1);
        System.out.println(stringBuilder1.capacity());      // 10
        System.out.println(stringBuilder1.length());        // 0

        // public StringBuilder(String str);
        // 有参构造--参数为String字符串
        StringBuilder stringBuilder2 = new StringBuilder("hello");
        System.out.println(stringBuilder2);                 // hello
        System.out.println(stringBuilder2.capacity());      // 21
        System.out.println(stringBuilder2.length());        // 5
    }
}

1.3 StringBuilder类常见方法

1.3.1 添加方法

public StringBulider append(String str)

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

public StringBulider insert(int offset,String str)

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

package com.suyv.stringbulider;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 14:29
*@Description: 添加方法
*/
public class StringBulider02 {
    public static void main(String[] args) {

        System.out.println("---------------append()------------");

        // 创建字符串缓冲区对象
        StringBuilder stringBuilder = new StringBuilder();

        // 一步一步的添加数据
        stringBuilder.append("hello");
        stringBuilder.append(true);
        stringBuilder.append(12);
        stringBuilder.append(34.56);

        System.out.println(stringBuilder);      // hellotrue1234.56

        StringBuilder stringBuilder1 = new StringBuilder();

        // 链式编程
        stringBuilder1.append("hello").append(true).append(12).append(34.56);
        System.out.println(stringBuilder1);     // hellotrue1234.56

        System.out.println("---------------insert()------------");

        // public StringBuffer insert(int offset,String str);
        // 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
        StringBuilder stringBuilder2 = new StringBuilder("hellodemo");
        stringBuilder2.insert(5, "world");// helloworlddemo
        System.out.println(stringBuilder2);
    }
}

1.3.2 删除方法

public StringBulider deleteCharAt(int index)

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

public StringBulider delete(int start,int end)

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

package com.suyv.stringbulider;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 14:50
*@Description: 删除方法
*/
public class StringBuilder03 {
    public static void main(String[] args) {
        // 创建对象
        StringBuilder stringBulider = new StringBuilder();
        // 添加功能
        stringBulider.append("hello").append("world").append("java");
        System.out.println(stringBulider);

        // public StringBuffer deleteCharAt(int index);
        // 删除指定位置的字符,并返回本身
        stringBulider.deleteCharAt(1);
        System.out.println(stringBulider);

        // public StringBuffer delete(int start,int end);
        // 删除从指定位置开始指定位置结束的内容,并返回本身
        stringBulider.delete(4,9);
        System.out.println(stringBulider);

        // 删除所有的数据
        stringBulider.delete(0, stringBulider.length());
        System.out.println("stringBulider:" + stringBulider);

    }
}

1.3.3 替换方法

public StringBuilder replace(int start,int end,String str)

????????用指定的String字符串替换指定的字符串

public StringBuilder serCharAt(int index,char ch)

????????替换指定索引位置的字符

package com.suyv.stringbulider;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 15:22
*@Description: 替换方法
*/
public class StringBuilder04 {
    public static void main(String[] args) {

        // 创建对象
        StringBuilder stringBulider = new StringBuilder();
        // 添加功能
        stringBulider.append("hello").append("world").append("java");
        System.out.println(stringBulider);

        // public StringBuffer replace(int start,int end,String str);
        // 从start开始到end用str替换
        stringBulider.replace(10,14,"你好");
        System.out.println(stringBulider);

        // public StringBuilder serCharAt(int index,char ch);
        // 替换指定索引位置的字符
        stringBulider.setCharAt(0,'H');
        System.out.println(stringBulider);      // Helloworld你好
    }
}

1.3.4 反转方法

public StringBuilder reserve();

????????字符串反转

package com.suyv.stringbulider;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 15:26
*@Description: 字符串反转
*/
public class StringBuilder05 {
    public static void main(String[] args) {

        // 创建对象
        StringBuilder stringBulider = new StringBuilder();
        // 添加功能
        stringBulider.append("hello").append("world").append("java");
        System.out.println(stringBulider);	// helloworldjava

        // public StringBuffer reverse();
        // 字符串反转
        stringBulider.reverse();
        System.out.println(stringBulider);	// avajdlrowolleh
    }
}

1.3.5 转换方法

方法名

说明

public String toString()

将StringBuilder转换为String

//创建对象
StringBuilder sb = new StringBuilder("Hello");
String str = sb.toString();

1.3.6 查找方法

charAt(int index)

????????获取指定索引的字符

indexOf(String str)

????????获取字符串中第一次出现的该字符串的索引

indexOf(String str,int index)

????????获取字符串中从指定位置开始第一次出现该字符串的索引

lastIndexOf(String str)

????????返回从后向前查找字符串最后一次出现在该字符串的索引

????????即查找最后一次出现的索引值

lastIndexOf(String str,int index)

????????返回从指定位置从后向前查找字符串最后一次出现在该字符串的索引

substring(int start,int end)

????????返回从指定位置开始到指定位置结束的字符串

package com.suyv.stringbuilder;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-13 11:51
*@Description: TODO
*/
public class StringBuilder07 {
    public static void main(String[] args) {

        // 创建对象
        StringBuilder stringBuilder = new StringBuilder();
        // 添加功能
        stringBuilder.append("HelloJava");
        System.out.println(stringBuilder);      // HelloJava

        // 获取对应索引的字符,返回char类型
        char ch = stringBuilder.charAt(0);
        System.out.println(ch);                 // H

        // 获取字符串对象第一次出现该字符串的索引
        int index = stringBuilder.indexOf("Hello");
        System.out.println(index);              // 0
        index = stringBuilder.indexOf("Hello",1);
        System.out.println(index);              // -1

        // 获取字符串对象最后一次出现该字符串的索引
        index = stringBuilder.lastIndexOf("a");
        System.out.println(index);              // 8
        index = stringBuilder.lastIndexOf("a",7);
        System.out.println(index);              // 6

        // 获取字符串对象中对应索引的子字符串
        String substring = stringBuilder.substring(5, 9);
        System.out.println(substring);          // Java
    }
}

1.4 StringBuilder和String相互转换

StringBuilder转换为String

????????public String toString()

????????????????通过 toString() 就可以实现把 StringBuilder 转换为 String

String转换为StringBuilder

????????public StringBuilder(String s)

????????????????通过构造方法就可以实现把 String 转换为 StringBuilder

示例代码

package com.suyv.stringbulider;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 15:33
*@Description: StringBuilder与String相互转换
*/
public class StringBuilder06 {
    public static void main(String[] args) {
        System.out.println("=====String -- > StringBuilder=====");
        String s = "hello";
        // 注意:不能把字符串的值直接赋值给StringBuilder
        // StringBuffer sb = "hello";//错误
        // StringBuffer sb = s;//错误

        // 方式1:通过构造方法
        StringBuilder stringBuilder1 = new StringBuilder(s);
        System.out.println(stringBuilder1);     // hello
        System.out.println(stringBuilder1.getClass());  // class java.lang.StringBuilder

        // 方式2:通过append()方法
        StringBuilder stringBuilder2 = new StringBuilder();
        stringBuilder2.append(s);
        System.out.println(stringBuilder2); // hello
        System.out.println(stringBuilder2.getClass());  // class java.lang.StringBuilder

        System.out.println("=====StringBuilder -- > String=====");
        // 方式1:通过构造方法
        StringBuilder stringBuilder3 = new StringBuilder("java");
        String str1 = new String(stringBuilder3);
        System.out.println(str1);       // java
        System.out.println(str1.getClass());        // class java.lang.String

        // 方式2:通过toString()方法
        String str2 = stringBuilder3.toString();
        System.out.println(str2);   // java
        System.out.println(str2.getClass());        // class java.lang.String
    }
}

1.5 StringBuilder,StringBuffer,String区别

区分String、StringBuffer、StringBuilder

  • String:不可变的字符序列; 底层使用char[]数组存储(JDK8.0中)
  • StringBuffer:可变的字符序列;线程安全(方法有synchronized修饰),效率低;底层使用char[]数组存储 (JDK8.0中)
  • StringBuilder:可变的字符序列; jdk1.5引入,线程不安全的,效率高;底层使用char[]数组存储(JDK8.0中)

1.6 StringBuilder案例

1.6.1 字符串拼接案例

案例需求

  • 定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如,数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

代码实现

package com.suyv.stringbulider;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 16:47
*@Description: 字符串拼接
*/
public class StringBuilderTest01 {
    public static void main(String[] args) {
        // 定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
        int[] arr = {1, 2, 3};
        // 调用方法,用一个变量接收结果
        String str = arrayToString(arr);
        // 输出结果
        System.out.println(str);
    }

    // 定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回
    public static String arrayToString(int[] arr){
        //在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for(int i = 0; i < arr.length; i++) {
            if(i == arr.length - 1) {
                stringBuilder.append(arr[i]);
            } else {
                stringBuilder.append(arr[i]).append(", ");
            }
        }
        stringBuilder.append("]");
        String s = stringBuilder.toString();
        return  s;
    }
}

1.6.2 字符串反转案例

案例需求

  • 定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果例如,键盘录入abc,输出结果 cba

代码实现

package com.suyv.stringbulider;

import java.util.Scanner;

/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 17:04
*@Description: TODO
*/
public class StringBuilderTest02 {
    public static void main(String[] args) {

        //键盘录入一个字符串,用 Scanner 实现
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();

        //调用方法,用一个变量接收结果
        String s = myReverse(line);

        //输出结果
        System.out.println("s:" + s);

    }

    // 定义一个方法,实现字符串反转。返回值类型 String,参数 String s
    public static String myReverse(String str) {
        //在方法中用StringBuilder实现字符串的反转,并把结果转成String返回
        //String --- StringBuilder --- reverse() --- String

        // StringBuilder sb = new StringBuilder(str);
        // sb.reverse();
        // String ss = sb.toString();
        // return ss;

        return new StringBuilder(str).reverse().toString();
    }
}

1.6.3 案例三

package com.suyv.stringbulider;
/**
*@Author: 憨憨浩浩
*@CreateTime: 2023-12-12 17:07
*@Description: TODO
*/
public class StringBuilderTest03 {
    public static void main(String[] args) {
        String str = null;
        StringBuffer sb = new StringBuffer();
        sb.append(str);

        System.out.println(sb.length());    // 4

        System.out.println(sb);             // null

        StringBuffer sb1 = new StringBuffer(str);
        System.out.println(sb1);            // NullPointerException
    }
}

文章来源:https://blog.csdn.net/weixin_46612641/article/details/134968955
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。