常用API

1.API

API概述-帮助文档的使用

  • 什么是API

    ​ API (Application Programming Interface) :应用程序编程接口

  • java中的API指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来.

    Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
API的使用步骤:
1.查看类
java.util.Scanner :该类需要import导入后使用。
2.查看构造方法
public Scanner(InputStream source) :
构造一个新的 Scanner ,它生成的值是从指定的输入流扫描的。
3.查看成员方法
public String next() :
获取键盘录入的字符串(不能包含空白字符),遇到空白字符/回车换行就认为录入结束

public String nextLine()
获取键盘录入的一行字符串(可以包含空白字符),遇到回车换行就认为录入结束

public class Demo01Scanner {
public static void main(String[] args) {
//创建Scanner类的对象
Scanner sc = new Scanner(System.in);

System.out.println("请输入一个字符串: ");
String str = sc.nextLine();
System.out.println("您输入的字符串: "+str);

System.out.println("请再输入一个字符串: ");
String str2 = sc.next();
System.out.println("您输入的第二个字符串: "+str2);
}
}

2. String类

2.1 String概述

1
2
3
4
5
6
7
8
9
10
11
12
13
java.lang.String类: 用来描述的字符串的     
//String 类在 java.lang 包下,所以使用的时候不需要导包
说白了: String 类代表字符串。
Java 程序中的所有字符串字面值(字符串常量)(如 "abc" )都作为此类的实例实现(对象)。

字符串是常量;它们的值在创建之后不能更改(但凡是你感觉它要变化的时候,其实都是创建了一个新的字符串)。

1. 字符串不变:字符串的值在创建后不能被更改。
String s1 = "abc";
s1 += "d";//s1 = s1 + "d";
System.out.println(s1); // "abcd"
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。

创建字符串对象的区别对比

  • 通过构造方法创建 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
  • 直接赋值方式创建 以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

== 的使用:

​ 1.基本类型: 比较的是具体的数据值是否相同
​ 2.引用类型: 比较的是地址值是否相同

img

1
2
3
4
2. 因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc";
String s2 = "abc";
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。

img

1
2
3
4
5
6
7
8
9
3. "abc" 等效于 char[] data={ 'a' , 'b' , 'c' }
jdk8及以前: String内部使用的就是字符数组
jdk9及以后: String内部使用的就是字节数组
例如:
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
// String底层是靠字符数组实现的。

2.2 String类的构造方法

注意:

String这个类比较特殊, 打印其对象名的时候, 不会出现内存地址

而是该对象所记录的真实内容. 面向对象-继承, Object类

当我们需要把字节数组或字符数组转字符串的时候,才会考虑使用构造方法,其他情况不建议使用,因为每new1次都会在内存中产生新的地址值,浪费空间;

构造方法 说明
new String() 创建空白字符串,等价于 ""
new String(char[] chs) 将字符数组转为字符串
new String(byte[] bs) 将字节数组转为字符串

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
1.public String(): 创建一个空白字符串对象,不含有任何内容,等价于""
2.public String(char[] chs) 根据构造方法字符数组chs,创建一个字符串对象
3.public String(byte[] bs): 根据构造方法字节数组bs,创建一个字符串对象
4.String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
5.public String(String s): 根据构造方法字符串s,创建一个新的字符串对象,作用是对参数字符串做备份的
*/
public class Demo01String {
public static void main(String[] args) {
//(1)public String(): 创建一个空白字符串对象,不含有任何内容,等价于""
String s1 = new String();
System.out.println("Hello"+s1+"World");//HelloWorld

//(2)public String(char[] chs) 根据构造方法字符数组chs,创建一个字符串对象
char[] chs = {'a','b','c'};
String s2 = new String(chs);
System.out.println(s2);//abc

//(3)public String(byte[] bs): 根据构造方法字节数组bs,创建一个字符串对象
byte[] bs = {97,98,99};
String s3 = new String(bs);
System.out.println(s3);//abc

//(4)String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
String s4 = "abc";
System.out.println(s4);//abc
}
}

2.4 创建字符串对象的区别对比

  • 通过构造方法创建

    ​ 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同

  • 直接赋值方式创建

    ​ 以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

2.5 字符串的比较

  • == 比较基本数据类型:比较的是具体的值
  • == 比较引用数据类型:比较的是对象地址值

String类 : public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写

代码 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Demo1Equals {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ABC";
String s3 = "abc";

// equals : 比较字符串内容, 区分大小写
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));

// equalsIgnoreCase : 比较字符串内容, 忽略大小写
System.out.println(s1.equalsIgnoreCase(s2));
}
}

2.6 遍历字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.Scanner;

public class Test2 {
/*
需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

思路:
1. 键盘录入一个字符串,用 Scanner 实现
2. 遍历字符串,首先要能够获取到字符串中的每一个字符
public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
3. 遍历字符串,其次要能够获取到字符串的长度
public int length():返回此字符串的长度
4. 遍历打印
9
*/
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
// 2. 遍历字符串,首先要能够获取到字符串中的每一个字符
for(int i = 0; i < s.length(); i++){
// i : 字符串的每一个索引
char c = s.charAt(i);
System.out.println(c);
}
}
}

2.7 统计字符次数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Scanner;

public class Test3 {
/*
需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

思路:
1. 键盘录入一个字符串,用 Scanner 实现
2. 将字符串拆分为字符数组
public char[] toCharArray( ):将当前字符串拆分为字符数组并返回
3. 遍历字符数组

*/
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
// 2. 将字符串拆分为字符数组
char[] chars = s.toCharArray();
// 3. 遍历字符数组
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
}
}

2.8 手机号屏蔽-字符串截取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Scanner;

public class Test5 {
/*
需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽
最终效果为:156****1234

思路:
1. 键盘录入一个字符串,用 Scanner 实现
2. 截取字符串前三位
3. 截取字符串后四位
4. 将截取后的两个字符串,中间加上****进行拼接,输出结果

*/
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机号:");
String telString = sc.nextLine();
// 2. 截取字符串前三位
String start = telString.substring(0,3);
// 3. 截取字符串后四位
String end = telString.substring(7);
// 4. 将截取后的两个字符串,中间加上****进行拼接,输出结果
System.out.println(start + "****" + end);
}
}

2.9 敏感词替换-字符串替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Scanner;

public class Test6 {
/*
需求:键盘录入一个 字符串,如果字符串中包含(TMD),则使用***替换

思路:
1. 键盘录入一个字符串,用 Scanner 实现
2. 替换敏感词
String replace(CharSequence target, CharSequence replacement)
将当前字符串中的target内容,使用replacement进行替换,返回新的字符串
3. 输出结果

*/
public static void main(String[] args) {
// 1. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String s = sc.nextLine();
// 2. 替换敏感词
String result = s.replace("TMD","***");
// 3. 输出结果
System.out.println(result);
}
}

2.10 切割字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import com.itheima.domain.Student;

import java.util.Scanner;

public class Test7 {
/*
需求:以字符串的形式从键盘录入学生信息,例如:“张三 , 23”
从该字符串中切割出有效数据,封装为Student学生对象
思路:
1. 编写Student类,用于封装数据
2. 键盘录入一个字符串,用 Scanner 实现
3. 根据逗号切割字符串,得到(张三)(23)
String[] split(String regex) :根据传入的字符串作为规则进行切割
将切割后的内容存入字符串数组中,并将字符串数组返回
4. 从得到的字符串数组中取出元素内容,通过Student类的有参构造方法封装为对象
5. 调用对象getXxx方法,取出数据并打印。

*/
public static void main(String[] args) {
// 2. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生信息:");
String stuInfo = sc.nextLine();
// stuInfo = "张三,23";
// 3. 根据逗号切割字符串,得到(张三)(23)
String[] sArr = stuInfo.split(",");

// System.out.println(sArr[0]);
// System.out.println(sArr[1]);

// 4. 从得到的字符串数组中取出元素内容,通过Student类的有参构造方法封装为对象
Student stu = new Student(sArr[0],sArr[1]);

// 5. 调用对象getXxx方法,取出数据并打印。
System.out.println(stu.getName() + "..." + stu.getAge());
}
}

2.11 String的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/* 判断功能的方法 
- public boolean equals(Object anObject) :
将此字符串(调用分的对象)与指定对象(传递给方法的参数)进行比较内容是否相同, 区分大小写。
举例:
s1.equals(s2):比较s1和s2的内容是否一模一样,如果一样返回true,否则返回false

- public boolean equalsIgnoreCase (String anotherString) :
将此字符串与指定对象进 行比较内容是否相同,忽略大小写。
举例:s1.equalsIgnoreCase(s2):比较s1和s2的内容是否相同,但是不区分大小写

- public boolean contains(String str) : 当且仅当此字符串包含指定的str时,返回 true。
举例:s1.contains(s2): s1中包含s2,返回true,不包含返回false

- public boolean startsWith(String str) : 判断调用方法的字符串是否以参数字符串开头
举例:s1.startsWith(s2): s1以s2开头,返回true,否则返回false

- public boolean endsWith(String str) : 判断调用方法的字符串是否以参数字符串结尾
举例:s1.endsWith(s2): s1以s2结尾,返回true,否则返回false
*/
public class Demo03PanDuan {
public static void main(String[] args) {
char[] chs = {'a','b','c'};
String s1 = "abc";
String s2 = new String(chs);
String s3 = new String("abc");
String s4 = "Abc";

//s1.equals(s2):比较s1和s2的内容是否一模一样,如果一样返回true,否则返回false
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s3));//true
System.out.println(s2.equals(s3));//true
System.out.println(s1.equals(s4));//false

//举例:s1.equalsIgnoreCase(s2):比较s1和s2的内容是否相同,但是不区分大小写
System.out.println(s1.equalsIgnoreCase(s2));//true
System.out.println(s1.equalsIgnoreCase(s3));//true
System.out.println(s2.equalsIgnoreCase(s3));//true
System.out.println(s1.equalsIgnoreCase(s4));//true

//举例:s1.contains(s2): s1中包含s2,返回true,不包含返回false
String s5 = "Hello World";
System.out.println(s5.contains("Hello"));//true
System.out.println(s5.contains("hello"));//false
System.out.println(s5.contains(" World"));//true
System.out.println(s5.contains(" world"));//false
}
}

/*
获取功能的方法
- public int length () :返回此字符串的长度。
举例:s.length() 获取s中的字符的数量

- public String concat (String str) :将指定的字符串连接到该字符串的末尾。
举例:s1.concat(s2) 把s2连接到s1的末尾 等价于 s1 += s2

- public char charAt (int index) :返回指定索引处的 char值。
举例:s1.charAt(5) 获取s1中索引为5的字符

- public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。
举例:s1.indexOf(s2) 查找s2在s1中第一次出现的位置,如果不存在,返回-1

- public String substring (int beginIndex) :
返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
举例:s1.substring(5) 截取s1字符串从索引5开始一直到最后的内容

- public String substring (int beginIndex, int endIndex) :
返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
举例:s1.substring(5,10) 截取s1字符串从索引5开始一直到索引10之间的内容(包含5,不包含10)
*/
public class Demo05HuoQu {
public static void main(String[] args) {
String s1 = "Hello World";
// 举例:s.length() 获取s中的字符的数量
System.out.println(s1.length());//11
System.out.println("".length());//0

//举例:s1.concat(s2) 把s2连接到s1的末尾 等价于 s1 += s2
String s2 = " ITheima";
String s3 = s1.concat(s2);
System.out.println(s1);//Hello World
System.out.println(s2);// ITheima
System.out.println(s3);//Hello World ITheima

//举例:s1.charAt(5) 获取s1中索引为5的字符
System.out.println(s1.charAt(6));//W
System.out.println(s1.charAt(s1.length() - 1));//d

//举例:s1.indexOf(s2) 查找s2在s1中第一次出现的位置,如果不存在,返回-1
System.out.println("小字符串World在大字符串Hello World中出现的索引: "+s1.indexOf("World"));//6
System.out.println("小字符串world在大字符串Hello World中出现的索引: "+s1.indexOf("world"));//-1

//举例:s1.substring(5,10) 截取s1字符串从索引5开始一直到索引10之间的内容(包含5,不包含10)
//获取"World"
String s4 = s1.substring(6, 11);
System.out.println(s4);//World

//举例:s1.substring(5) 截取s1字符串从索引5开始一直到最后的内容
String s5 = s1.substring(6);
System.out.println(s5);//World
System.out.println(s1);//Hello World
}
}

/*
转换功能的方法
- public char[] toCharArray () :把字符串变成对应的字符数组。
举例:s1.toCharArray() 把s1变成字符数组

- public byte[] getBytes () :把字符串变成对应的字节数组。
举例:s1.getBytes() 把s1变成字节数组

- public String replace (String oldStr, String newStr) :
把字符串中的所有的oldStr替换成newStr。
举例:s1.replace("a","A") 把s1中的所有的"a"替换成"A"
*/
public class Demo04StringConvert {
public static void main(String[] args) {
String s1 = "abc";
//举例:s1.toCharArray() 把s1变成字符数组
char[] chs = s1.toCharArray();
System.out.println("字符串长度: " + s1.length());//3
System.out.println("字符数组长度: " + chs.length);//3
//遍历字符数组
for (int i = 0; i < chs.length; i++) {
System.out.print(chs[i]+" ");
}
System.out.println("----------------");

//举例:s1.getBytes() 把s1变成字节数组
byte[] bs = s1.getBytes();
for (int i = 0; i < bs.length; i++) {
System.out.print(bs[i]+" ");
}

//举例:s1.replace("a","A") 把s1中的所有的"a"替换成"*"
String s2 = "我靠,你他妈有病,你个二货,你个傻叉....";

String s3 = s2.replace("靠", "*");
System.out.println(s3);
}
}

/*
"aa bb cc dd"
分割功能的方法
- public String[] split(String regex) :
将此字符串按照给定的regex(规则)拆分为字符串数组
举例:
String[] "a,b,c,d".split(",")
把"a,b,c,d"按照逗号切割,将切割后的多个子字符串存入String[] 中
*/
public class Demo05StringSplit {
public static void main(String[] args) {
String s1 = "aaa,bbb,ccc,ddd";
//按照逗号切割
String[] strs = s1.split(",");
System.out.println("字符串数组长度: "+strs.length);//4

//遍历字符串数组
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}

String s2 = "hello world java";
//按照空格切割
String[] strs2 = s2.split(" ");
System.out.println("字符串数组长度: "+strs2.length);//3
//遍历字符串数组
for (int i = 0; i < strs2.length; i++) {
System.out.println(strs2[i]);
}
}
}

public class Test7 {
/*
需求:以字符串的形式从键盘录入学生信息,例如:“张三 , 23”
从该字符串中切割出有效数据,封装为Student学生对象
思路:
1. 编写Student类,用于封装数据
2. 键盘录入一个字符串,用 Scanner 实现
3. 根据逗号切割字符串,得到(张三)(23)
String[] split(String regex) :根据传入的字符串作为规则进行切割
将切割后的内容存入字符串数组中,并将字符串数组返回
4. 从得到的字符串数组中取出元素内容,通过Student类的有参构造方法封装为对象
5. 调用对象getXxx方法,取出数据并打印。

*/
public static void main(String[] args) {
// 2. 键盘录入一个字符串,用 Scanner 实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生信息:");
String stuInfo = sc.nextLine();
// stuInfo = "张三,23";
// 3. 根据逗号切割字符串,得到(张三)(23)
String[] sArr = stuInfo.split(",");

// System.out.println(sArr[0]);
// System.out.println(sArr[1]);

// 4. 从得到的字符串数组中取出元素内容,通过Student类的有参构造方法封装为对象
Student stu = new Student(sArr[0],sArr[1]);

// 5. 调用对象getXxx方法,取出数据并打印。
System.out.println(stu.getName() + "..." + stu.getAge());
}
}

3 StringBuilder类

3.1 StringBuilder类概述

概述 : StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的

3.2 StringBuilder类和String类的区别

  • String类: 内容是不可变的 使用String进行字符串的大量拼接时,产生大量垃圾,效率低

  • StringBuilder类: 内容是可变的 使用StringBuilder字符串的大量拼接时,产生垃圾少,效率高

    img

3.3StringBuilder类的构造方法

方法名 说明
public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
StringBuilder的构造方法
public StringBuilder() :
构造一个空的StringBuilder容器,内部是默认长度为16的字符数组

public StringBuilder(String str) :
构造一个StringBuilder容器,并将方法参数字符串str添加进去
注意:
打印引用类型变量,默认调用toString方法(帮助我们把数据转换成字符串的形式)
*/
public class Demo01StringBuilder {
public static void main(String[] args) {
// 构造一个空的StringBuilder容器,内部是默认长度为16的字符数组
StringBuilder sb = new StringBuilder();
System.out.println(sb);
System.out.println(sb.toString());

//构造一个StringBuilder容器,并将方法参数字符串str添加进去
StringBuilder sb2 = new StringBuilder("HelloWorld");
System.out.println(sb2);//HelloWorld
System.out.println(sb2.toString());//HelloWorld
}
}

3.4 StringBuilder常用的成员方法

(没有static修饰,必须使用StringBuilder类的对象调用)

  • 添加和反转方法

    方法名 说明
    public StringBuilder append(任意类型) 添加数据,并返回对象本身
    public StringBuilder reverse() 返回相反的字符序列
  • 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
StringBuilder常用的方法有3个:
public StringBuilder append(...) :
添加任意类型数据的字符串形式,并返回当前对象自身。
public StringBuilder reverse() :
返回反转的字符序列
public String toString() :
将当前StringBuilder对象转换为String对象。
*/
public class Demo02StringBuilderMethod {
public static void main(String[] args) {
//创建StringBuilder类的对象
StringBuilder sb = new StringBuilder();
//append方法:把数据原样添加到StringBuilder容器中
sb.append(97);
sb.append('a');
sb.append("hello");
sb.append(true);
System.out.println(sb); //97ahellotrue

//链式编程
sb.append("hello").append("world").append("java").append(100);
System.out.println("sb:" + sb);

//reverse方法: 实现StringBuilder容器内部的内容进行反转的
sb.reverse();
System.out.println(sb); //eurtolleha79



StringBuilder sb = new StringBuilder("A");
StringBuilder sb2 = sb.append("B");
StringBuilder sb3 = sb2.append("C");
System.out.println(sb);//ABC
System.out.println(sb2);//ABC
System.out.println(sb3);//ABC
/*
==的使用:
1.基本类型: 比较的是具体的数据值是否相同
2.引用类型: 比较的是地址值是否相同
发现结果都是true:
说明引用变量sb/sb2/sb3 保存的地址值相同,操作的是同一个对象
*/
System.out.println(sb == sb2);//true
System.out.println(sb == sb3);//true
System.out.println(sb2 == sb3);//true

//如果使用对象调用方法后,该方法返回本类对象的话,可以使用链式编程
StringBuilder sb4 = new StringBuilder();
sb4.append(100).append('a').append("hello").append("false");
System.out.println(sb4); //100ahellofalse
}
}

3.5StringBuilder和String相互转换

  • StringBuilder转换为String

    ​ public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String

  • String转换为StringBuilder

    ​ public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

  • 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
StringBuilder和String相互转换
1.String 转成 StringBuilder
构造方法:
public StringBuilder(String s):
把String类型的方法参数s,通过构造方法转换成StringBuilder对象
2.StringBuilder 转成 String
成员方法:
public String toString():
把调用方法的StringBuilder对象转换成String
*/
public class StringBuilderDemo02 {
public static void main(String[] args) {
/*
//StringBuilder 转换为 String
StringBuilder sb = new StringBuilder();
sb.append("hello");

//String s = sb; //这个是错误的做法

//public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
String s = sb.toString();
System.out.println(s);
*/

//String 转换为 StringBuilder
String s = "hello";

//StringBuilder sb = s; //这个是错误的做法

//public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
StringBuilder sb = new StringBuilder(s);

System.out.println(sb);
}
}

3.6StringBuilder练习-字符串反转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Demo06ReverseString {
public static void main(String[] args) {
//1.定义String变量ss,并初始化
String ss = "abc";

//2.调用reverserString方法,传递字符串ss,获取反转后的结果字符串,保存到String变量result中
String result = reverserString(ss);

//3.打印result
System.out.println("反转前: "+ss);
System.out.println("反转后: "+result);
}

//定义一个方法,实现字符串反转。
public static String reverserString(String str) {
//1.把方法参数String类型的str,转换成StringBuilder对象sb
StringBuilder sb = new StringBuilder(str);

//2.StringBuilder对象sb调用reverse方法,实现内部的内容的反转
sb.reverse();

//3.StringBuilder对象sb调用调用toString方法,转换成String对象newStr
String newStr = sb.toString();

//4.返回String对象newStr
return newStr;
}

//定义一个方法,实现字符串反转。
public static String reverserString2(String str) {
//链式编程
return new StringBuilder(str).reverse().toString();
}
}

3.7 StringBuilder拼接字符串案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class StringBuilderTest01 {
public static void main(String[] args) {
//定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
int[] arr = {1, 2, 3};

//调用方法,用一个变量接收结果
String s = arrayToString(arr);

//输出结果
System.out.println("s:" + s);

}

//定义一个方法,用于把 int 数组中的数据按照指定格式拼接成一个字符串返回
/*
两个明确:
返回值类型:String
参数:int[] arr
*/
public static String arrayToString(int[] arr) {
//在方法中用 StringBuilder 按照要求进行拼接,并把结果转成 String 返回
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;
}
}

4、StringJoiner - 字符串连接器

StringJoiner是Java 8引入的java.util包中的类,专门用于构建由分隔符分隔的字符序列,并可选择性地添加前缀和后缀。

为什么使用?

  • 简化字符串拼接:特别是需要添加分隔符的场景
  • 避免手动处理分隔符:自动处理元素间的分隔,不会出现多余的或缺失的分隔符
  • 代码更清晰:相比StringBuilder或String的+操作,代码意图更明确
  • 支持前缀后缀:方便构建格式化的字符串(如JSON数组、SQL IN语句等)

如何使用?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.StringJoiner;

public class StringJoinerDemo {
public static void main(String[] args) {
// 1. 基础用法 - 只有分隔符
StringJoiner joiner1 = new StringJoiner(", ");
joiner1.add("Java");
joiner1.add("Python");
joiner1.add("C++");
System.out.println(joiner1.toString()); // 输出: Java, Python, C++

// 2. 完整用法 - 分隔符 + 前缀 + 后缀
StringJoiner joiner2 = new StringJoiner(", ", "[", "]");
joiner2.add("Apple");
joiner2.add("Banana");
joiner2.add("Orange");
System.out.println(joiner2.toString()); // 输出: [Apple, Banana, Orange]

// 3. 链式调用
StringJoiner joiner3 = new StringJoiner(" | ")
.add("Red")
.add("Green")
.add("Blue");
System.out.println(joiner3.toString()); // 输出: Red | Green | Blue

// 4. 空值处理
StringJoiner joiner4 = new StringJoiner(", ");
System.out.println(joiner4.toString()); // 输出: "" (空字符串)

// 5. 设置空值时的默认显示
StringJoiner joiner5 = new StringJoiner(", ", "{", "}");
joiner5.setEmptyValue("{}");
System.out.println(joiner5.toString()); // 输出: {}
}
}

对比其他字符串拼接方式

方法 优点 缺点 适用场景
StringJoiner 自动处理分隔符,支持前后缀,代码清晰 Java 8+,略微性能开销 格式化列表、路径拼接、SQL语句等
StringBuilder 性能高,功能灵活 需要手动处理分隔符和格式 循环拼接、性能敏感场景
String + 操作符 简单直接 每次+都创建新对象,性能差 简单少量拼接