StringBuilder
前言
public static void main(String[] args){
String s="hello";
s+="world";
System.out.println(s);
}
- 在堆内存的常量池中,有一块地址
001
,内容为hello
;地址002
,内容为world
,又把结果的helloworld
放在地址003
中,最后把003
赋值给s
,s
通过003
指向常量池的helloworld
- 如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费内存空间(内存001和002就浪费掉了),而这种操作还不可避免。
- 所以Java提供的StringBuilder类就解决这个问题。
概述
- StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,创建之后的内容是可变的
- 作用:提高字符串的操作效率
String和StringBuilder的区别
- String:内容是不可变的
- StringBuilder:内容是可变的
StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,创建可变字符串对象 |
代码演示:
public class StringBuliderDemo1 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println("sb:" + sb);
System.out.println("sb.length():" + sb.length());
StringBuilder sb2 = new StringBuilder("maomao");
System.out.println("sb2:" + sb2);
System.out.println("sb2.length():" + sb2.length());
}
}
输出结果:
sb:
sb.length():0
sb2:maomao
sb2.length():6
System.out.println("sb:" + sb);
打印的并不是地址值,原因是:StringBuilder
是Java已经写好的类,java在底层对他做了一些特殊处理,打印对象不是地址值而是属性值
StringBuilder的成员方法(添加和反转)
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
代码演示:
public class StringBuliderDemo2 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
//链式编程
sb.append("hello").append("world").append("maomao").append(1998);
//等价于
//sb.append("hello");
//sb.append("world");
//sb.append("maomao");
//sb.append(1998);
System.out.println("sb:" + sb);
sb.reverse();
System.out.println("sb:" + sb);
}
}
也可以采用链式编程–代码演示:
输出结果:
sb:helloworldmaomao1998
sb:8991oamoamdlrowolleh
StringBuilder和String相互转换
StringBuilder转换为String
public String toString()
:通过 toString()就可以实现把StringBuilder转换为String
String转换为StringBuilder
public StringBuilder(String s)
:通过构造方法就可以实现把String转换为StringBuilder
代码演示:
public class StringBuliderDemo3 {
public static void main(String[] args) {
//StringBuilder转换为String
StringBuilder sb = new StringBuilder();
sb.append("hello");
String s = sb.toString();
System.out.println(s);
String转换为StringBuilder
String ss = "world";
StringBuilder sb2 = new StringBuilder(ss);
System.out.println(ss);
}
}
案例
1. 对称字符串
需求:键盘接收一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是
public class StringBuliderTest1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入一个字符串:");
String str = sc.next();
String str2 = new StringBuilder(str).reverse().toString();
if (str.equals(str2)) {
System.out.println("是");
} else {
System.out.println("否");
}
}
}
2. 拼接字符串(升级版)
需求:
定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如,数组为int[] arr={1,2,3};
,执行方法后的输出结果为[1, 2, 3]
代码实现:
public class StringBuliderTest2 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
String s = arrayToString(arr);
System.out.println("s: " + s);
}
public static String arrayToString(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("]");
String s = sb.toString();
return s;
}
}
输出结果:
s: [1, 2, 3]
3. 反转字符串(升级版)
需求:
定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
例如:键盘录入abc
,输出结果cba
代码实现:
import java.util.Scanner;
public class StringBuliderTest3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入一个字符串:");
String line = sc.nextLine();
String s = myReverse(line);
System.out.println("s: " + s);
}
public static String myReverse(String s) {
return new StringBuilder(s).reverse().toString();
}
}