- 推荐使用String直接量赋值
Java为了避免在一个系统中大量产生String对象(为什么会大量产生?因为String字符串是程序中最经常使用的类型),于是就设计了一个字符串池(也有叫做字符串常量池,String Pool或String Constant Pool或String Literal Pool),在字符串池中所容纳的都是String字符串对象,他的创造机制是这样的:创建一个字符串时,首先检查池中是否有字面值相等的字符串,如果有,则不再创建。直接返回池中该对象的引用,若没有则创建之,然后放到池中,并返回新建对象的引用。
String类是一个不可变(Immutable)对象其实有两层意思:一是String类是final类,不可继承,不可能产生一个String的子类;二是在String类提供的所有方法中,如果String返回值,就会新建一个String对象,不对原对象进行修改,这也就保证了原对象是不可改变的。
Java的每个对象都保存在堆内存中,但是字符串池非常特殊,他在编译期已经决定了其存在JVM的常量池(Constant Pool),垃圾回收器是不会对他进行回收的。
- 注意方法中传递的参数要求
注意:replaceAll传递的第一个参数是正则表达式。
- 正确使用String、StringBuffer、StringBuilder
在不同的场景下使用不同的字符序列:
1、使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算等。
2、使用StringBuffer类的场景:在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装等。
3、使用StringBuilder类的场景:在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼接、JSON封装等。
- 注意字符串的位置
Java对加号的处理机制:在使用加号进行计算的表达式中,只要遇到String字符串,则所有的数据都会转换为String类型进行拼接,如果是原始数据,则直接拼接,如果是对象,则调用toString方法的返回值然后拼接。
注意:在“+”表达式中,String字符串具有最高优先级。
- 自由选择字符串拼接方法
字符串拼接方式中,append方法最快,concat方法次之,加号最慢。
1、“+”方法拼接字符串:虽然编译器对字符串的加号做了优化,他会使用StringBuilder的append方法进行追加,按道理来说,其执行时间也应该是0毫秒,不过他最终是通过toString方法转换成String字符串的。
注意:他与纯粹使用StringBuilder的append方法是不同的:一是每次循环都会创建一个StringBuilder对象,二是每次执行完毕都要调用toString方法将其转换为字符串。
2、concat方法拼接字符串:就是一个数组拷贝,虽然在内存中的处理都是原子性操作,速度非常快,不过,注意最后的return语句,每次的concat操作都会新创建一个String对象。
3、append方法拼接字符串:都在做字符数组处理,加长,然后数组拷贝,这些都是基本的数据处理,没有新建任何对象,所以速度也就最快了!
三者的实现方法不同,性能也就不同,但并不表示我们一定要使用StringBuilder,这是因为“+”非常符合我们的编码习惯,适合人类阅读,两个字符串拼接,就用加号连一下,这很正常,也很友好,在大多数情况下我们都可以使用加号操作,只有在系统性能临界(如在性能“增之一分则太长”的情况下)的时候才可以考虑使用concat或append方法。而且,很多时候系统80%的性能是消耗在20%的代码上的,我们的精力应该更多的投入到算法和结构上。
- 推荐在复杂字符串操作中使用正则表达式
正则表达式在字符串的查找、替换、剪切、复制、删除等方面有着非凡的作用,特别是面对大量的文本字符需要处理()如需要读取大量的LOG日志时,使用正则表达式可以大幅的提高开发效率和系统性能。
- 强烈建议使用UTF编码
注意:一个系统使用统一的编码。
- 对字符串排序持一种宽容的心态
Arrays工具类的默认排序是通过数组元素的compareTo方法来进行比较的。
对于非英文的String排序可能会出现不准确的情况,Java推荐使用Collator类进行滚排序。
如果是排序对象是经常使用的汉字,使用Collator类排序完全可以满足我们的要求,毕竟GB2312已经包含了大部分的汉字,如果需要严格排序,则要使用一些开源项目来自己实现了,比如pinyin4j可以把汉字转换为拼音,然后我们自己来实现排序算法,不过此时你也会发现要考虑诸如算法、同音字、多音字等众多问题。
注意:如果排序不是一个关键算法,使用Collator类即可。