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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值