Java笔记3.1--关于String的JVM问题

从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

猜你喜欢

转载自blog.csdn.net/lfanchenyu/article/details/107647212