Java性能调优之字符串优化

一、String类以及变量char[]被final修饰,为什么String对象是不可变的?

        1.保证String对象的安全性,防止被恶意修改;

        2.使hash值不会频繁变更,确保唯一性,使类似hashmap容器才能实现key-value缓存;

        3.可以实现字符串常量池。

        我们创建字符串对象有两种方式:1.String str = "123";jvm在会检查对象是否在常量池中存在,如果存在则返回对象的引用,否则在常量池中创建该对象,这种方式可以减少对象的创建节约内存;2.String str = new ("123");jvm会在常量池中创建"123",接着调用String构造方法创建String对象并引用"123"常亮,最后str引用String对象。

        当你重新给str赋值,例如:str = new String("456");时,str的确实改变了,但是改变的只是对象的引用,"123"对象依然存在,并没有改变。

二、构建超大字符串

        在拼接字符串时,String str = "a" + "b";会编译被编译成:

String str = (new StringBuilder(String.valueOf("a"))).append("b").toString();

        我们发现每回拼接字符串都会创建一个StringBuilder 实例,如果大量拼接的话会非常影响性能。所以在做字符串拼接时使用StringBuilder来操作比较好。

        如果有大量并发的情况下,可以使用StringBuffer来确保线程安全,但是这样会涉及到锁的竞争,影响性能。

三、使用 String.intern 节省内存

         为什么1跟2不相等而3跟4相等呢?

        在运行时,1跟2是创建在堆内存中的两个不同的对象,所以他们不相等。而3跟4在运行时会在堆内存中创建对象,String对象中的char数组会直接引用常量池中的字符串。而在调用intern()方法后,会去常量池检查是否有等于该字符串引用存在,如果有则直接返回引用。而堆内存中的对象,由于没有引用指向它,则会被垃圾回收。

        因此,3跟4是同一个对象。使用intern可以减少对象的创建,节省空间。

四、字符串的分割方法

        split方法是正则表达式,而正则表达式的性能不稳定,使用不当会引起回溯问题。因此,在条件允许的情况下,可以使用String.indexOf() 方法代替 Split() 方法完成字符串的分割。如果不行,则要重视回溯问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值