知识点–2 StringBuilder类
知识点–2.1 String类字符串拼接问题
目标:
- String类字符串拼接问题
步骤:
- 字符串拼接问题
讲解:
字符串拼接问题
由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。例如:
public class StringDemo {
public static void main(String[] args) {
String s = "Hello";
s += "World";// s = s + "World";
System.out.println(s);// HelloWorld
// 在内存中有三个字符串对象,分别是:"Hello" "World" "HelloWorld"
}
}
在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。
根据这句话分析我们的代码,其实总共产生了三个字符串,即"Hello"
、"World"
和"HelloWorld"
。引用变量s首先指向Hello
对象,最终指向拼接出来的新字符串对象,即HelloWord
。
由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用java.lang.StringBuilder
类。
小结
- 结论:
- String类的字符串拼接,每一次拼接完都会得到一个新的字符串对象,所以比较耗时,也浪费空间
知识点–2.2 StringBuilder类概述以及与String类的区别
目标
- 理解StringBuilder的概述和与String类的区别
路径
- StringBuilder类的概述
- StringBuilder类和String类的区别
讲解
StringBuilder类概述
StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的
StringBuilder类和String类的区别
-
String类:内容是不可变的
-
StringBuilder类:内容是可变的
小结
- StringBuilder 是一个可变的字符串类,表示字符串
- StringBuilder 拼接是直接在本身的字符串末尾进行追加的
知识点–2.3 StringBuilder类的构造方法
目标:
- StringBuilder构造方法
路径:
- StringBuilder构造方法
讲解:
- 常用的构造方法
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象
- 示例代码
public class Test {
public static void main(String[] args) {
/*
StringBuilder类的构造方法
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象
*/
// 创建一个空的可变字符串对象
StringBuilder sb1 = new StringBuilder();
System.out.println("sb1:"+sb1+"===");// ""
System.out.println("sb1的字符串长度:"+sb1.length());// 0
// 根据字符串的内容,来创建可变字符串对象
StringBuilder sb2 = new StringBuilder("helloword");
System.out.println("sb2:"+sb2);// helloword
System.out.println("sb2的字符串长度:"+sb2.length());// 9
}
}
知识点–2.4 StringBuilder类拼接和反转方法
目标:
- StringBuilder类拼接和反转方法
路径:
- StringBuilder类拼接和反转方法
讲解:
- 添加和反转方法
public StringBuilder append(任意类型) 拼接数据,并返回对象本身
public StringBuilder insert(int offset, 任意类型) 在指定位置插入数据,并返回对象本身
public StringBuilder reverse() 反转字符串,并返回对象本身
- 拼接数据
public class Test {
public static void main(String[] args) {
/*
StringBuilder类拼接方法:
public StringBuilder append(任意类型) 拼接数据,并返回对象本身
*/
// 创建可变的字符串对象
StringBuilder sb = new StringBuilder("Hello");
// sb可变字符串拼接数据
StringBuilder sb1 = sb.append("World");
System.out.println("sb:"+sb);// HelloWorld
System.out.println("sb1:"+sb1);// HelloWorld
System.out.println(sb == sb1);// true
// sb.append(100);// 拼接整数
// sb.append(true);// 拼接boolean值
// sb.append(3.14);// 拼接小数
// sb.append('a');// 拼接字符
// 链式编程
sb.append(100).append(true).append(3.14).append('a');
System.out.println("拼接后的字符串:"+sb);// HelloWorld100true3.14a
}
}
- 插入数据
public class Test {
public static void main(String[] args) {
/*
public StringBuilder insert(int offset, 任意类型) 在指定位置插入数据,并返回对象本身
*/
// 创建可变的字符串对象
StringBuilder sb = new StringBuilder("Hello-World");
// 往sb对象中插入数据
StringBuilder sb1 = sb.insert(5, "-Hello-java");
System.out.println("sb:"+sb);// Hello-Hello-java-World
System.out.println("sb1:"+sb1);// Hello-Hello-java-World
System.out.println(sb == sb1);// true
// 插入数据
sb.insert(6,100).insert(6,3.14).insert(6,true).insert(6,'a');
System.out.println("sb:"+sb);// Hello-atrue3.14100Hello-java-World
}
}
- 反转字符串
public class Test {
public static void main(String[] args) {
/*
StringBuilder类反转的方法:
public StringBuilder reverse() 反转字符串,并返回对象本身
*/
// 创建可变的字符串对象
StringBuilder sb = new StringBuilder("Hello-World");
// 反转
StringBuilder sb1 = sb.reverse();
System.out.println("sb:"+sb);// dlroW-olleH
System.out.println("sb1:"+sb1);// dlroW-olleH
System.out.println(sb == sb1);// true
}
}
小结
StringBuilder类常用方法:
public StringBuilder append(任意类型) 添加数据,并返回对象本身
public StringBuilder reverse() 返回相反的字符序列
public StringBuilder insert(int offset, 任意类型) 在指定位置插入数据,并返回对象本身
知识点–2.5 StringBuilder和String相互转换
目标:
- StringBuilder和String相互转换
路径:
- StringBuilder转换为String
- String转换为StringBuilder
讲解:
String转换为StringBuilder
public StringBuilder(String s)
:通过StringBuilder的构造方法就可以实现把 String 转换为 StringBuilder
StringBuilder转换为String
public String toString()
:通过StringBuilder类中的 toString() 就可以实现把 StringBuilder 转换为 String
- 示例代码
public class Test {
public static void main(String[] args) {
/*
StringBuilder和String相互转换:
String--->StringBuilder: public StringBuilder(String str);
StringBuilder--->String: public String toString();
*/
// String--->StringBuilder
String str = "Hello-World";
StringBuilder sb = new StringBuilder(str);// sb: "Hello-World"
// StringBuilder--->String
String s = sb.toString();// s: "Hello-World"
System.out.println("s:"+s);
System.out.println("sb:"+sb);
}
}
小结
StringBuilder:
public StringBuilder(String str); String--->StringBuilder
public String toString(); StringBuilder--->String
实操–2.6 字符串拼接升级版案例
需求
定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,
并在控制台输出结果。例如,数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]
分析
- 定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
- 定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回。返回值类型 String,参数列表 int[] arr
- 在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
- 调用方法,用一个变量接收结果
- 输出结果
实现
public class Test {
public static void main(String[] args) {
/*
需求
定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,
并在控制台输出结果。例如,数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]
*/
int[] arr = {1,2,3};
System.out.println(concat(arr));
}
/**
* 按照指定格式拼接数组元素
*
* @param arr
* @return 拼接后的字符串
*/
public static String concat(int[] arr) {
// 1.创建一个空的可变字符串对象
StringBuilder sb = new StringBuilder();
// 2.循环遍历arr数组中的元素
for (int i = 0; i < arr.length; i++) {
// 3.在循环中,获取数组元素
int e = arr[i];
// 4.在循环中,判断遍历出来的元素
if (i == 0) {
// 4.如果遍历出来的元素是第一个元素,拼接的格式为: [+元素+逗号空格
sb.append("[").append(e).append(", ");
} else if (i == arr.length - 1) {
// 4.如果遍历出来的元素是最后一个元素,拼接的格式为: 元素+]
sb.append(e).append("]");
} else {
// 4.如果遍历出来的元素是中间元素,拼接的格式为: 元素+逗号空格
sb.append(e).append(", ");
}
}
// 5.返回字符串
return sb.toString();
}
}
实操–2.7 字符串反转升级版案例
需求
定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
例如,键盘录入abc,输出结果 cba
分析
- 键盘录入一个字符串,用 Scanner 实现
- 定义一个方法,实现字符串反转。返回值类型 String,参数 String s
- 在方法中用StringBuilder实现字符串的反转,并把结果转成String返回
- 调用方法,用一个变量接收结果
- 输出结果
实现
public class Test {
public static void main(String[] args) {
/*
需求
定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
例如,键盘录入abc,输出结果 cba
*/
// 键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next();
// 调用reverse反转方法
// 打印输出
System.out.println(reverse(str));
}
public static String reverse(String str){
// 1.创建一个可变的字符串,字符串中的内容和参数str一样
//StringBuilder sb = new StringBuilder(str);
// 2.调用可变字符串的reverse方法
//sb.reverse();
// 3.返回
//return sb.toString();
// 链式编程
return new StringBuilder(str).reverse().toString();
}
}