弱鸡作者:文章的内容不是很难,请仔细阅读,文末也有重要的知识点
这三个类之间的区别主要在两个方面,即运行速度和线程安全这两个方面:
- 运行速度快慢方面:StringBuilder > StringBuffer > String
- 在线程安全上,StringBuilder 是线程不安全的,而 StringBuffer 是线程安全的
在运行速度方面,因为 String 为字符串常量,而 StringBuilder 和 StringBuffer 为字符串变量, 即 String 对象一旦创建之后是不可改变的。每一次 string 都是在堆内存中开辟新的空间。
对于这些堆栈模型比较难以理解的,可以暂时简单的理解,StringBuilder 和 StringBuffer 的对象是变量,对变量进行操作就是直接对该对象进行更改。而不是创建新的对象。
String 中文文档
StringBuilder 中文文档
StringBuffer 中文文档
由于在算法题目中,比较经常用到这三个中的 StringBuilder 。这里讲解一下 StringBuilder 的简单用法
- 创建 StringBuilder 对象
StringBuilder strA = new StringBuilder(); //创建字符串对象,strA字符串内容为空
StringBuilder strB = new StringBuilder("0"); //可以理解为初始化,strB字符串内容为 0
- append:字符串拼接
strB.append("1");
System.out.println(strB);
控制台输出结果为:
01
- toString:这个字符串序列的字符串表示
System.out.println(strB.toString());
控制台输出结果为:
01
返回表示此顺序中的数据的字符串。 新的String
对象被分配并初始化以包含此对象当前表示的字符序列。 然后返回String
。 此序列的后续更改不影响String
的内容。
- length:返回长度(字符数)
StringBuilder strB = new StringBuilder("0");
strB.append("1222");
System.out.println(strB);
System.out.println("======");
if (strB.length()>2) {
System.out.println("ERROR");
}
控制台的输出结果为:
01222
=====
ERROR
- setLength 设置字符序列的长度
StringBuilder strB = new StringBuilder("0");
strB.append("1222");
System.out.println(strB);
System.out.println("======");
strB.setLength(3);
System.out.println(strB);
控制台的输出结果为:
01222
=====
012
以上就是 StringBuilder 的简单用法,关于更多用法,可以去查看文档。
- StringBuilder 的长度问题
StringBuilder strB = new StringBuilder("0");
strB.append("1222");
strB.setLength(10);
System.out.print(strB);
System.out.print("end");
控制台的输出结果为:
01222 end
这时候可以简单的看出来,当 strB
的字符长度小于 setLength
的长度时,会用空格来填充,以满足长度的设置,如果 strB
的长度大于 setLength
的长度时,则会从截取所设置的长度
文章结尾来填坑了,关于线程的问题:
《5个步骤,教你瞬间明白线程和线程安全的问题》 传送门
关于 StringBuilder 的长度问题,可以阅读大佬的文章 传送门
还有一个堆栈模型的坑,先留着,我日后来填(滑稽护体)