目录
程序开发过程中,我们常常碰到字符串连接的情况,方便和直接的方式是通过"+"符号来实现,但是如果要多次拼接我们往往会选择使用StringBuilder 这是为什么?
1.String和StringBuilder的区别
- String类表示不可变字符串对象(在jdk8 及以前内部定义了 final char[] value 用于存储字符串数据。jdk9 时改为 final byte[] value。),即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
- StringBuilder类代表可变字符串对象,底层用char[] value数组存储字符串数据。
2.String字符串的拼接操作
1.常量与常量的拼接结果在常量池。
2.只要拼接的双方其中有一个是变量 (常量不算,即final修饰的变量不算),就需要在堆空间创建一个 StringBuilder对象。
public class Test1 {
public static void main(String[] args) {
String str = "a";
String str1 = "aa";
String str2 = "a"+"a";
System.out.println(str1== str2);//true
String str3 =str1 +"a";
System.out.println(str1== str3);//false
}
}
我们可以看到在执行str3的拼接操作的时候底层先创建了 StringBuilder对象,那既然底层字符串拼接都已经使用StringBuilder完成了 我们为什么还要学习StringBuilder呢? 请看下面这个例子
3.当我们需要多次进行拼接字符串操作的时候。
public class Test2 {
public static void main(String[] args) {
String str = "a";
String str1 = "a"+str;
str1 = str1+"b";
str1 = str1+"c";
}
}
我们可以看到在底层它一共创建了3个StringBuilder对象,最后通过toString创建新的 String对象这样即耗时,又浪费空间。所以如果要进行大量的字符串拼接操作我们会选择使用StringBuilder。
4.我们来对比一下拼接字符串10000次使用“+”和StringBuilder的耗时。
public class Test2 {
public static void main(String[] args) {
String str = "a";
String str1="" ;
long t1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str1+="a";
}
long t2 = System.currentTimeMillis();
System.out.println("使用+拼接共耗时:"+(t2-t1)+"毫秒");
StringBuilder list = new StringBuilder();
long t3 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
list.append("a");
}
long t4 = System.currentTimeMillis();
System.out.println("使用StringBuilder共耗时:"+(t4-t3)+"毫秒");
}
}
使用+拼接共耗时:45毫秒
使用StringBuilder共耗时:0毫秒
3.StringBuilder的常见方法
public class Test2 {
public static void main(String[] args) {
StringBuilder list = new StringBuilder();
list.append("aa"); //添加元素
list.append("aa");
list.append("aa");
list.append("aa");
list.toString();//返回一个内容相同的字符串
list.delete(0, 2);//删除起始位置(含)到结尾位置(不含)之间的字符串
}
}
(仅是学习梳理如有问题 ----->菜鸡可互啄,大佬轻点锤 )