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);
}
}