从String入手,了解不可变类的技能
从常量和变量角度,入门JVM里的堆和常量池
从String角度,分析JVM性能调优的措施
常量和变量:
equals比较值,==比较地址
new出来的是变量
常量可以共享内存,变量不会
常量连接还是常量,有变量参与是变量
public class StringDemo {
public static void main(String[] args){
String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); //true
System.out.println(a==b);//true
String c = new String("abc");
System.out.println(a==c);//false
String d = "a" + "bc";
System.out.println(a==d);//true
final String e = "a";//有final算常量,没有则算变量
String f = e + "bc";
System.out.println(f==a); //有final是true没有是false
}
}
new出来的变量放在堆中,常量放在常量池,相同的值共享内存。用final定义的是常量,放常量池。JVM内存优化是针对堆区。
String是不可变类:
String引用指向的内存值是不可变的,而是指向新的内存空间,由此产生内存碎片,频繁操作会产生大量内存碎片,增加JVM负担。
如果想要对String频繁操作,可以用StringBuilder和StringBuffer。
StringBuilder线程不安全(单线程时最好用这个,效率高)
StringBuffer线程安全
关于String的JVM调优:
值相同的常用共享内存,能用常量的尽量用常量。
new出来的是放堆中
尽量避免String以及其他不可变类的频繁操作(对String的任何操作都会新创建一个对象)JDK内部自带的很多不可变类:Interger、Long和String等基本类型的包装类
如果频繁对String操作,可用StringBuilder或者StringBuffer