字符串的缓冲区

StringBuilder
概述
1、StringBuilder是一个可变的字符序列,因为在类中提供了修改私有成员变量的方法
常用的方法是append和insert,就是在StringBuilder对象本身上,进行修改操作
2、StringBuilder底层和String类型一样,也是维护了一个字符数组,数组是私有的,外界无法直接访问,因此在StringBuilder或者String中对数组进行操作的公有方法的封装
3、String类型和StringBuilder的关系:都是用于描述字符串
1、String是不可变的字符序列,没有提供修改私有成员的方法;StringBuilder是可变的字符序列,因为提供了修改成员变量的方法;
2、String长度本身也不可以变化,StringBuilder长度可以变化,可以认为StringBuilder就像一个可以伸缩的容器,用于存储字符
构造方法
1、构造方法作用:创建当前对象、将其他类型的数据,转换成当前类型
2、StringBuilder的构造方法:
StringBuilder():创建一个生成器,初始容量为16个字符
StringBuilder(int capacity):创建一个生成器,初始容量为capacity大小
StringBuilder(String str):创建一个生成器,初始值就是str这些字符,初始大小是str+16
3、获取容积的方法:
capacity():获取当前生成器的容器大小
length():获取当前生成器中的字符个数
代码示例
package com.ujiuye.demos;

public class Demo01_StringBuilder的构造方法 {

public static void main(String[] args) {
	StringBuilder sb1 = new StringBuilder();
	System.out.println(sb1.capacity());
	
	StringBuilder sb2 = new StringBuilder(10);
	System.out.println(sb2.capacity());
	
	StringBuilder sb3 = new StringBuilder("Hello");
	System.out.println(sb3.capacity());
}

}
添加功能
1、append(任意类型):可以将任意数据类型,转成字符,添加到生成器中
2、insert(int index, 任意数据类型):可以将任意数据类型,添加到指定的位置
说明:1、index的范围是0~当前缓冲区的大小;2、插入数据之后,数据本身的索引就是参数中指定的index
代码示例
package com.ujiuye.demos;

public class Demo02_StringBuilder的添加功能 {

public static void main(String[] args) {
	StringBuilder sb1 = new StringBuilder();//"1"
	sb1.insert(0, "a");
	System.out.println(sb1);//ba
	sb1.insert(0, "b");
	System.out.println(sb1);
	sb1.insert(1, "xyz");
	System.out.println(sb1);
}

private static void test1_append() {
	StringBuilder sb1 = new StringBuilder();
	System.out.println(sb1);
	System.out.println(sb1.capacity());//16
	sb1.append("abcd");
	System.out.println(sb1);//abcd,StringBuilder是可变字符序列
	System.out.println(sb1.capacity());//16,容器够用,就不用扩容
	sb1.append("abcd").append("abcd").append("abcd");
	System.out.println(sb1);
	System.out.println(sb1.capacity());
	sb1.append("a");
	System.out.println(sb1);
	System.out.println(sb1.capacity());
	
	StringBuilder sb2 = new StringBuilder();
	sb2.append("abcdabcdabcdabcdabcdabcdabcdabcdabcd");
	System.out.println(sb2.capacity());//36
}

}
删除功能
1、deleteCharAt(int index) :删除指定索引的字符
2、delete(int start, int end):删除指定范围的字符,被删除的部分包含头不包含尾
代码示例
package com.ujiuye.demos;

public class Demo03_StringBuilder的删除功能 {

public static void main(String[] args) {
	
	test2_delete();
}

private static void test2_delete() {
	StringBuilder sb1 = new StringBuilder("abcdef");
	//删除cd
	sb1.delete(2, 4);
	System.out.println(sb1);
}

private static void test1_deleteCharAt() {
	StringBuilder sb1 = new StringBuilder("abcdefg");
	sb1.deleteCharAt(2);
	System.out.println(sb1);
	sb1.deleteCharAt(6);//String索引越界异常
	System.out.println(sb1);
}

}
替换和反转功能
1、replace(int start, int end ,String str):
将字符串缓冲区中的从start开始到end-1这部分内容,替换成str
2、reverse():将原有字符序列进行反转
代码示例
package com.ujiuye.demos;

public class Demo04_StringBuilder的替换反转功能 {

public static void main(String[] args) {
	test2_reverse();
}

private static void test2_reverse() {
	StringBuilder sb1 = new StringBuilder("abcdefg");
	sb1.reverse();
	System.out.println(sb1);
}

private static void test1_replace() {
	StringBuilder sb1 = new StringBuilder("abcdefg");
	sb1.replace(2, 5, "qq");
	System.out.println(sb1);
}

}
练习1
定义一个方法,接收一个String类型的字符串,返回该字符串的反转形式
举例:接收字符串为abc,返回字符串为cba
要求:使用StringBuilder进行反转,提高开发效率
代码示例
package com.ujiuye.demos;

import java.util.Scanner;

/**

  • 定义一个方法,接收一个String类型的字符串,返回该字符串的反转形式
    举例:接收字符串为abc,返回字符串为cba
    要求:使用StringBuilder进行反转,提高开发效率
    */
    public class Demo05_反转练习 {

    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String line = sc.nextLine();
    System.out.println(reverse(line));
    }

    public static String reverse(String str) {
    return new StringBuilder(str).reverse().toString();
    }
    }
    练习2
    定义一个方法,接收一个int[]类型的数组,返回该数组的字符串表示形式
    举例:接收数组为int[] arr = {1, 2, 3},返回的字符串为[1, 2, 3]
    要求:使用StringBuilder进行拼接,提高运行效率
    代码示例
    package com.ujiuye.demos;
    /**

  • 定义一个方法,接收一个int[]类型的数组,返回该数组的字符串表示形式
    举例:接收数组为int[] arr = {1, 2, 3},返回的字符串为[1, 2, 3]
    要求:使用StringBuilder进行拼接,提高运行效率
    */
    public class Demo06_拼接练习 {

    public static void main(String[] args) {
    String str = “abc”;
    String result = str + “d”;
    System.out.println(result);

     int[] arr = {1,2,3};
     System.out.println(arr2Str2(arr));
    

    }

    public static String arr2Str2(int[] arr) {
    StringBuilder sb = new StringBuilder("[");
    for (int i = 0; i < arr.length; i++) {
    sb.append(arr[i]).append(i == arr.length - 1 ? “]” : ", ");
    }
    return sb.toString();
    }

    public static String arr2Str1(int[] arr) {
    String result = “[”;
    for (int i = 0; i < arr.length; i++) {
    result += arr[i] + (i == arr.length - 1 ? “]” : ", ");
    }
    return result;
    }
    }
    String和StringBuilder拼接字符串的区别
    1、使用String类型拼接字符串:时间和空间上都非常浪费,浪费的程度和数组规模相关
    1、创建一个StringBuilder的存储空间,大小为第一个字符串的长度+16(第一个对象)
    2、将第一个字符串添加到缓冲区中
    3、将第二个字符串添加到缓冲区中
    4、将缓冲区对象转成字符串对象(创建了一个新的字符串对象)(第二个对象)
    5、返回该字符串对象
    2、使用StringBuilder拼接字符串:时间和空间上都非常节省,无论循环多少次,都只创建两个对象
    1、创建一个新的StringBuilder的存储空间
    2、在StringBuilder的基础上进行添加,不创建新的字符串
    3、循环完成后,将StringBuilder转成String
    String和StringBuilder的相互转换
    1、String转成StringBuilder
    1、StringBuilder的构造方法
    2、append方法
    2、StringBuilder转成String类型
    1、toString的方法
    2、使用String的构造方法
    代码示例
    package com.ujiuye.demos;

public class Demo07_String和StringBuilder的相互转换 {

public static void main(String[] args) {
	String str = "abc";
	StringBuilder sb = new StringBuilder(str);
	
	String result = sb.toString();
}

}
StringBuffer和StringBuilder的区别
1、共同点:
都是字符串的缓冲区,都是字符串的生成器,都是可变的字符序列
2、不同点:
1、出现版本不同:
StringBuffer在jdk1.0出现的
StringBuilder在jdk1.5出现的
2、线程安全性不同:
StringBuffer是线程安全的,在多线程环境下仍然保证数据安全
StringBuilder是线程不安全,在多线程环境下无法保证数据安全
3、效率不同:
StringBuffer效率低
StringBuilder效率高
String和StringBuilder作为方法的参数
1、String作为方法的参数进行传递,无法修改原值。在被调用的方法中,修改引用指向的对象,和主方法中的引用无关。

2、StringBuilder作为方法的参数进行传递,如果在被调用的方法中,修改的是StringBuilder的引用,那么不会改变原有对象中的数据

3、StringBuilder作为方法的参数进行传递,如果在被调用的方法中,通过该引用修改了对象的数据,那么原值就会发生改变。

代码示例
package com.ujiuye.demos;

public class Demo08_String和StringBuilder作为方法的参数 {

public static void main(String[] args) {

// String str = “abc”;
// update(str);
// System.out.println(str);
// StringBuilder sb = new StringBuilder(“abc”);
// update(sb);
// System.out.println(sb);
StringBuilder sb = new StringBuilder(“abc”);
update1(sb);
System.out.println(sb);
}

public static void update1(StringBuilder sb) {
	sb.replace(0, sb.length(), "xyz");
	System.out.println(sb);
}

public static void update(StringBuilder sb) {
	sb = new StringBuilder("xyz");
	System.out.println(sb);
}

public static void update(String str) {
	str = "xyz";
	System.out.println(str);
}

}

猜你喜欢

转载自blog.csdn.net/weixin_42199626/article/details/91417521