Java基础进阶笔记 - Day01 - 第四章 StringBuilder类
Java基础进阶笔记 - Day01 - 第四章 StringBuilder类
系统:Win10
JDK:1.8.0_121
IDE:IntelliJ IDEA 2017.3.7
4.1 字符串拼接问题
由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。例如:
public class StringDemo01 {
public static void main(String[] args) {
String str = "Hello";
str = str + "World";
System.out.println(str);
}
}
在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改
根据这句话分析我们的代码,其实总共产生了三个字符串,即 “Hello”、“World” 和 “HelloWorld” 。引用变量str首先指向 Hello 对象,最终指向拼接出来的新字符串对象,即 HelloWorld
由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用java.lang.StringBuilder类
4.2 StringBuilder概述
查阅java.lang.StringBuilder的API,StringBuilder又可称可变字符序列,它是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容
原来StringBuilder是个字符串缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。
它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。原理如下图:(默认16字符: char[16] 空间大小,超过自动扩充)
4.3 构造方法
根据StringBuilder的API文档,常用的构造方法有2个:
- public StringBuilder():构造一个空的StringBuilder容器
- public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去
public class StringDemo02 {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
System.out.println("sb1:" + sb1);
StringBuilder sb2 = new StringBuilder("StringBuilderDemo");
System.out.println("sb2:" + sb2);
}
}
运行结果:
4.4 常用方法
StringBuilder常用的方法有3个:
- public StringBuilder append(…):添加任意类型数据的字符串形式,斌返回当前对象自身
- public StringBuilder reverse():将当前StringBuilder对象进行反转
- public String toString():将当前StringBuilder对象转换为String对象
append方法
append方法具有多种重载形式,可以接收任意类型的参数。任何数据作为参数都会将对应的字符串内容添加到StringBuilder中。例如:
public class StringDemo03 {
public static void main(String[] args) {
// 创建对象
StringBuilder stringBuilder1 = new StringBuilder();
StringBuilder stringBuilder3 = new StringBuilder();
// public StringBuilder append(任意类型)
StringBuilder stringBuilder2 = stringBuilder1.append("hello");
// 对比一下
System.out.println("stringBuilder1:" + stringBuilder1); // hello
System.out.println("stringBuilder2:" + stringBuilder2); // hello
System.out.println(stringBuilder1 == stringBuilder2); // true
System.out.println("=========================");
// 可以添加任何类型
stringBuilder1.append("world");
stringBuilder1.append(false);
stringBuilder1.append(12345);
/*
在我们开发过程中,会遇到调用一个方法后,返回一个对象的情况。然后使用返回的对象继续调用方法
这种时候,我们就可以把代码写在一起,如append方法一样,代码如下
*/
stringBuilder3.append("hello").append("world").append(true).append(678910);
System.out.println("stringBuilder1:" + stringBuilder1); // helloworldfalse12345
System.out.println("stringBuilder3:" + stringBuilder3); // helloworldtrue678910
}
}
运行结果:
备注:StringBuilder已经覆盖重写了Object类当中的toString方法
reverse方法
通过reverse方法,可以将StringBuilder对象进行反转
public class StringDemo04 {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("HelloWorld");
System.out.println(sb1);
System.out.println(sb1.reverse());
System.out.println(sb1);
}
}
运行结果:
toString方法
通过toString方法,StringBuilder对象将会转换为不可变的String对象,如:
public class StringDemo05 {
public static void main(String[] args) {
// 链式创建
StringBuilder sb1 = new StringBuilder("Hello").append("World");
// 调用方法
String str = sb1.toString();
System.out.println(str); // HelloWorld
}
}
运行结果: