Java性能优化-01-字符串优化

我们都知道Java中的字符串String是不可变类,不可变意味着线程安全;在项目实战中,线程安全是第一位,然后考虑性能优化...实际开发项目中,原则是:先功能,后性能...意味着实现正确功能是第一优先级,功能逻辑正确情况下,考虑性能优化....String在项目实战过程中是使用最多的类,下面我们学习一下常见的String优化点。

1-String类自身优化

在Java语言中,工程师们对String对象做了大量的优化,来节约内存空间,提升String对象在系统中的性能。一起来看看优化过程,如下图所示:

从Java7版本开始到Java8版本,Java对String类做了一些改变。String类中不再有offset和count两个变量了。这样的好处是String对象占用的内存稍微少了些,同时,String.substring方法也不再共享char[],从而解决了使用该方法可能导致的内存泄漏问题。

从Java9版本开始,工程师将char[]字段改为了byte[]字段,又维护了一个新的属性coder,它是一个编码格式的标识。

一个char字符占16位,2个字节。这个情况下,存储单字节编码内的字符(占一个字节的字符)就显得非常浪费。JDK1.9的String类为了节约内存空间,于是使用了占8位,1个字节的byte数组来存放字符串。

2-使用优化

2.1-字符串拼接

使用StringBuilder来提升系统性能...虽然使用Java编译器内部也会优化

       StringBuilder strb=new StringBuilder("");
        List<String> list= Arrays.asList("hello","java","world");
        for (String s : list) {
            strb.append(s).append("-");
        }
        log.info("strb={}",strb.toString());

2.2-String.intern

在字符串常量中,默认会将对象放入常量池;在字符串变量中,对象是会创建在堆内存中。如果调用intern方法,会去查看字符串常量池中是否有等于该对象的字符串,如果没有则在常量池中新增该对象,并返回该对象引用;如果有,则返回常量池中的字符串。堆内存中原有的对象由于没有引用指向它,将会通过垃圾回收器回收。

        String str1 =new String("hello,world").intern();
        String str2 = new String("hello,world").intern();
        if(str1==str2){
            log.info("str1==str2");
        }

项目实际情况中:可以考虑使用String.intern方法减少内存使用。

2.3-字符串的分割方法

慎重使用String.split()方法,我们可以用String.indexOf()方法代替String.split(方法完成字符串的分割。原因:String.split()方法使用了正则表达式实现了其强大的分割功能,而正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题,很可能导致CPU居高不下。

String.split()有两种情况不会使用正则表达式:

第一种:传入的参数长度为1,且不包含“.$|()[{^?*+\\”regex元字符的情况下,不会使用正则表达式;

第二种:传入的参数长度为2,第一个字符是反斜杠,并且第二个字符不是ASCII数字或ASCII字母的情况下,不会使用正则表达式。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值