本期经验和建议的总结:
在拼接字符串的时候,如果大量拼接时建议使用StringBuilder,在转为字符串。
1:Java的==号比较的原理:
在Java中,==号在对基本数据类型进行比较时,比较的时具体的数值大小例如double,int之流。
在针对引用数据类型的比较中,我们发现比较的是引用数据类型的地址是否相同,所以我们在比较引用数据类型的对象是否相等时,基本上要使用equals方法,在这里我们记得要重写equals方法。
2:字符串的拼接原理
在这里我们分成两种情况来讲,分别是常量直接的拼接和变量加常量的拼接
常量的直接拼接:
举例子:
在这里我们使用常量进行的拼接,他会直接在串池里进行拼接出现,如果串池里有现成的就复用,而不是直接新建。举个例子和代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
String a="a"+"b"+"c";
String b="abc";
String c="a"+"b"+"c";
System.out.println(a==b);
System.out.println(b==c);
System.out.println(a==c);
}
}
我们可以清楚的看到,字符串a拼接在串池里留下了abc,而b等于abc,由于也是常量拼接,所以直接复用串池的abc,字符串c的也是同理,他们会看看串池里是否有已经出现abc,已经出现就直接复用,为出现就自己开一块内存进行存储。
继续看以上字符串d就是abd之前未在串池留下,无法复用,所以==号比较地址的时候地址不同,返回false,而之前的哪个等于号比较地址返回true就是说明他们的地址相同,这也证实了我们的字符串复用的观点。
变量的拼接:
变量的拼接就是直接地址不同了,在这里简单来聊一下拼接的底层处理过程吧。
在jdk8以前的版本,使用字符串变量的拼接
String d="abd";
String e=d+"12";
过程中,他会首先在底层内存中首先开一个StringBuilder,然后将数据在这个字符串容器中进行拼接,之后再开一个字符串对象返回这个字符串对象。我们可以看到在jdk8以前字符串的拼接是耗时耗力的。那JDK8以后呢?
在JDK8以后,不在直接开StringBuilder的对象了,而是直接在内存中开一个数组,来预估要拼接的字符串的大小,返回一个新的字符串。我们看到,在这里空间开销变小了,但是预估拼接的字符的大小仍然要花费大量的时间(多个拼接),所以使用+号拼接效率不高。
所以在处理时建议使用StringBuilder。
3:StringBuilder的存储拼接字符的原理
首先,它StringBuilder默认的存储容量是16,存储16个字符,一旦超过16这个数,他会开到34,但是超过34就是直接你存储的字符是多少位,它就开多少位了。