javaindexof效率_java性能优化——字符串优化处理
作者:傲然青眼
String对象
String对象是java中重要的数据类型,在⼤部分情况下我们都会⽤到String对象。其实在Java语⾔中,其设计者也对String做了⼤量的优化⼯作,这些也是String对象的特点,它们就是:不变性,常量池优化和String类的final定义。
1.1 不变性
String对象的状态在其被创建之后就不在发⽣变化。为什么说这点也是Java设计者所做的优化,在java模式中,有⼀种模式叫不变模式,了解的童鞋也应该知道不变模式的作⽤:在⼀个对象被多线程共享,⽽且被频繁的访问时,可以省略同步和锁的时间,从⽽提⾼性能。⽽String的不变性,可泛化为不变模式。java的tostring方法
1.2 常量池优化
常量池优化指的是什么呢?那就是当两个String对象拥有同⼀个值的时候,他们都只是引⽤了常量池中
的同⼀个拷贝。所以当程序中某个字符串频繁出现时,这个优化技术就可以节省⼤幅度的内存空间了。例如:
以上代码中,s1和s2引⽤的是相同的地址,故⽽第四⾏打印出的结果是true;⽽s3虽然只与s1,s2相等,但是s3时通过new String("123")创建的,重新开辟了内存空间,因引⽤的地址不同,所以第5⾏打印出false;intern⽅法返回的是String对象在常亮池中的引⽤,所以最后⼀⾏打印出true。
1.3 final的定义 String类以final进⾏了修饰,在系统中就不可能有String的⼦类,这⼀点也是出于对系统安全性的考虑。
字符串操作中的常见优化⽅法
2.1 split()⽅法优化 通常情况下,split()⽅法带给我们很⼤的⽅便,但是其性能不是很好。建议结合使⽤indexOf()和subString()⽅法进⾏⾃定义拆分,这样性能会有显著的提⾼。
2.2 String常量的累加操作优化⽅法 ⽰例代码:
结果:
上例所⽰,使⽤+号拼接字符串,其效率明显较低,⽽使⽤StringBuffer和StringBuilder的append()⽅法进⾏拼接,效率是使⽤+号拼接⽅式的百倍甚⾄千倍,⽽StringBuffer的效率⽐StringBuilder低些,这是由于StringBuffer实现了线程安全,效率较低也是不可避免的。所以在字符串的累加操作中,建议结合线程问题选择,应避免使⽤+号拼接字符串。
2.3 StringBuffer和StringBuilder的选择 上例中也使⽤过StringBuffer和StringBuilder了,两者只有线程安全⽅⾯的差别,所以呢,在⽆需考虑线程安全的情况下,建议使⽤性能相对较⾼的StringBuilder类,若系统要求线程安全,就选择StringBuffer类。
2.4 基本数据类型转化为String类型的优化⽅案
⽰例代码:
以上⽰例中,String.valueOf()直接调⽤了底层的String()⽅法,不过其中会先判空;+""由StringBuilder实现,先调⽤了append()⽅法,然后调⽤了toString()⽅法获取字符串;String()直
接调⽤了String()⽅法,所以效率是:String()⽅法最快,其次是String.valueOf(num),最后是num+""的⽅式。以下是结果截图:
建议童鞋们避免使⽤+""的⽅式转换,最好是使⽤基本数据类型⾃带的toString()⽅法转换。就先分享到这⼉吧
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论