J a v a S t r i n g B u i l d e r \huge{Java \space StringBuilder} Java StringBuilder
概述
S t r i n g B u i l d e r StringBuilder StringBuilder类是一种特殊的可变字符串的操作类,可以把它看做成一种特殊的对象容器。(简单讲的话就是一种特殊的字符串类型)
为什么要使用它?
既然 S t r i n g B u i l d e r StringBuilder StringBuilder类型是一种字符串类型,那么为什么不直接使用 S t r i n g String String类型呢?为什么还要这么麻烦呢?
因为字符串的操作使用
S
t
r
i
n
g
B
u
i
l
d
e
r
StringBuilder
StringBuilder类型为基础进行操作的话,效率疯狂提高❗❗
(具体怎么提高见后面的内存原理图)
如何使用它?
①. 构造器
示例:
StringBuilder sb = new StringBuilder();
//创建了一个StringBuilder里面不包含任何内容
或者构造器传入参数字符串 S t r i n g String String就可以进行特殊的初始化。
②. 常用方法
1. append()方法
a p p e n d ( ) append() append():在字符串后面添加数据并返回 S t r i n g B u i l d e r StringBuilder StringBuilder对象本身。(这点很重要,有关于后面的链式编程使用)
示例:
//向空的StringBuilder对象sb中添加数据然后打印
StringBuilder sb = new StringBuilder(); // ""
sb.append("a");
sb.append("b");
sb.append("c");
sb.append(1);
sb.append(false);
sb.append(3.3);
sb.append("abc");
//重写了toString()方法
System.out.println(sb);
运行结果:
S
t
r
i
n
g
B
u
i
l
d
e
r
StringBuilder
StringBuilder的
a
p
p
e
n
d
(
)
append()
append()还是很厉害的,代码中的多种数据类型都连接成
S
t
r
i
n
g
B
u
i
l
d
e
r
StringBuilder
StringBuilder类型了。
❗❗而且可以知道
S
t
r
i
n
g
B
u
i
l
d
e
r
StringBuilder
StringBuilder类型中的
t
o
S
t
r
i
n
g
(
)
toString()
toString()方法也重写了。
a
p
p
e
n
d
(
)
append()
append()也支持链式编程
示例:
StringBuilder sb1 = new StringBuilder();
// 支持链式编程
sb1.append("a").append("b").append("c").append("我爱你中国");
System.out.println(sb1);
为什么支持链式编程?
就像前面说的,
a
p
p
e
n
d
(
)
append()
append()方法会返回一个
S
t
r
i
n
g
B
u
i
l
d
e
r
StringBuilder
StringBuilder对象:
返回这个对象之后,继续.append()
,进行添加,添加完之后继续.append()
…,这就完成了链式编程。
2. reverse()方法
r
e
v
e
r
s
e
(
)
reverse()
reverse():反转
S
t
r
i
n
g
B
u
i
l
d
e
r
(
)
StringBuilder()
StringBuilder()类型中的数据。
并且返回这个对象!!(链式编程警觉!!)
3. length()方法
l
e
n
g
t
h
(
)
length()
length():返回对象内容的长度。
❗❗❗❗4. toString()方法
t o S t r i n g ( ) toString() toString():将 S t r i n g B u i l d e r StringBuilder StringBuilder类型转换为 S t r i n g String String类型。(非常重要!!)
**背景:**因为在实际的开发中,所有的方法参数基本都是使用 S t r i n g String String类型的,比方说:
public static String fun(String str){
...
}
这个方法的入参就是 S t r i n g String String类型,并且出参也是 S t r i n g String String类型,这个时候传入一个 S t r i n g B u i l d e r StringBuilder StringBuilder类型就会显得非常的奇怪。所以在实际的情况中, S t r i n g String String类型用交流的媒介, S t r i n g B u i l d e r StringBuilder StringBuilder类型用于当想要操作 S t r i n g String String类型时,进行操作的一个操作空间。
💥💥💥简而言之:所有的 S t r i n g B u i l e r StringBuiler StringBuiler类型进行增删改查操作的时候直接操作就好了,但是进行传参等操作的时候,必须转换成 S t r i n g String String类型!
示例:
//整体的思想就是字符串操作就使用StringBuilder在这个空间中进行操作
//但是传入方法的时候就换为String进行传参
StringBuilder sb2 = new StringBuilder();
sb2.append("123").append("456");
// 恢复成String类型
String rs = sb2.toString();
check(rs);
//入参为String类型的check方法
public static void check(String data){
System.out.println(data);
}
内存原理
那么为什么需要大费周章的放到
S
t
r
i
n
g
B
u
i
l
d
e
r
StringBuilder
StringBuilder类型这个空间中进行操作呢?
因为节省资源!!
首先先说明
S
t
r
i
n
g
String
String类型的+
的底层逻辑:
public class Test{
public static void main(String[] args) {
String s1 = "a";
String s2 = s1 + "b";
String s3 = s2 + "c";
}
}
上面这段代码最后表现出的结果就是s3 = "abc"
但是内部的运行逻辑实际非常的复杂并且繁琐。
首先将方法载入到栈内存中:
首先现在字符串常量池中放入a
,并且让s1
指向a
。完成了s1
的赋值。之后读取到s2
,首先会生成一个StringBuilder
对象在堆内存中,然后进行加操作得到ab
,之后在堆内存中生成一个String
类型的数据,然后使用StringBuilder
的toString
方法,将ab
赋值给堆中的String
,最后s2
进行指向该String
。s3
同理。
堆中情况:
一句话:明面调用一次+
,在内存中会产生两个对象,本质的原因是String
类型直接进行操作在底层也还是转换为StringBuilder
进行操作。(浪费内存空间)
所以索性直接使用StringBuilder
,在堆内存中产生一个对应的StringBuilder
对象进行操作也就完啦!!
总结
S t r i n g B u i l d e r StringBuilder StringBuilder:可以理解为特殊的字符串,有很多的字符串操作方法,非常灵活(支持链式编程!),是 S t r i n g String String类型操作底层逻辑实现容器,可以节约很多的内存资源!!