一、引入
如果我们用以前的方式去拼接 10000万
个字符串,代码也能写,但是拼起来之后速度非常非常慢。
但我想要的是速度非常非常快,所以就可以使用我们今天所学的 StringBuilder
开始拼接,这种方式 刷
一下就拼接完毕了。
StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的。
因此它的作用就是用来提高字符串的操作效率。它只是操作字符串的一个工具,并不是真的字符串。
例如以下代码,String s6 = s1 + s2 + s3 + s4 + s5;
在拼接的过程中产生了很多没用的字符串,每一次通过 +
的拼接都会产生一个新的字符串,但这些东西非常影响内存和运行效率,这并不是我们想要的结果,我想要的是一种快捷的方式。
String s1 = "aaa";
String s2 = "bbb";
String s3 = "ccc";
String s4 = "ddd";
String s5 = "eee";
String s6 = s1 + s2 + s3 + s4 + s5;
此时就可以使用 StringBuilder
,StringBuilder可以看做是一个容器,里面的内容是可以发生变化的,因此当 s6
在变化的时候都是在一个容器里发生变化的,并不会产生那么多没有用的字符串。
二、StringBuilder 的构造方法
StringBuilder
一共有两个构造。
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不包含任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
三、StringBuilder
常用方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 通过 toString() 就可以把StringBuilder 转换为String |
代码示例
PS:在Java中起名字的时候会有个小习惯,如果变量名不知道起什么,就可以用类型的首字母来做变量名。而 StringBuilder
类型是两个单词,第一个单词首字母是 s
,第二个单词首字母是 b
,所以合起来就是 sb
。同样我们也可以通过查阅 API帮助文档
,看看它上面的示例命名是什么,可以发现,也是 `sb。
下述代码很奇怪,sb
是 new
出来的对象,我打印一个对象应该是地址值才对,为什么这里什么都没有。
这是因为 StringBuilder
不是我们写的,而是Java已经写好的一个类。Java在底层对它做了一些特殊处理:打印对象不是地址值,而是属性值。
StringBuilder sb = new StringBuilder();
System.out.println(sb); // 结果是什么也没有
既然打印出来的是属性值,那下面代码打印结果就很好解释了。
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb); // abc
调用其方法
package com.itheima.stringbuilderdemo;
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//2.添加元素
sb.append(1);
sb.append(2.3);
sb.append(true); // 将这些进行字符串拼接,只不过这种拼接是在单个容器内部的拼接,而不是产生新的字符串
//3.反转
// PS:它是在容器内部直接做了反转。它跟字符串不一样,字符串本身是不能变化的,只有返回值才是截取、替换之后的结果;而 StringBuilder容器 里的内容是可以发生变化的,一旦调用 reverse() 方法后,容器内的数据就直接被反转过来了。
sb.reverse();
//4.获取长度
int len = sb.length();
System.out.println(len);
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//java在底层对他做了一些特殊处理。
//打印对象不是地址值而是属性值。
System.out.println(sb);
}
}
使用 toString()
package com.itheima.stringbuilderdemo;
public class StringBuilderDemo4 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder();
//2.添加字符串
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");
System.out.println(sb);//aaabbbcccddd,但是这个 sb 并不能直接被当做字符串,因为 sb 是StringBuilder类型的,这个 sb 只是一个容器,是来帮助我们操作字符串的工具。因此在我们拼接完后,还需要再把 StringBuilder 变回字符串才可以。
//3.再把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);//aaabbbcccddd
}
}
四、链式编程
链式编程:表示当我们在调用一个方法的时候,不需要用变量接收它的结果,可以继续调用其他方法。
package com.itheima.stringbuilderdemo;
import java.util.Scanner;
public class StringBuilderDemo5 {
public static void main(String[] args) {
// getString() 得到的是一个字符串,我们就可以使用这个字符串去调用字符串中的 substring 方法。
// substring 截取完后得到的又是一个新的字符串,此时我们还可以继续对这个新的字符串进行操作,例如 replace("A", "Q") ,将大写 A 替换成大写 Q 。
// 替换完后再去调用 length() 获取它的长度,而 length() 方法获取的是一个整数,此时它就不能再去调用字符串的方法了。
int len = getString().substring(1).replace("A", "Q").length();
System.out.println(len);
}
public static String getString(){ // 获取键盘里的字符串,然后把字符串做一个返回
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
return str;
}
}
学习完链式编程之后,我们就可以对刚刚的代码进行一个简化。
这是因为当我们调用 append()
方法之后它会返回一个 StringBuilder
对象,也就是所它把调用者的容器进行了一个返回,因此每一次的 append()
都会将容器进行返回,因此 append()
方法的结果还是 StringBuilder
对象,即这里的 sb
。
sb.append("aaa");
sb.append("bbb");
sb.append("ccc");
sb.append("ddd");
// 可直接写成
sb.append("aaa").append("bbb").append("ccc").append("ddd");
五、练习一:对称字符串
需求:键盘接受一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是
例如:
对称字符串:123321、111
非对称字符串:123123
代码示例:
package com.itheima.stringbuilderdemo;
import java.util.Scanner;
public class StringBuilderDemo6 {
//使用StringBuilder的场景:
//1.字符串的拼接
//2.字符串的反转
public static void main(String[] args) {
//1.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//2.反转键盘录入的字符串
String result = new StringBuilder().append(str).reverse().toString();
//3.比较
if(str.equals(result)){
System.out.println("当前字符串是对称字符串");
}else{
System.out.println("当前字符串不是对称字符串");
}
}
}
六、练习2:拼接字符串
需求:定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回。
调用该方法,并在控制台输出结果。例如:数组为int[] arr = {1,2,3}
; 。执行方法后的输出结果为:[1, 2, 3]
。
代码示例:
package com.itheima.stringbuilderdemo;
public class StringBuilderDemo7 {
public static void main(String[] args) {
//1.定义数组
int[] arr = {1,2,3};
//2.调用方法把数组变成字符串
String str = arrToString(arr);
System.out.println(str);
}
public static String arrToString(int[] arr){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length - 1){
sb.append(arr[i]);
}else{
sb.append(arr[i]).append(", ");
}
}
sb.append("]");
return sb.toString();
}
}