Object
String对象是java中一个重要的数据类型,我们在大多数情况下都会用到。其实在Java语言中,它的设计者也对String做了大量的优化工作,这也是String对象的特点,即不变性、常量池优化和String类的最终定义。1.1不可变字符串对象的状态在创建后不会改变。为什么这也是java设计师做的优化?在Java模式中,有一种模式叫做不可变模式。懂行的孩子应该也知道不可变模式的作用:当一个对象被多个线程共享并且频繁访问时,可以省略同步和锁定时间,从而提高性能。字符串的不变性可以推广为不变模式。1.2常量池优化常量池优化是什么意思?也就是说,当两个字符串对象具有相同的值时,它们都只是引用常量池中的同一个副本。因此,当程序中频繁出现一个字符串时,这种优化技术可以节省大量内存空。例如:
在上面的代码中,s1和s2指的是同一个地址,所以第四行的打印结果为真;虽然s3只等于S1和S2,但是s3通过新字符串(“123”),内存空重新打开。因为引用的地址不同,第五行打印出falseintern方法返回常量bright池中String对象的引用,所以最后一行打印出true。
1.3 final String类的定义是用final修饰的,所以系统中不能有String的子类,这也是出于系统安全性的考虑。字符串操作中常用的优化方法
2.1 split()方法优化通常情况下,split()方法给我们带来了很大的便利,但是它的性能并不是很好。建议结合indexOf()和subString()方法进行自定义拆分,这样性能会有明显提升。
2.2字符串常量累积运算的优化方法示例代码:
结果:
如上例所示,使用+号拼接字符串的效率明显较低,而使用StringBuffer和StringBuilder的append()方法的效率是使用+号的100倍甚至1000倍,而StringBuffer的效率低于StringBuilder。这是因为StringBuffer实现了线程安全,低效率是不可避免的。所以在串积累的操作中,建议结合线程问题,避免使用+号拼接串。
2.3 StringBuffer和StringBuilder的选择在上面的例子中,已经使用了string buffer和StringBuilder,它们之间只有线程安全上的区别。所以在不考虑线程安全的情况下,建议使用性能相对较高的StringBuilder类。如果系统要求线程安全,选择StringBuffer类。
2.4将基本数据类型转换为字符串类型的优化方案
示例代码:
上例中String.valueOf()直接调用底层Integer.toString()方法,但会先判断空;+””由StringBuilder实现,先调用append()方法,再调用toString()方法获取字符串;Num.toString()直接调用Integer.toString()方法,所以效率是:num.toString()方法最快,其次是String.valueOf(num),最后是num+””的方式。以下是结果截图:
童鞋建议避免使用+””最好使用基本数据类型附带的toString()方法。先分享到这里吧!!!
本文来自暗夜殘星投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/618831.html