字符串存储的内存原理
-
直接赋值会复用字符串常量池中的
-
new出来的不会复用,而是开辟一个新的空间
==号比较的到底是什么
-
基本数据类型比较数据值
-
引用数据类型比较地址值
字符串拼接的底层原理
-
拼接的时候没有变量都是字符串,触发字符串的优化机制,在编译的时候就已经是最终的结果。
public class Test{
public static void test(String[]args){
String s="a"+"b"+"c";
System.out.println(s);
}
}
在拼接时有变量,jdk8以前底层会使用StringBuilder
public class Test{
public static void test(String[]args){
String s1="a";
String s2=s1+"b";
String s3=s2+"c";
System.out.println(s3);
}
}
jdk8字符串拼接的底层原理
public class Test{
public static void test(String[]args){
String s1="a";
String s2="b";
String s3="c";
String s4=s1+s2+s3;
System.out.println(s4);
}
}
先预估字符串的长度然后建立一个数组,将内容放入数组中之后,将这个数组变成字符串。
字符串拼接的时候有变量参与:在内存中创建了很多对象浪费空间,时间也非常慢。
结论:
如果很多字符串常量拼接,不要直接+,在底层会创建多个对象,浪费时间,浪费性能。
StringBuilder提高效率原理图
public class Test{
public static void main(String[]args){
StringBulider sb=new StringBuilder();
sb.append("a");
sb.append("b");
sb.append("c");
System.out.println(sb);
}
}
StringBuilder是一个内容可变的一个容器。
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存。
StringBuilder源码分析
-
默认创建一个长度为16的字节数组
-
添加的内容长度小于16,直接存
-
添加的内容大于16会扩容(原来的容量*2+2=34)
-
如果扩容之后还不够,以实际长度为准
package StringBuilderDemo; public class StringBuilderDemo05 { public static void main(String[] args) { StringBuilder sb=new StringBuilder(); //容量:最多装多少 //长度:已经装了多少 System.out.println(sb.capacity());//16 System.out.println(sb.length());//0 sb.append("abc"); System.out.println(sb.capacity());//16 System.out.println(sb.length());//3 sb.append("abcdefghijklmnopqrstuvwxyz"); System.out.println(sb.capacity());//34 System.out.println(sb.length());//26 sb.append("abcdefghijklmnopqrstuvwxyz0123456789"); System.out.println(sb.capacity());//36 System.out.println(sb.length());//36 } }