1.如何构建超大字符串
在字符串拼接使用+号时,会被编译器优化成StringBuilder的方式。但是编译器优化的代码中,每次循环都会生成一个新的StringBuilder实例,同样也会降低系统性能。
所以平时做字符串拼接时,还是建议显示的使用StringBuilder来提升性能。
如果在多线程编程中,String对象的拼接涉及到线程安全,也可以使用StringBuffer。但是要注意,由于StringBuffer是线程安全的,涉及到锁竞争,所以从性能上来说,要比StringBuilder差一些。
2.使用 String.intern 节省内存
每次赋值的时候使用String的intern方法,如果常量池中有相同值,就会重复使用该对象,返回对象引用,这样一开始的对象就可以回收掉。
在字符串常量中,默认会将对象放入常量池;在字符串变量中,对象是会创建在堆内存中,同时也会在常量池中创建一个字符串对象,复制到堆内存对象中,并返回堆内存对象引用。
如果调用intern方法,会去查看字符串常量池中是否有等于该对象的字符串,如果没有,就在常量池中新增该对象,并返回该对象引用;如果有,就返回常量池中的字符串引用。堆内存中原有的对象由于没有引用指向它,将会通过垃圾回收器回收。
3.如何使用字符串的分割方法
Split()方法使用了正则表达式实现了分割功能,而正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题,很可能导致CPU居高不下。
所以要慎重使用Split()方法,可以使用String.indexOf()方法代替Split()方法完成字符串的分割。如果实在无法满足需求,就在使用Split()方法时,对回溯问题加以重视。
参考资料:阿里巴巴Java性能调优实战(2021华山版)